在理解Django中的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使用,含部分拦截使用说明