我正在使用Brakeman来识别安全问题。它会标记任何params.merge
用作跨站点脚本漏洞的链接。如何对以下内容进行消毒?
- @archives.each do |archive|
= link_to "FTP", params.merge(:action => :ftp, :archive => archive, :recipient => "company")
我正在使用Brakeman来识别安全问题。它会标记任何params.merge
用作跨站点脚本漏洞的链接。如何对以下内容进行消毒?
- @archives.each do |archive|
= link_to "FTP", params.merge(:action => :ftp, :archive => archive, :recipient => "company")
您应该仅基于params
您期望并希望允许成为FTP
链接一部分的元素创建一个新的哈希,并使用它来合并您的附加参数。
您所拥有的允许我通过修改查询字符串向该链接添加任何我想要的内容,从而FTP
打开安全漏洞的大门。通过构建一个用于代替params
in的哈希,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
请求,只是为了恶意我可能会在提交之前向表单添加几个字段
<input type="hidden" name="maliciousopt" value="somexss" />