好了,现在我会给它一个答案来回答你的问题。
CSRF令牌是“会话相关”,这意味着用户必须与他正在与之通信的应用程序共享会话。这意味着必须在提交实际表单之前提出请求,这是在提交表单之前显示表单的标准HTML表单的情况,因此有足够空间为此用户生成CSRF标记。
让我们调用服务于UI按钮App1的应用程序和托管REST服务App2的应用程序。
用户与App1共享会话并获取App1提供的UI按钮。一旦用户点击该按钮,就向App1发出请求,并且App1向App2的REST服务发出请求。
结论:用户不会与App2共享会话,但您的App1与App2有会话。最后有两件事:
用户不容易受到App2上的跨站点伪造攻击,因为他在该服务器上没有会话。因此,如果我在这里发布类似<img src="http://app2.com/rest-service/destroy>
的内容,App2不会识别我,因为我不会与App2共享会话,也不会发生任何事情。
可以实现对REST服务自己的保安措施,公众将其固定:由主要的API
-
这意味着你可以在REST服务下降的CSRF保护和留在S AFE侧只要用户无法通过AJAX等直接调用
加成
CSRF保护您的网站从不是来自你的出身提交的表单(实际上这适用于已发布表单只因为他们通常操纵数据。
最大的情况是:我是攻击者,我想更新您的用户帐户名称为“Mr. Potatoe”,我会这样做的方式是在我的网站上放置隐藏表单,到Yourdomain.com/account
与隐藏字段如account[name]="Mr. Potatoe"
。现在没有CSRF保护会发生什么?我的浏览器提交表单,并发送认证cookie,我的名字现在是“Mr. Potatoe”。 CSRF保护会发生什么?我的浏览器提交表单并发送cookie,但表单没有CSRF令牌,因此请求被拒绝。在这种情况下,攻击者是否有办法获得CSRF令牌?答案是不。也许你会问自己....
现在让我们切入正题:我无法发送从我的页面隐藏AJAX调用你的伤害你的用户是谁在我的网站。
这是什么意思?您可以实现一个before过滤器,用于检查request.xhr?
是否为true或用户代理是否类似“我的REST客户端XY”,因为这不能由>>浏览器< <中的跨站请求伪造。所以如果是这种情况,你可以忽略/禁用CSRF保护。
通过,如果你想使你的网站内的AJAX请求就可以获得CSRF方式令牌是这样的:
var token = $('meta[name="csrf-token"]').attr('content');
见的Rails UJS脚本:https://github.com/rails/jquery-ujs/blob/master/src/rails.js#L81
注意:这仅仅保护你从跨网站伪造,没有别的......
是两个应用程序的后端之间的通信还是有可能为“前端”用户直接调用REST功能? – sled 2012-02-04 14:56:00
UI调用一个按钮操作,这又会导致控制器将此调用发送到REST服务。控制器的 – Sam 2012-02-04 16:22:15
您的意思是应用程序A的轨道控制器向应用程序B的控制器发出请求? – sled 2012-02-04 17:40:28