说我有以下内容:
link_to "Excel", params.merge(format: 'xlsx')
Rails 5说,
尝试从未经过清理的请求参数生成URL!攻击者可以将恶意数据注入生成的URL,例如更改主机。白名单和清理传递的参数是安全的。
我想我不明白这是不安全的。任何人都可以在浏览器中输入他们想要的任何内容,无论如何都要对我的服务器执行GET请求。有什么区别?
我知道我可以使用permit!
来解决这个问题我想要了解的是清理我的参数所做的事情。
答案 0 :(得分:7)
您应该查看来自OWASP和Rails itself的文档。
通过使用permit
,您有机会禁止设置您不希望传递给url帮助程序的属性。
请考虑以下链接,指向您的网站,来自Twitter帖子:
http://example.com/your/action?host=phishingscam.example&path=login
如果您的代码看起来像这样,那么您就遇到了麻烦:
link_to 'View Something', params.merge(format: 'xlsx')
现在链接转到:
http://phishingscam.example/login.xlsx
攻击网站phishingscam.example可以将内容类型设置为text/html
,并呈现一个看起来像您的登录表单的页面。刚刚访问过您网站并点击查看您网站上某些内容的用户认为他们已退出并需要重新登录。现在,我们的攻击者拥有用户凭据,并且可以将其重定向回适当的链接,用户完全不知道发生了什么。
这是一个简单的场景。事情很快就会变得复杂。您应该read the Rails security guide了解更多信息。
答案 1 :(得分:1)
简单方法:
如果您有这样的事情:
link_to title, params.merge(:sort => column, :direction => direction, :page => nil), {:class => css_class}
您必须在允许中包含参数。
您可以使用:
link_to title, params.permit(:direction, :page).merge(:sort => column, :direction => direction, :page => nil), {:class => css_class}
瞧!!