我的大部分GET请求都是由角触发的,这使得在标头中设置CSRF令牌变得很容易。这已经为POST请求提供了现成的服务,但是我想知道我是否也可以对GET请求使用CSRF保护。
我最初的直觉是在视图的get方法之前添加@csrf_protect
,例如:
class ProjectView(View):
@csrf_protect
def get(self, request, *args, **kwargs):
...
但是,这会产生错误:
AttributeError at /project
'ProjectView' object has no attribute 'COOKIES'
File "c:\Apps\msysgit\simpletask\lib\site-packages\django\middleware\csrf.py" in process_view
95. request.COOKIES[settings.CSRF_COOKIE_NAME])
因此,我猜想POST请求提供了一些GET请求没有提供的东西。有更好的方法吗?
另外,在有人提到所有敏感信息都应该通过POST请求(最近我见过几次)之前,我尝试坚持GET的原因是我试图按照RESTful准则构建,这意味着GET请求是用于提取数据,POST用于新记录,PUT用于更新,DELETE用于数据删除。
编辑
由于似乎有一种情绪,我不应该尝试上述,虽然我现在有点同意,我试图防止的利用在以下三个链接中讨论:
发布于 2013-04-02 04:23:07
我觉得你不太明白CSRF到底保护了什么。CSRF利用站点在用户浏览器中的信任;利用会话cookie允许攻击者代表用户运行命令。
站点信任请求,因为它还没有过期浏览器的会话cookie。这就是为什么在大多数CSRF缓解技术中,为每个具有副作用的请求生成一个独特的OTP。攻击者不知道为OTP生成的密钥,因此无法伪造合法请求。
对于所有有副作用的URL(如POST、PUT、DELETE),您都需要CSRF。对于GET,它没有任何意义,因为GET请求--如果您正确地执行REST ----应该是幂等的--如果多次运行,它们返回相同的结果,并且不会产生任何副作用。
CSRF保护不能防止中间攻击中的信息泄露或人为攻击。因此,如果您有要保护的敏感信息,请使用HTTPS。若要防止不受管制地使用API,请使用身份验证和授权。
发布于 2013-04-02 04:07:19
您需要使用method_decorator
https://docs.djangoproject.com/en/1.4/topics/class-based-views/#decorating-the-class
所以你的代码
class ProjectView(View):`
@method_decorator(csrf_protect)
def get(self, request, *args, **kwargs):
然而,编辑只检查POST请求(它有‘`if request.method ==’帖子‘),所以您必须自己实现一些东西。
https://stackoverflow.com/questions/15754424
复制相似问题