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

时间:2015-02-04 15:04:32

标签: ruby-on-rails ruby security ruby-on-rails-4 url-for

我正在使用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添加始终 :controlleraction参数。也许确认url_for可以使用上述方式,因为它在内部受到保护并且像Rails一样工作。

3 个答案:

答案 0 :(得分:0)

Rails redirect_to将HTTP状态代码设置为302 Found,告诉浏览器GET url_for定义的新路径。GET。与

相比,create被视为safe method
  

...用于POST,PUT,DELETE和PATCH等方法   可能导致服务器或外部副作用的操作   副作用......

如果有人可以访问destroyGET等方法,唯一的问题就是。由于这些方法使用POST以外的HTTP方法(分别为DELETEGET),因此应该没问题。

另一个危险是,如果你超越了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)

因为可以将hostport作为参数传递,因此网址可能会导致另一个网站,如果它被缓存或其他内容可能会变得更糟。

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