zoukankan      html  css  js  c++  java
  • 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)

  • 相关阅读:
    python用win32com模拟浏览器
    python判断输入的字符串是否为数字
    phpwind9.0去掉头部版权信息 Powered by phpwind
    Python批量查询网站收录
    结巴分词 python中文分词
    phpwind 9.0 RC版[20121108],伪静态无效的问题
    [转]LINQ: Building an IQueryable provider series
    获取鼠标选择的文本内容之JavaScript代码
    M2级遍历和范围Range
    转:浏览器的用户代理字符串
  • 原文地址:https://www.cnblogs.com/muzinan110/p/5019564.html
Copyright © 2011-2022 走看看