1

我目前正在为 iphone 应用程序构建 Rails 后端。iphone 访问特殊控制器,该控制器返回 iphone 应用程序解析并适当显示的 JSON。Rails 应用程序确实有一个管理面板,用于为 iphone 应用程序插入新数据。该身份验证由设计控制。除此之外,无需进行复杂的身份验证,因为 iphone 应用程序不需要任何用户信息即可运行。

这是我卡住的地方。我添加了一个控制器,用户可以在其中提交来自应用程序的反馈。该反馈将存储在 Rail 的数据库中。为了做到这一点,我已经关闭protect_from_forgery了使用skip_before_filter :verify_authenticity_token, :only => [ :create ]该控制器方法。但是通过这样做,我知道这会产生安全问题。我也明白我必须根据这个答案这个答案创建自定义保护(例如令牌)。我的网络搜索只找到了如何使用 Devise 或通过 Oauth 执行此操作,但正如我所提到的,iphone 没有用户身份验证。我想做的就是打开这个安全漏洞,除非我遗漏了什么。我很难找到任何关于这种特殊情况的文章。

4

2 回答 2

0

默认情况下,带有:protect_from_forgeryon 的 Rails 应用程序在有关页面的信息中包含一个真实性令牌<meta>,如下所示:

<meta content="arBBP614zvMxug9+5ozHakrXhAaTNmQ9aBJ/Ehp3nl8=" name="csrf-token">

你需要做的是下载你的表单的一个普通的旧 html 副本,:protect_from_forgery打开,这样就生成了这个标签。然后,一旦您在 a 中拥有该 HTML,NSString*您就可以像这样找到令牌:

    NSArray* firstArray = [htmlString componentsSeparatedByString:@"\" name=\"csrf-token\">"];
    NSArray* secondArray = [[firstArray objectAtIndex:0] componentsSeparatedByString:@"<meta content=\""];
    NSString* authToken = [secondArray objectAtIndex:1];

然后你只需要authToken作为X-CSRF-Token标题字段发送。这些通常不会经常更改,因此您可以保留一份副本一段时间。

于 2013-01-15T04:44:53.890 回答
0

我最终想出了一个我选择的令牌。我设置控制器以使用before_filter. 然后用 SSL 锁定它。

before_filter :has_token?, only: :create
skip_before_filter :authenticate_user!, :verify_authenticity_token, only: :create

这是我用来检查令牌的方法:

def has_token?
  if request.request_parameters[:token] == "SECRET"
    true
  else
    head :unauthorized
  end
end

然后令牌被硬编码到 iPhone 应用程序中,并与它发送到 Rails 后端的参数一起传递。我知道这意味着如果该令牌必须更改,我必须发布新版本的 iPhone 应用程序,但这样我可以更好地控制正在发生的事情。

于 2013-01-18T17:06:44.350 回答