接受用于填充`url_for`方法的URL参数是否安全?
我正在使用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
方法的URL参数是否安全? 什么是陷阱? 在最坏的情况下会发生什么?
通过在对我的应用程序的请求期间记录params
,我注意到Rails 总是添加:controller
和action
参数。 也许确认url_for
可以使用上面的方式,因为它在内部受到保护并且像Rails一样工作。
这在内部是安全的,因为Ruby On Rails只会发出HTTP重定向响应 。
当您使用only_path
这将保护您免受Open redirect漏洞的攻击。 这是攻击者发送包含以下格式链接的电子邮件的地方(例如您的站点是example.com
)。
https://example.com?foo=bar&bar=foo&redirect=http://evil.com
当用户检查URL并看到它在example.com
域上时,他们相信它是安全的,因此请单击该链接。 但是,如果有一个打开的重定向,那么用户最终会在evil.com
上找到他们可能会在没有用户注意的情况下输入他们的example.com
密码。
仅在您的站点上重定向到相对路径可修复任何漏洞。
在您的情况下,您可以让用户控制您的控制器,操作和参数。 只要您的GET方法是安全的 (即没有副作用),攻击者就无法通过创建用户打开的精心设计的链接来使用它。
总之,从提供的信息中我看不到网络钓鱼URL对您的应用程序的任何风险。
Rails redirect_to
将HTTP状态代码设置为302 Found
,告诉浏览器GET
url_for
定义的新路径。 GET
相反, GET
被认为是一种安全的方法
… POST,PUT,DELETE和PATCH等方法适用于可能导致服务器副作用或外部副作用的操作……
唯一的问题是如果有人可以访问诸如create
和destroy
。 由于这些方法使用除GET
之外的HTTP方法(分别是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有许多安全措施 ,您可能也会对此感兴趣。
这不是一个答案,只是想指出你不应该使用类似的东西
url_for(params)
因为一个人可以将host
和port
作为params传递,因此url可能会导致另一个站点,如果它被缓存或其他东西可能会变得更糟。
不知道它是否有任何威胁,但是,嘿,值得指出