Rails中的区域设置开关导致url参数被丢弃

时间:2018-01-10 06:39:46

标签: ruby-on-rails internationalization locale rails-i18n

直到最近,我一直在使用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)或者我是否需要重新处理我的应用程序的大块来解决这个问题?

1 个答案:

答案 0 :(得分:1)

您可以创建一种方法来对参数进行白名单和清理:

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,这比没有好,但可能仍然容易受到精心设计的攻击。<​​/ p>