Cha*_*rts 3 django csrf django-csrf
我使用django作为我的后端做了一些移动应用程序,现在我正在开发一个chrome扩展程序.我希望我的用户能够使用app/extension将POST请求发送到服务器,但有没有办法在没有首先向服务器请求CSRF令牌的情况下执行此操作?它只是保存应用程序每次我们想要提交数据时发出两个请求.例如,我想在我的社交媒体应用上更新我的个人资料或从Chrome扩展程序更新钱包.打开配置文件视图输入数据并将其推送到服务器会很不错.如果我必须打开配置文件,然后等待它从服务器获取令牌然后我可以提交数据,它就不那么光滑了.还有另一种方法吗?或者我每次想要提交数据时都会发出多个请求?
此外,一点点澄清,CSRF阻止网站提交包含用户数据的表单.但是什么阻止我创建一个使用ajax或其他东西的网站来获取真实网站并窃取CSRF令牌然后将其粘贴到我的跨站点请求表单中?我觉得这里有一个漏洞.我知道我一直都不太了解这一点.
您可以而且应该使任何API端点CSRF免除.
Django csrf_exempt为此提供了装饰器,请参阅https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#django.views.decorators.csrf.csrf_exempt.
此外,CSRF旨在防止通过GET请求伪造执行意外操作.它并不是为了使自动化系统无法提交表单,而是为此提供了验证码.
至于什么阻止你使用AJAX来抓取整个网站并提取令牌就是所谓的同源策略.这是由浏览器实现的,当AJAX调用的目标是没有设置正确标头的不同域时,阻止任何AJAX调用返回数据.(我不完全确定有关这个的chrome扩展应用了什么沙箱).因此,它将或者至少应该无法通过AJAX获取普通网站的数据,例如个人资料页面.如果您想与第三方网站进行互动,您应该考虑他们是否提供API.