django 之csrf

http://www.80sec.com/csrf-securit.html

django手册

引用

 http://www.kenshinx.me/archives/262

  1. 如果有form在提交时需要验证token,那么django在打开这个页面时就会在用户的cookie中插入csrftoken记录,csrftoken的生成方式:
hashlib.md5("%s%s"% (randrange(0, 18446744073709551616L),\
                                settings.SECRET_KEY)).hexdigest()

原本我以为Django的Token值是通过sessionid 加一个salt值计算得来的,但是看了django的源码发现并非如此,而是通过一个随机数加salt的方式。好像django 1.1之前也是用的sessionid进行hash,不清楚为什么在django 1.2之后改用随机数的方式。另外这个csrftoken写入cookie的有效期会非常的长

response.set_cookie(settings.CSRF_COOKIE_NAME,\
    request.META["CSRF_COOKIE"], max_age = 60 * 60 * 24 * 7 * 52,\
    domain=settings.CSRF_COOKIE_DOMAIN)
 通过代码看来,这个cookie的有效期有52周,并不会随着session的销毁而注销或变化。

 

    2.  form提交时,会通过隐藏表单的方式提交cookie中的csrftoken记录
<input type="hidden"  value="4dc3a02f858e4bd54b57" name="csrfoken">
  3.  服务器端接到POST请求时,会验证提交的Token和用户cookie中的Token值是否一致,如不一致就返回403错误。

有一点需要注意的,如果使用的是django.middleware.csrf.CsrfViewMiddleware这个中间件,django会默认验证每一个post请求,因此所有的<form>表单内都需要加上csrf_token的tag,否则站内提交也会被阻止,除非通过@csrf_exempt装饰器来显示声明不验证token值。


CSRF token missing or incorrect
--
1 在 templete 中, 为每个 POST form 增加一个 {% csrf_token %} tag. 如下:
<form>
    {% csrf_token %}
</form>
2 在 view 中, 使用 django.template.RequestContext 而不是 Context.
render_to_response, 默认使用 Context. 需要改成 RequestContext.
导入 class:
from django.template import RequestContext
给 render_to_response 增加一个参数:
def your_view(request):
    ...
    return render_to_response('template.html',
          your_data,
          context_instance=RequestContext(request)
    )


你可能感兴趣的:(django 之csrf)