Rails 中的区域设置切换导致 url 参数被删除

Locale switch in Rails causing url params to be dropped

直到最近,我一直在使用 params.merge 来处理这个问题,但我收到了一个 XSS 漏洞的警报,需要找到一种更好的方法来处理区域设置切换。大多数页面现在完全没问题,但某些网址会有我需要保留的参数,例如:

movies/123456/seat?ticket_id=1670&locale=en&time_type=2

区域设置开关现在在导航栏中的处理方式如下:

<li><%= link_to "English", locale: "en" %></li>

不幸的是,切换语言环境(EG;到日语)会导致以下结果:

movies/123456/seat?locale=ja

有什么方法可以保留参数(无需像以前那样使用 params.merge),或者我是否需要重新处理应用程序的大部分内容才能解决此问题?

您可以创建一个方法来将参数列入白名单并清理参数:

module ParamsHelper
  def merge_and_santize_params(*whitelist)
     params.permit(*whitelist)
           .transform_values! { |v| sanitize v }
           .merge(locale: I18n.current_locale)
  end
end

<li><%= link_to "English", merge_and_santize_params(:time_type, :ticket_id) %></li>

这使用了 ActionView::Helpers::SanitizeHelper,总比没有好,但仍然容易受到精心设计的攻击。