csrf跨域攻击
程序员文章站
2022-04-18 22:58:05
...
csrf攻击原理
请求响应:
从正规网站上注册信息等等,网站会给用户返回一个csrf_token,当用户注册的信息发送时,会带着csrf_token一起返回,若返回的csrf_token一致,则成功,若不一致,则没有响应。钓鱼网站不会有csrf_token!
实例
1 首先在model中定义一个表结构,打开终端,生成迁移文件:
python manage.py makemigrations
python manage.py migrate
2 刷新数据库:会出现user_user表单
3 设置路由和视图函数(导包):
4 定义html:
5 启动服务,输入register,提交用户密码,返回注册成功,打开表单,存储成功!(在启动时,要将settings中的CSRF注释掉或在html中添加{% csrf_token %})
6 钓鱼网的设置:
将HTML复制一份,修改action,输入网址,ctrl+shift+f10,启动服务,网址地址更换,注册信息仍可以成功!刷新数据库仍可找到
7 把settings中的csrf开启,重启服务,返回403!
8 为了防止正规的网址也出现403,我们在form里添加:
{% csrf_token %}
代码:
1 model
from django.db import models
# Create your models here.
class User(models.Model):
username=models.CharField(max_length=16)
password=models.CharField(max_length=16)
3.路由与视图函数:
path('register',views.register_handler,name='register'),
from django.shortcuts import render,HttpResponse
from user.models import User # 导包
def register_handler(request):
if request.method =='GET':
return render(request,'register.html')
else:
username=request.POST.get('username')
password=request.POST.get('password')
# 实例化对象:
# user= User()
# user.username = username
# user.password = password
# user.save() # 可简写成:
User(username=username,password=password).save()
return HttpResponse('注册成功') # 返回结果视图
4 HTML
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="{% url 'register' %}" method="post">
{% csrf_token %}
username
<input type="text" name="username"><br/>
password
<input type="password" name="password"><br/>
<input type="submit" value="submit">
</form>
</body>
</html>
6 钓鱼网站的设定只有一点不同:
<form action="http://127.0.0.1:8000/register" method="post">