csrf跨站请求伪造
Posted 天高任我飞
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了csrf跨站请求伪造相关的知识,希望对你有一定的参考价值。
问题:
1.钓鱼网站的页面和正经网站的页面对浏览器来说有什么区别? (页面是怎么来的?)
钓鱼网站的页面是由钓鱼网站的服务端给你返回的
正经网站的网页是由正经网站的服务端给你返回的
2.Django中内置了一个专门处理csrf问题的中间件
django.middleware.csrf.CsrfViewMiddleware
当在settings中关闭它时,在页面上提交form表单时,不会进行校验。
当开启它时,在页面上提交form表单时,会生成特殊的字符串进行校验
这个中间件做的事情:
1.在render返回页面的时候,在页面中塞了一个隐藏的input标签
用法:我们在页面上form表单里面写上
{ % csrf_token %}
会生成下面的标签,每次请求时,得到的值都不相同。如果打开csrf后,在form表单里不写{ % csrf_token %},请求会执行不了
< input type = "hidden" name = "csrfmiddlewaretoken" value = "8gthvLKulM7pqulNl2q3u46v1oEbKG7BSwg6qsHBv4zf0zj0UcbQmpbAdijqyhfE" >
2. 当你提交POST数据的时候,它帮你做校验,如果校验不通过就拒绝这次请求
转账问题,当csrf关闭时
<h1>正经网站</h1> <form action="/transfer/" method="post"> #提交后执行transfer函数 <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> 转账函数: def transfer(request): if request.method=="POST": person_from=request.POST.get("from") person_to=request.POST.get("to") person_money=request.POST.get("money") ret="{} 给 {} 转了 {}钱".format( person_from,person_to,person_money) print(ret) return HttpResponse("转账成功") return render(request,"transfer.html")
<h1>钓鱼网站</h1> <form action="http://127.0.0.1:8000/transfer/" method="post"> #提交后,执行正经网站的转账函数 <p>转出: <input type="text" name="from"> </p> <p>转入: <input type="text" name=""> #这个输入会在页面显示,但是不会给后端,实际给都后端的是下面隐藏的这个标签 <input type="text" name="to" style="display: none" value="jerd"> #不管输入的是谁,都会把钱转给jerd </p> <p>金额: <input type="text" name="money"> </p> <p> <input type="submit" value="转账"> </p> </form> 将正经网站设置为8000端口,钓鱼网站设置8888端口,在钓鱼网站上输入,会通过正经网站转账成功 小单 给 jerd 转了 10000000钱
转账问题,打开csrf
<h1>正经网站</h1> <form action="/transfer/" method="post"> #提交后执行transfer函数 {% csrf_token %} 打开csrf后,不使用它,会拒绝请求 查看页面元素,页面会生成,每次刷新,值都会变化。提交后,会把这个值传给后端,后端根据这个值的正确性,判断是不是钓鱼网站 <input name="csrfmiddlewaretoken" type="hidden" value="ieDyadHpEkB3zIdzfwbgp6VH1DLQENMt1CkznNpOWX9FOnrPRMfHJdr7S638oKDN"> <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> 再次使用钓鱼网站转账,就拒绝请求
以上是关于csrf跨站请求伪造的主要内容,如果未能解决你的问题,请参考以下文章