4

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

4

3 回答 3

2

这在内部是安全的,因为 Ruby On Rails 只会发出HTTP 重定向响应

当您使用only_path它时,它将保护您免受开放重定向漏洞的侵害。这是攻击者发送电子邮件的地方,其中包含以下格式的链接(假设您的网站是example.com)。

https://example.com?foo=bar&bar=foo&redirect=http://evil.com

当用户检查 URL 并看到它在example.com他们认为安全的域上时,请单击该链接。但是,如果有一个开放的重定向,那么用户最终evil.com可能会在用户不注意的情况下询问他们的example.com密码。

仅重定向到您站点上的相对路径可修复任何漏洞。

在您的情况下,您正在让用户控制您的控制器、操作和参数。只要您的 GET 方法是安全的(即没有副作用),攻击者就无法通过创建用户打开的精心制作的链接来使用它。

总之,从提供的信息来看,我没有看到网络钓鱼 URL 对您的应用程序有任何风险。

于 2015-02-05T10:16:57.413 回答
0

Railsredirect_to设置 HTTP 状态码302 Found,告诉浏览器GET你定义的新路径url_forGET被认为是一种安全的方法

... POST、PUT、DELETE 和 PATCH 等方法 [which] 用于可能在服务器上引起副作用或外部副作用的操作...

唯一的问题是,如果有人可以访问诸如create和之类的方法destroy。由于这些方法使用的 HTTP 方法不是GET(分别为POSTDELETE),所以应该没问题。

这里的另一个危险是,如果您超越了 REST 的 CRUD 方法并拥有一个自定义方法来响应GET 更改数据库状态:

路线.rb

resources something do
  member do
    get :my_action
  end
end

东西控制器

def my_action
  # delte some records
end

对于未来的参考:

Rails 有许多您可能也会感兴趣的安全措施。

于 2015-02-04T15:55:50.650 回答
0

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

url_for(params)

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

不知道它是否会威胁到任何东西,但是,嘿,值得指出

于 2015-05-09T09:02:09.263 回答