我目前正在为iphone应用程序构建一个Rails后端。iphone访问特殊控制器,该控制器返回iphone应用程序解析并适当显示的JSON。Rails应用程序确实有一个管理面板,用于为iphone应用程序插入新数据。该身份验证由设计控制。除此之外,不需要复杂的身份验证,因为iphone应用程序不需要任何用户信息即可运行。
这就是我被卡住的地方。我已经添加了一个控制器,用户可以从应用程序提交反馈。反馈将被存储在铁路的数据库。为了做到这一点,我已经关闭了protect_from_forgery
通过使用skip_before_filter :verify_authenticity_token, :only => [ :create ]
控制器方法。但是,我知道这样做会产生安全问题。我也明白,我必须根据这个答案和这个答案创建自定义保护(例如令牌)。我的网页搜索只找到了如何使用设计或通过Oauth来做到这一点,但正如我提到的,iphone没有用户身份验证。我只想填补这个安全漏洞,除非我遗漏了什么。我很难找到任何关于这种特殊情况的文章。
默认情况下,启用:protect_from_forgery
的Rails应用程序在关于页面的<meta>
信息中包含一个真实性令牌,如下所示:
<meta content="arBBP614zvMxug9+5ozHakrXhAaTNmQ9aBJ/Ehp3nl8=" name="csrf-token">
您需要做的是下载表单的一个普通的旧html副本,并打开:protect_from_forgery
,这样就生成了这个标记。然后,一旦你在NSString*
中有了HTML,你可以找到这样的标记:
NSArray* firstArray = [htmlString componentsSeparatedByString:@"" name="csrf-token">"];
NSArray* secondArray = [[firstArray objectAtIndex:0] componentsSeparatedByString:@"<meta content=""];
NSString* authToken = [secondArray objectAtIndex:1];
那么你只需要发送authToken
作为X-CSRF-Token
报头字段。这些通常不会经常更改,因此您可以保留一份副本一段时间。
最后我选择了一个标记。我设置控制器以使用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应用的新版本,但这样我就可以更好地控制发生的事情。