Django之CSRF 机制

在理解Django中的CSRF机制前,可以先补一补基础知识

官网对于CSRF的说明

pythenweb 开发中的csrf机制

CSRF全称

Cross-site request forgery (CSRF)

很简单的一个知识点,就是一个跨站请求伪造保护,看一下官网对于CSRF的说明和csrf机制两篇文章对CSRF机制有个初步理解。

实战
  • CSRF机制的载体Django自带的中间件

知识点部分可能不太理解,下面直接用简单Demo来说明CSRF机制,对应上面两篇指导性文章加深理解。

Django项目中,settings.py 中有这样一段代码

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

说明CSRF是Jdango自带的一个中间件罢了,默认是打开的。

  • csrf代码演示
    在csrfmodule App中views.py 中
def login(request):
    print(request.method)
    if request.method == 'POST':
        return render(request, 'csrf_result_index.html')
    return render(request, 'test_csrf_login.html')

test_csrf_login.html代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>login</title>
    <link rel="stylesheet" href="/static/commons.css">
    <style>
        label {
            width: 80px;
            text-align: right;
            display: inline-block;
        }
    </style>
</head>
<body>
<form action="/csrfmodule/login/" method="post">
    <p>
        <label for="username">用户名:</label>
        <input id="username" name="user" type="text"/>
    </p>
    <p>
        <label for="password">密码:</label>
        <input id="password" name="pwd" type="password"/>
        <input type="submit" value="提交"/>
    </p>
</form>
<script src="/static/jquery3.4.1.js"></script>
</body>
</html>

csrf_result_index.html代码

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

配置csrfmodule的App中urls代码

urlpatterns = [
    path('login/', views.login),  # 分发器
]

运行Django程序

直接点击提交,理论上直接跳转到csrf_result_index.html页面的,看看实际结果。
在这里插入图片描述

先不要一脸懵逼,这就对了。

更改代码test_csrf_login.html,只需要在form标签里面加入一行代码
再次运行Django项目。
在这里插入图片描述
重点来了:看一下这个网页源代码

在form表单里面自动添加了一行隐藏的input标签。

点击提交按钮,效果如下
在这里插入图片描述
其实就是已经正确跳转了的。

👆演示的效果就是CSRF机制,能够实现跨站请求伪造保护,是一个全局性的有一定的安全机制,保护服务器安全

但是:也会有针对性的黑客进行CSRF攻击,这方面参考上面 pythenweb 开发中的csrf机制,CSRF机制也只是部分安全。

如果不想加载这个中间件,但又想用csrf功能,这个时候可以考虑另外的使用方式。注解,对部分【方法、模块】对全局都可以进行拦截。
CSRF使用,含部分拦截使用说明

文章演示代码参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ItJavawfc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值