django如何防止csrf(跨站请求伪造)

什么是CSRF

下面这张图片说明了CSRF的攻击原理:

Django如何防止CSRF(跨站请求伪造)

 

Django中如何防范CSRF

Django使用专门的中间件(CsrfMiddleware)来进行CSRF防护。具体的原理如下:

1.它修改当前处理的请求,向所有的 POST 表单增添一个隐藏的表单字段,使用名称是 csrfmiddlewaretoken ,值为当前会话 ID 加上一个密钥的散列值。 如果未设置会话 ID ,该中间件将不会修改响应结果,因此对于未使用会话的请求来说性能损失是可以忽略的。

2.对于所有含会话 cookie 集合的传入 POST 请求,它将检查是否存在 csrfmiddlewaretoken 及其是否正确。 如果不是的话,用户将会收到一个 403 HTTP 错误。 403 错误页面的内容是检测到了跨域请求伪装。 终止请求。

该步骤确保只有源自你的站点的表单才能将数据 POST 回来。 

 

另外要说明的是,未使用会话 cookie 的 POST 请求无法受到保护,但它们也不 需要 受到保护,因为恶意网站可用任意方法来制造这种请求。为了避免转换非 HTML 请求,中间件在编辑响应结果之前对它的 Content-Type 头标进行检查。 只有标记为 text/html 或 application/xml+xhtml 的页面才会被修改。

Django防范CSRF的具体操作

1.将'django.middleware.csrf.CsrfViewMiddleware'添加到Djangosettings.py文件中的MIDDLEWARE_CLASSES列表中(默认已经添加)。 该中间件必须在 SessionMiddleware 之后执行,因此在列表中 CsrfMiddleware 必须出现在SessionMiddleware 之前 (因为响应中间件是自后向前执行的)。 同时,它也必须在响应被压缩或解压之前对响应结果进行处理,因此CsrfMiddleware必须在GZipMiddleware之后执行。

 

MIDDLEWARE_CLASSES = (

    'django.middleware.common.CommonMiddleware',

    'django.contrib.sessions.middleware.SessionMiddleware',

    'django.middleware.csrf.CsrfViewMiddleware',

    'django.contrib.auth.middleware.AuthenticationMiddleware',

    'django.contrib.messages.middleware.MessageMiddleware',

    

    # Uncomment the next line for simple clickjacking protection:

    # 'django.middleware.clickjacking.XFrameOptionsMiddleware',

)

 

2.在使用到POST方法提交FORM的页面中,添加csrf_token标签,例如:

<form action="." method="post">{% csrf_token %}

 

3.在相应的view中,确保“django.core.context_processors.csrf” 上下文处理器被正确使用,有两种方法实现这一点,一是使用RequestContext,它内部会自动使用到“django.core.context_processors.csrf”。另一种方法是手动使用这个处理器,示例代码如下:

 

from django.core.context_processors import csrf

from django.shortcuts import render_to_response

 

def my_view(request):

    c = {}

    c.update(csrf(request))

    # ... view code here

return render_to_response("a_template.html", c)

posted @ 2015-12-04 16:04  muzinan110  阅读(2082)  评论(0编辑  收藏  举报