接受用于填充`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 总是添加:controlleraction参数。 也许确认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等方法适用于可能导致服务器副作用或外部副作用的操作……

唯一的问题如果有人可以访问诸如createdestroy 。 由于这些方法使用除GET之外的HTTP方法(分别是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有许多安全措施 ,您可能也会对此感兴趣。

这不是一个答案,只是想指出你不应该使用类似的东西

 url_for(params) 

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

不知道它是否有任何威胁,但是,嘿,值得指出