我知道rails默认从rails3开始提供CSRF保护。
但我的Web应用程序是单页应用程序,所有通信都依赖于ajax。
那么,如何在每次 ajax 调用之前从服务器获取 CSRF 令牌?
或者我能做的就是取消 CSRF 保护,对吗?
注意:我们不使用任何 Rails 视图来生成网页,甚至是主页,因此解决方案将“”放入 .html 或 .erb 中无效.,我们在一个页面内使用javascript框架。
我的环境:rails3.2.3、devise2.0.4、dojo1.7.2
我建议你看看Rails-骨干 https://github.com/codebrew/backbone-rails项目。具体来说backbone_rails_sync.js https://github.com/codebrew/backbone-rails/blob/master/vendor/assets/javascripts/backbone_rails_sync.js#L21-L31 file.
它展示了这个 gem 如何将 CSRF 令牌数据以及您向服务器发出的任何 ajax 请求一起发送。
另外,这里还有一些Django 项目的文档 https://docs.djangoproject.com/en/1.3/ref/contrib/csrf/#ajax这为您提供了如何覆盖默认 jQuery ajax() 方法以始终发送 CSRF 令牌的示例。
根据评论更新:
所以你问的是如何在只使用 REST API 并且不以任何方式使用视图/表单的情况下实现 CSRF。
答案是:不包括 CSRF 保护.
跨站请求伪造 https://en.wikipedia.org/wiki/CSRF是另一个(恶意)网站复制或模仿请求并冒充有效用户并向服务器发送无效数据的一种方式。
仅当用户需要进行身份验证并且身份验证状态保存在缓存中(以在页面视图之间保留)时,这才会出现问题。如果恶意网站劫持了该缓存,它就可以冒充该用户提交数据,而用户和服务器都不会注意到这一点。这就是 CSRF 保护的作用,它会在表单中注入一个特殊的字符串,该字符串仅对该特定请求有效,并且对于每个其他请求都是唯一的,因此即使会话被劫持,CSRF 保护也会阻止对会话进行任何修改。服务器。
然而,就您而言,您正在使用 HTTP API 调用,因此必须通过使用Authorization header
。这样,凭证就不会被缓存,也不会被劫持,因此不需要 CSRF 保护。
不过,还有其他方法可以确保您的 RESTful API 的安全:
- 始终以加密形式通过线路发送数据 (https/ssl)
- 使用良好的身份验证方法,例如 oAuth(2)、API 令牌或基本 HTTP 身份验证(后两个安全性较差,但对于较小的应用程序来说仍然足够安全)
- 在对应用程序执行操作之前,始终检查进入应用程序的每个值
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)