Python - Django - CSRF

CSRF 攻击:

把 settings.py 中的 csrf 注释掉

正规网站:

创建修改密码页面 password.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>修改密码</title>
</head>
<body>

<p>正规网站 - 修改密码页面</p>

<form action="/change_password/" method="post">
    <p>
        用户名:
        <input type="text" name="username">
    </p>
    <p>
        密码:
        <input type="text" name="password">
    </p>

    <input type="submit" value="提交">
</form>

</body>
</html>

urls.py 中的对应关系:

from django.conf.urls import url
from app01 import views

urlpatterns = [
    url(r'^change_password/', views.change_password),
]

views.py:

from django.shortcuts import render, HttpResponse


def change_password(request):
    if request.method == "POST":
        username = request.POST.get("username")
        password = request.POST.get("password")
        print("用户 {} 把密码修改为:{}".format(username, password))
        
        return HttpResponse("密码修改成功!")

    return render(request, "password.html")

访问页面:

点击 “提交”

 

钓鱼网站:

password.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>修改密码</title>
</head>
<body>

<p>钓鱼网站 - 修改密码页面</p>

<form action="http://127.0.0.1:8000/change_password/" method="post">
    <p>
        用户名:
        <input type="text" name="username">
    </p>
    <p>
        密码:
        <input type="text" name="password">
        <input type="text" name="password" value="test1234" style="display: none">
    </p>

    <input type="submit" value="提交">
</form>

</body>
</html>

这里用隐藏的 password 把密码修改成指定的 test1234

urls.py:

from django.conf.urls import url
from app01 import views

urlpatterns = [
    url(r'^change_password/', views.change_password),
]

views.py:

from django.shortcuts import render


def change_password(request):
    return render(request, "password.html")

访问页面:

点击 “提交”

跳转到:http://127.0.0.1:8000/change_password/,并显示修改成功

密码被修改为 test1234,而不是 111111

 

CSRF 防护:

将 settings.py 中的注释取消

此时钓鱼页面再发送请求的话就会不受理

也可以更保险一点:

修改正规网站的 password.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>修改密码</title>
</head>
<body>

<p>正规网站 - 修改密码页面</p>

<form action="/change_password/" method="post">
    {% csrf_token %}
    <p>
        用户名:
        <input type="text" name="username">
    </p>
    <p>
        密码:
        <input type="text" name="password">
    </p>

    <input type="submit" value="提交">
</form>

</body>
</html>

在 form 表单中添加了一条 {% csrf_token %}

访问该 url:

添加了隐藏的 csrf 内容校验,每次的值都会不同

 

posted @ 2019-08-03 16:43  Sch01aR#  阅读(234)  评论(0编辑  收藏  举报