欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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">