2012-09-04 84 views
13

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

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

回答

15

你应该创建一个基于你期望并希望允许在FTP链接的一部分,并使用该合并您的附加参数params仅元素的新哈希值。

你有什么可以让我通过修改查询字符串来添加任何我想要的信息FTP,打开安全漏洞的大门。通过构建一个散列来代替params.merge(...中的params,您可以将预期的查询字符串组件有效地列入白名单,以便在您要呈现的模板中使用。


作为GET例如,如果你希望像

/some/path?opt1=val1&opt2=val2 

您的控制器操作的URL可能会做

@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]将永远不会成为一个网址到您的FTPlink_to在您的视图。

同样的行为适用于POST请求,仅是恶意我可能会在提交

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

由于之前添加几个字段的形式...你可以给我一个例子吗?我真的不明白。 – snowangel

+0

为我更新了我的答案。 – deefour

+0

完全感激 - 谢谢。 – snowangel