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,总比没有好,但仍然容易受到精心设计的攻击。
直到最近,我一直在使用 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,总比没有好,但仍然容易受到精心设计的攻击。