【问题标题】:Locale switch in Rails causing url params to be droppedRails 中的语言环境切换导致 url 参数被丢弃
【发布时间】:2018-01-10 06:39:45
【问题描述】:

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

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)还是需要重新处理我的应用程序的大块来解决这个问题?

【问题讨论】:

  • 我可能应该说这是我第一次访问这个哈哈!不幸的是,当我切换时,我的网址仍然会丢失任何参数。在给定的示例中,当我将鼠标悬停在选项上时,我可以看到“丢失的参数 url”,所以我肯定有问题。
  • 不幸的是,该解决方案还将参数暴露给视图 - 如果我这样做,我可以非常轻松地将 XSS 代码注入我的应用程序。例如,添加seat: params[:seat] 意味着在浏览器中添加/?seat="&gt;&lt;svg%2Fonload%3Dconfirm(%2FXSS-IS-HERE%2F)&gt; 会出现一个讨厌的小弹出窗口。
  • 我会考虑是否可以通过创建更好的路线来解决部分问题。例如:/tickets/1670/seats.

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


【解决方案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,这总比没有好,但仍可能容易受到精心设计的攻击。

【讨论】:

  • 谢谢,这似乎是一个很好的短期解决方案,而我在原始问题的评论中提到了路由更改。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多