Django中的CSRF(跨站请求伪造)
Django CSRF
什么是CSFR
即跨站请求伪装,就是通常所说的钓鱼网站。
钓鱼网站的页面和正经网站的页面对浏览器来说有什么区别? (页面是怎么来的?)
钓鱼网站的页面是由 钓鱼网站的服务端给你返回的
正经网站的网页是由 正经网站的服务端给你返回的
CSFR示例
模拟钓鱼网站中的转账操作
通常用户在正规网站进行转账操作,网页页面由正规网站服务端提供,数据返回到正规网站的服务端,而钓鱼网站页面与正规网站页面无异,但是会将用户输入的数据进行修改后返回到正规网站的服务端。
正规网站的页面代码
<form action="/transfer/" method="post">
<p>
转账人:
<input type="text" name="from">
</p>
<p>
收款人:
<inputtype="text"name="to">
</p>
<p>
金额:
<input type="text" name="money">
</p>
<p>
<input type="submit" value="转账">
</p>
</form>
注意: 正规网站的 form 表单中的action自然是返回给自己
钓鱼网站的页面代码
- <formaction="http://127.0.0.1:8000/transfer/"method="post">
- <p>
- 转账人:
- <input type="text" name="from">
- </p>
- <p>
- 收款人:
- <inputtype="text"name="">
- <inputtype="text"name="to"value="bad_guy"style="display: none">
- </p>
- <p>
- 金额:
- <input type="text" name="money">
- </p>
- <p>
- <input type="submit" value="转账">
- </p>
- </form>
注意:
- 在钓鱼网站的 form 表单中将 action 设置的是正规网站的链接地址。
- 代码的第 9 10 行是关键所在,通过设置一个不可见的 input 标签来更改返回到正规网站服务端的数据。
Django 的应对措施
Django中内置了一个专门处理csrf问题的中间件
django.middleware.csrf.CsrfViewMiddleware
使用方式
在页面上 form 表单里面写上
{% csrf_token %}
例如:
<form action="/transfer/" method="post">
{% csrf_token %}
<p>
转账人:
<input type="text" name="from">
</p>
<p>
收款人:
<input type="text" name="to">
</p>
<p>
金额:
<input type="text" name="money">
</p>
<p>
<input type="submit" value="转账">
</p>
</form>
这个中间件做的事情:
- 在render返回页面的时候,在页面中塞了一个隐藏的input标签
- 当提交POST数据的时候,它帮你做校验,如果校验不通过就拒绝这次请求
csfr添加的隐藏的 input 标签