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程序
Django之CSRF 机制_第1张图片

直接点击提交,理论上直接跳转到csrf_result_index.html页面的,看看实际结果。
Django之CSRF 机制_第2张图片

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

更改代码test_csrf_login.html,只需要在form标签里面加入一行代码
再次运行Django项目。
Django之CSRF 机制_第3张图片
重点来了:看一下这个网页源代码
Django之CSRF 机制_第4张图片

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

点击提交按钮,效果如下
Django之CSRF 机制_第5张图片
其实就是已经正确跳转了的。

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

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

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

文章演示代码参考

你可能感兴趣的:(Python)