params.merge和跨站点脚本

时间:2012-09-04 20:54:56

标签: ruby-on-rails security xss

我正在使用Brakeman来识别安全问题。它标记了使用params.merge作为跨站点脚本漏洞的任何链接。我该如何清理以下内容?

  - @archives.each do |archive|
    =  link_to "FTP", params.merge(:action => :ftp, :archive => archive, :recipient => "company")

1 个答案:

答案 0 :(得分:17)

您应该仅根据您期望的params元素创建一个新哈希,并希望允许它成为FTP链接的一部分,并使用 来合并您的其他参数。

您所拥有的内容允许我通过修改查询字符串来添加我想要的FTP链接,从而打开安全漏洞的大门。通过构建一个哈希来代替params中的params.merge(...,您可以有效地将预期的查询字符串组件列入白名单,以便在您呈现的模板中使用。


作为GET示例,如果您希望使用

这样的网址
/some/path?opt1=val1&opt2=val2

你可能做的控制器动作

@cleaned_params = { opt1: params[:opt1], opt2: params[:opt2] }
@cleaned_params.merge! action: :ftp, archive: archive, recipient: :company

然后将@cleaned_pa​​rams传递给link_to

=  link_to "FTP", @cleaned_params

这样,如果我手动输入类似

的网址
/some/path?opt1=val1&opt2=val2&maliciousopt=somexss

params[:maliciousopt]永远不会进入您视野中的FTP link_to

同样的行为适用于POST请求,只是为了恶意我可能会在提交之前向表单添加几个字段

<input type="hidden" name="maliciousopt" value="somexss" />