params.merge 和跨站脚本攻击

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

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

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

17
你应该基于你所期望并希望包含在FTP链接中的params元素创建一个新的哈希表,然后使用来合并你的其他参数。
你现有的方法允许我通过修改查询字符串将任何内容添加到那个FTP链接中,这会导致安全漏洞。通过为params.merge(...中的params构建一个哈希表,你实际上是在为要在渲染模板中使用的预期查询字符串组件设置白名单。
作为一个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" />

实际上在我的这个案例中,我可以简单地删除 params.merge,必需的参数将被顺利传递而不会受到用户的干扰。 - snowangel
8
攻击者只需将一些可接受的参数替换为其恶意脚本,然后无论如何都会将其卡在页面上,是吗? - Vardarac

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接