我正在使用Ruby on Rails 4.1.1,我正在考虑接受直接传递给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_for
方法的网址参数是否安全?什么是陷阱?在最坏的情况下会发生什么?
通过在对我的应用程序的请求期间记录params
,我注意到Rails添加始终 :controller
和action
参数。也许确认url_for
可以使用上述方式,因为它在内部受到保护并且像Rails一样工作。
答案 0 :(得分:0)
Rails redirect_to
将HTTP状态代码设置为302 Found
,告诉浏览器GET
url_for
定义的新路径。GET
。与
create
被视为safe method
...用于POST,PUT,DELETE和PATCH等方法 可能导致服务器或外部副作用的操作 副作用......
如果有人可以访问destroy
和GET
等方法,唯一的问题就是。由于这些方法使用POST
以外的HTTP方法(分别为DELETE
和GET
),因此应该没问题。
另一个危险是,如果你超越了REST的CRUD方法,并且有一个自定义方法,响应resources something do
member do
get :my_action
end
end
和会改变数据库状态:
<强>的routes.rb 强>
def my_action
# delte some records
end
<强> SomethingController 强>
{{1}}
以备参考:
Rails有一些security measurements,你可能也会感兴趣。
答案 1 :(得分:0)
这在内部是安全的,因为Ruby On Rails只会发出HTTP redirect response。
当您使用only_path
时,这将保护您免受Open redirect漏洞的攻击。这是攻击者发送包含以下格式的链接的电子邮件(例如您的网站为example.com
)。
https://example.com?foo=bar&bar=foo&redirect=http://evil.com
当用户检查网址并看到它位于example.com
域名时,他们就是安全的,所以请点击该链接。但是,如果有一个打开的重定向,那么用户最终会evil.com
,这可能会在用户没有注意到的情况下询问他们的example.com
密码。
仅在您的网站上重定向到相对路径可修复任何漏洞。
在您的情况下,您可以让用户控制您的控制器,操作和参数。只要您的GET方法为safe(即没有副作用),攻击者就无法通过创建用户打开的精心设置链接来使用此方法。
总之,根据提供的信息,我不会发现网络钓鱼网址对您的应用程序造成任何风险。
答案 2 :(得分:0)
这不完全是一个答案,只是想指出你不应该使用像
这样的东西url_for(params)
因为可以将host
和port
作为参数传递,因此网址可能会导致另一个网站,如果它被缓存或其他内容可能会变得更糟。
不知道它是否有任何威胁,但嘿,值得指出