接受 URL 参数来填充 `url_for` 方法是否安全?

Is it safe to accept URL parameters for populating the `url_for` method?

我在 Rails 4.1.1 上使用 Ruby,我正在考虑接受直接传递给 url_for 的参数(通过 URL 查询字符串)方法,这样:

# URL in the browser
http://www.myapp.com?redirect_to[controller]=users&redirect_to[action]=show&redirect_to[id]=1

# Controller
...
redirect_to url_for(params[:redirect_to].merge(:only_path => true))

采用上述方法,用户可以在执行操作后被重定向。但是,我认为人们可以随意输入params,这会导致安全问题...

接受 URL 参数来填充 url_for 方法是否安全?什么是陷阱?在最坏的情况下会发生什么?


通过在请求我的应用程序期间记录 params,我注意到 Rails 添加了 always :controlleraction 参数。也许这证实了 url_for 可以按上述方式使用,因为它在内部受到保护并且可以像 Rails 那样工作。

Rails redirect_to sets the HTTP status code to 302 Found which tells the browser to GET the new path as you defined it by url_for. GET is a considered a safe method 对比

... methods such as POST, PUT, DELETE and PATCH [which] are intended for actions that may cause side effects either on the server, or external side effects ...

唯一的问题 如果有人可以访问 createdestroy 等方法。由于这些方法使用的HTTP方法不是GET(分别是POSTDELETE)所以应该没有问题。

这里的另一个危险是,如果你超越了 REST 的 CRUD 方法,并且有一个自定义方法来响应 GET 更改数据库状态:

routes.rb

resources something do
  member do
    get :my_action
  end
end

SomethingController

def my_action
  # delte some records
end

未来参考:

Rails 有很多 security measurements 可能您也会感兴趣。

这在内部是安全的,因为 Ruby 在 Rails 上只会发出 HTTP redirect response

当您使用 only_path 时,这将保护您免受 Open redirect 漏洞的侵害。这是攻击者发送电子邮件的地方,其中包含以下格式的 link(假设您的站点是 example.com)。

https://example.com?foo=bar&bar=foo&redirect=http://evil.com

当用户检查 URL 并看到它在 example.com 域中时,他们认为它是安全的,因此单击 link。但是,如果有一个开放的重定向,那么用户最终会进入 evil.com,这可能会在用户不注意的情况下要求他们的 example.com 密码。

仅重定向到您网站上的相对路径可修复所有漏洞。

在您的情况下,您让用户可以控制您的控制器、操作和参数。只要您的 GET 方法是 safe(即没有副作用),攻击者就无法通过创建用户打开的特制 link 来使用它。

总而言之,根据所提供的信息,我认为网络钓鱼 URL 对您的应用程序没有任何风险。

这不完全是一个答案,只是想指出你不应该使用类似

的东西
url_for(params)

因为可以将 hostport 作为参数传递,因此 url 可能会导致另一个站点,如果它被缓存或其他东西,情况可能会变得更糟。

不知道它是否威胁到什么,但是嘿,值得指出