首页 > 代码库 > Python之路【第二十二章】:Django 进阶

Python之路【第二十二章】:Django 进阶

CSRF

1、概述

  CSRF(Cross Site Request Forgery)跨站点伪造请求,举例来讲,某个恶意的网站上有一个指向你的网站的链接,如果某个用户已经登录到你的网站上了,那么当这个用户点击这个恶意网站上的那个链接时,就会向你的网站发来一个请求,你的网站会以为这个请求是用户自己发来的,其实呢,这个请求是那个恶意网站伪造的。

  为了避免上面情况的出现,Django引用了CSRF防护机制;Django第一次响应来自某个客户端的请求时,会在服务器端随机生成一个 token,并把这个 token 放在 cookie 里。然后每次 POST 请求都会带上这个 token,这样就能避免被 CSRF 攻击。如果POST请求中没有token随机字符串,则返回403拒绝服务

  • 在返回的 HTTP 响应的 cookie 里,django 会为你添加一个 csrftoken 字段,其值为一个自动生成的 token
  • 在所有的 POST 表单时,必须包含一个 csrfmiddlewaretoken 字段 (只需要在模板里加一个 tag, django 就会自动帮你生成,见下面)
  • 在处理 POST 请求之前,django 会验证这个请求的 cookie 里的 csrftoken 字段的值和提交的表单里的 csrfmiddlewaretoken 字段的值是否一样。如果一样,则表明这是一个合法的请求,否则,这个请求可能是来自于别人的 csrf 攻击,返回 403 Forbidden。
  • 在所有 ajax POST 请求里,添加一个 X-CSRFTOKEN header,其值为 cookie 里的 csrftoken 的值

 

2、Form表单提交POST请求

处理文件:

技术分享
from django.shortcuts import render,HttpResponse,redirect

# Create your views here.
def login(request):
    if request.method == GET:
        return render(request,login.html)
    elif request.method == POST:
        user = request.POST.get(user)
        pwd = request.POST.get(pwd)
        if user == root and pwd == "123":
            # 生成随机字符串
            # 写到用户浏览器Cookie
            # 保存到Session中
            # 在随机字符串对应的字典中设置相关内容...
            request.session[username] = user
            request.session[if_login] = True  #可不加 直接判断username也可以
            if request.POST.get(session) == 1:    #单独设置超时时间,当前session生效,不影响全局
                request.session.set_expiry(10)      #10秒
            return redirect(/index/)
        else:
            return redirect(/login/)

def index(request):
    # 获取当前用户的随机字符串
    # 根据随机字符串获取对应信息
    if request.session.get(if_login):
        return render(request, index.html)
    else:
        return redirect(/login/)
views.py

login.html文件

{# 添加{% csrf_token %} #}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form action="/login/" method="post">
        {% csrf_token %}
        <input type="text" name="user" />
        <input type="text" name="pwd" />
        <input type="checkbox" name="session" value="http://www.mamicode.com/1"/> 保存1个月
        <input type="submit" value="http://www.mamicode.com/提交" />
    </form>
</body>
</html>

 

  

 

Python之路【第二十二章】:Django 进阶