params.merge和跨站点脚本

sno*_*gel 15 security xss ruby-on-rails

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

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

dee*_*our 17

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

你所拥有的东西允许我FTP通过修改查询字符串来添加我想要的任何内容,从而打开安全漏洞的大门.通过建立使用的散列地方paramsparams.merge(...你有效的白名单预计查询字符串组件在模板中使用你的渲染.


作为一个GET例子,如果你希望像一个网址

/some/path?opt1=val1&opt2=val2
Run Code Online (Sandbox Code Playgroud)

你可能做的控制器动作

@cleaned_params = { opt1: params[:opt1], opt2: params[:opt2] }
@cleaned_params.merge! action: :ftp, archive: archive, recipient: :company
Run Code Online (Sandbox Code Playgroud)

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

=  link_to "FTP", @cleaned_params
Run Code Online (Sandbox Code Playgroud)

这种方式,如果我手动输入像这样的URL

/some/path?opt1=val1&opt2=val2&maliciousopt=somexss
Run Code Online (Sandbox Code Playgroud)

params[:maliciousopt]永远不会让它到您FTP link_to在您的视图.

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

<input type="hidden" name="maliciousopt" value="somexss" />
Run Code Online (Sandbox Code Playgroud)

  • 攻击者是否只需用他们的恶意脚本替换一些可接受的params并将其卡在页面中? (7认同)