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跨站请求伪造的主要内容,如果未能解决你的问题,请参考以下文章

CSRF跨站请求伪造

Django--CSRF 跨站请求伪造

CSRF跨站请求伪造

跨站请求伪造CSRF原理

对CSRF(跨站请求伪造)的理解

21)django-csrf(跨站请求伪造)