我的html.haml视图上有以下代码:
= link_to params[:returnurl], class: "btn btn-secondary" do
= fa_icon 'chevron-left', class: 'm-r-quarter', text: 'Cancel'
当我运行制动员时,我会收到以下警告:
Confidence: High
Category: Cross-Site Scripting
Check: LinkToHref
Message: Unsafe parameter value in `link_to` href
即使使用了如下所示的sanitize
,它仍然会给我同样的警告:
= link_to sanitize(params[:returnurl]), class: "btn btn-secondary" do
= fa_icon 'chevron-left', class: 'm-r-quarter', text: 'Cancel'
我很困惑为什么我仍然得到它,我该如何解决它。谢谢。
通常没有保险箱来使用传入的参数作为链接的href
的值来创建链接。
想象一下,一个邪恶的代理可以向你的页面发送一个链接,其中returnurl
参数指向一个他们可以从你的用户详细信息中钓鱼的网站,或者returnurl
可以使用javascript:
,然后将用户cookie数据传递到他们的服务器并劫持会话。
您将需要重新考虑此项的设计,这样就没有必要将returnurl
作为参数。理想情况下,你可以从其他信息中推断出来。在用户的会话中存储url是一个模糊的选项,但这仍然可能被利用。
如果您想至少保护javascript:
或类似的不安全值,下面是我在ApplicationHelper
中添加的一个方法,以确保URI方案是http
:
module ApplicationHelper
def safe_url(url)
uri = URI.parse(url)
uri.to_s if uri.is_a?(URI::HTTP)
rescue URI::InvalidURIError
nil
end
end
这不会像Mark Meyer所指的那样保护带有恶意内容的URL,但确实增加了一些保护。