接受 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 :controller
和 action
参数。也许这证实了 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 ...
唯一的问题 是 如果有人可以访问 create
和 destroy
等方法。由于这些方法使用的HTTP方法不是GET
(分别是POST
和DELETE
)所以应该没有问题。
这里的另一个危险是,如果你超越了 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)
因为可以将 host
和 port
作为参数传递,因此 url 可能会导致另一个站点,如果它被缓存或其他东西,情况可能会变得更糟。
不知道它是否威胁到什么,但是嘿,值得指出
我在 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 :controller
和 action
参数。也许这证实了 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 ...
唯一的问题 是 如果有人可以访问 create
和 destroy
等方法。由于这些方法使用的HTTP方法不是GET
(分别是POST
和DELETE
)所以应该没有问题。
这里的另一个危险是,如果你超越了 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)
因为可以将 host
和 port
作为参数传递,因此 url 可能会导致另一个站点,如果它被缓存或其他东西,情况可能会变得更糟。
不知道它是否威胁到什么,但是嘿,值得指出