params.merge和跨站点脚本
我正在使用Brakeman来识别安全问题。 它标记了使用params.merge
作为跨站点脚本漏洞的任何链接。 我如何清理以下内容?
- @archives.each do |archive| = link_to "FTP", params.merge(:action => :ftp, :archive => archive, :recipient => "company")
您应该仅基于您期望的params
元素创建一个新哈希,并希望允许它们成为FTP
链接的一部分,并使用它来合并您的其他参数。
你所拥有的东西允许我通过修改查询字符串来添加我想要的任何FTP
链接,从而打开安全漏洞的大门。 通过构建一个哈希来代替params.merge(...
中的params
params.merge(...
你有效地将预期的查询字符串组件列入白名单,以便在你正在渲染的模板中使用。
作为GET
示例,如果您希望使用类似的URL
/some/path?opt1=val1&opt2=val2
你可能做的控制器动作
@cleaned_params = { opt1: params[:opt1], opt2: params[:opt2] } @cleaned_params.merge! action: :ftp, archive: archive, recipient: :company
然后将@cleaned_params传递给link_to
= link_to "FTP", @cleaned_params
这种方式如果我手动输入类似的URL
/some/path?opt1=val1&opt2=val2&maliciousopt=somexss
params[:maliciousopt]
永远不会进入你视图中的FTP
link_to
。
相同的行为适用于POST
请求,只是恶意我可能会在提交之前向表单添加几个字段