Django的CSRF

本文介绍了CSRF(跨站请求伪造)的概念及其在Django框架中的防护措施。详细讲解了Django如何通过CsrfViewMiddleware中间件在表单中插入动态令牌来确保请求的有效性,并通过实例对比了正经网站与钓鱼网站的工作流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、什么是CSRF

django为用户实现防止跨站请求伪造的功能,通过中间件 django.middleware.csrf.CsrfViewMiddleware 来完成。

2、对于CSRF的为什么出现。

  1. 钓鱼网站的页面和正经网站的页面对浏览器来说有什么区别? (页面是怎么来的?)

    钓鱼网站的页面是由 钓鱼网站的服务端给你返回的
    正经网站的网页是由 正经网站的服务端给你返回的

    Django就是为了放置这一类的钓鱼网站等用途

  2、Django中内置了一个专门处理csrf问题的中间件

          django.middleware.csrf.CsrfViewMiddleware  这个就在我们项目的setting里面的MIDDLEWARE列表里面

    这个中间件做的事情:

      1. 在render返回页面的时候,在页面中塞了一个隐藏的input标签

    用法:
      我们在页面上 form表单 里面 写上 {% csrf_token %}
      <input type="hidden" name="csrfmiddlewaretoken"           

      value="8gthvLKulM7pqulNl2q3u46v1oEbKG7BSwg6qsHBv4zf0zj0UcbQmpbAdijqyhfE">

      这个黄色部位每一次请求都会不一样
  2. 当你提交POST数据的时候,它帮你做校验,如果校验不通过就拒绝这次请求

 

下面就是钓鱼网站的列子:

创建Django项目的时候会自动有这个插件的。我前面写的所有的都把这个注释了这一次就不注释了

正规网站:

路由系统的代码(项目/urls.py)

from django.conf.urls import url
from django.contrib import admin
from app01 import views

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^transfer/$', views.transfer)
]

 

视图里面(app01/views)

from django.shortcuts import render, redirect, HttpResponse
# 转账
def transfer(request):
    if request.method == "POST":
        from_ = request.POST.get("from")
        to_ = request.POST.get("to")
        money = request.POST.get("money")

        print("{} 给 {} 转了 {}钱".format(from_, to_, money))
        return HttpResponse("转账成功!")

    return render(request, "transfer.html")

 

transfer.html代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>



<h1>正经的网站</h1>
<form action="/transfer/" method="post">
      {% csrf_token %}
    <p>
        转出:
        <input type="text" name="from">
    </p>

    <p>
        转入:
        <input type="text" name="to">
    </p>
    <p>
        金额:
        <input type="text" name="money">
    </p>
    <p>
        <input type="submit" value="转账">
    </p>
</form>
</body>
</html>

 

钓鱼网站

路由系统的代码(项目/urls.py)

from django.conf.urls import url
from django.contrib import admin
from app01 import views

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^transfer/$', views.transfer)
]

 

视图里面的代码(app/views)

from django.shortcuts import render

# Create your views here.


def transfer(request):
    return render(request, "transfer.html")

 

transfer.html代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<h1>钓鱼的网站</h1>
<form action="http://127.0.0.1:8000/transfer/" method="post">
    <p>
        转出:
        <input type="text" name="from">
    </p>

    <p>
        转入:
        <input type="text" name="">
        <input type="text" name="to" style="display: none" value="哪吒">
    </p>
    <p>
        金额:
        <input type="text" name="money">
    </p>
    <p>
        <input type="submit" value="转账">
    </p>
</form>
</body>
</html>

 

这个只是做了简单的转账,如果都没有CSRF这个中间件那么我们就会被钓鱼网站这个隐藏的

<input type="text" name="to" style="display: none" value="哪吒">这个插件不管我们填什么转账用户都会转到这个用户里面

当我们有了CSRF的时候这个验证就不会通过,页面就回报403错误。这个就是防止跨站伪造

 

转载于:https://www.cnblogs.com/yang-China/p/9324784.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值