Django – 防止跨站请求伪造

  • A+
所属分类:Python教程 学编程

为了防止我们的网页被跨站伪造请求,Django中内置了csrf_token,具体怎么使用哪?这里就来介绍一下

一、csrf的配置说明

django项目的settings.py文件中,有如下这一行配置(默认就有),用来校验网页上的csrf_token,如果请求服务端的网页上没有csrf_token,那么服务端会认为这个请求是不合理的,会返回403,配置如下:

在settings.py文件里的MIDDLEWARE标签下:

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',                  #默认没有注释(django自带的一个专门处理防止跨站伪造的中间件)
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

二、使用csrf_token

配置有了,那么我们如何在网页上添加csrf_token哪?看下面的代码:

<form action="/transfer/" method="post">
    {% csrf_token %}                         #注意,这个{% csrf_token %} 必须放在form表单的标签里面,这样当每次刷新页面是都会单独生成一个不重复的加密字符串,提交的时候server端会去校验这个加密的字符串,如果没有就会返回403
    <p>转出:
        <input type="text" name="from">
    </p>
    <p>转入:
        <input type="text" name="to">
    </p>
    <p>金额:
        <input type="text" name="money">
    </p>
    <input type="submit" value="转账">
</form>

说明:在上面的form表单里添加上{% csrf_token %}代码.
这个中间件做了什么?

  • 在render返回页面的时候,在页面里塞了一个隐藏的input标签(input标签里加密的字符串)
  • 当你提交POST数据的时候,他帮你做校验,如果校验不通过就拒绝这次请求

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: