Rails 5 - 任何人都可以解释如何从未净化的请求参数生成 URL 是不安全的吗?

Rails 5 - Can anyone explain how generating a URL from non-sanitized request parameters is unsafe?

假设我有以下内容:

link_to "Excel", params.merge(format: 'xlsx')

Rails 5 表示,

Attempting to generate a URL from non-sanitized request parameters! An attacker can inject malicious data into the generated URL, such as changing the host. Whitelist and sanitize passed parameters to be secure.

我想我不明白这是多么不安全。任何人都可以在浏览器中键入他们想要的任何内容,并向我的服务器执行 GET 请求。有什么区别?

我知道我可以使用 permit! 解决这个问题

您应该查看来自 OWASP 和 Rails itself 的文档。

通过使用 permit,您有机会禁止设置您不想传递给 url 助手的属性。

考虑以下 link,指向您的网站,来自 Twitter post:

http://example.com/your/action?host=phishingscam.example&path=login

如果你的代码看起来像这样,你就有麻烦了:

link_to 'View Something', params.merge(format: 'xlsx')

现在 link 转到:

http://phishingscam.example/login.xlsx

攻击网站 phishingscam.example 可以将内容类型设置为 text/html 并呈现一个看起来像您的登录表单的页面。刚才在您网站上并单击查看您网站上的内容的用户认为他们已注销并需要重新登录。现在我们的攻击者拥有用户凭据,并且可以将它们重定向回适当的 link,而用户完全不知道发生了什么。

这是一个简单的场景。事情很快就会变得复杂。你应该read the Rails security guide了解更多。

简单的方法:

如果你有这样的事情:

link_to title, params.merge(:sort => column, :direction => direction, :page => nil), {:class => css_class}

您必须在 permit 中包含参数。

你可以使用这个:

link_to title, params.permit(:direction, :page).merge(:sort => column, :direction => direction, :page => nil), {:class => css_class}

瞧!!