• CSRF


    CSRF

    • CSRF全拼为Cross Site Request Forgery,译为跨站请求伪造。CSRF指攻击者盗用了你的身份,以你的名义发送恶意请求。CSRF能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账......造成的问题包括:个人隐私泄露以及财产安全。
    • CSRF示意图如下

    • 如果想防止CSRF,首先是重要的信息传递都采用POST方式而不是GET方式,接下来就说POST请求的攻击方式以及在Django中的避免

    示例

    • 攻击过程的操作了解即可,不需要重现
    • 打开booktest/views.py文件,创建视图csrf
    def csrf1(request):
        return render(request,'booktest/csrf1.html')
    def csrf2(request):
        title=request.POST.get('title')
        return HttpResponse(title)
    

      

    • 打开booktest/urls.py文件,配置url
        url(r'^csrf1/$', views.csrf1),
        url(r'^csrf2/$', views.csrf2),
    

      

    • 在templates/booktest/目录下创建csrf1.html
    <html>
    <head>
        <title>CSRF</title>
    </head>
    <body>
    <form method="post" action="/csrf2/">
        <input type="hidden" name="title" value="100">
        <input type="submit" name="提交">
    </form>
    </body>
    </html>
    

      

    • 启动运行服务器,采用IP的方式,因为要演示其它IP的请求
    python manage.py runserver 192.168.196.131:8000
    

      

    • 回到windows中,在浏览器中输入如下网址,将这个标签称为网站A
    http://192.168.196.131:8000/csrf1/
    
    • 浏览效果如下图

    • 下面使用windows中的IIS服务器模拟另外一个网站,创建csrf.html,复制templates/booktest/csrf1.html内容,并修改action路径
    <html>
    <head>
        <title>CSRF</title>
    </head>
    <body>
    <form method="post" action="http://192.168.196.131:8000/csrf2/">
        <input type="hidden" name="title" value="100">
        <input type="submit" name="提交">
    </form>
    </body>
    </html>
    

      

    • 在windows中浏览器查看效果如下图,将这个标签称为网站B

    • Django项目中默认启用了csrf保护,现在先禁用,打开test4/settings.py文件,注释掉csrf中间件

    • 点击游览器的第一个标签即网站A,点击“提交”按钮后如下图

    • 点击游览器的第二个标签即IIS网站B,点击“提交”按钮后如下图

    • 对比上面两张图,发现无论从网站A还是网站B都可以访问网站A的csrf2视图,这就是不安全的

    防止CSRF

    • Django提供了csrf中间件用于防止CSRF攻击,只需要在test4/settings.py中启用csrf中间件即可

    • 回到windows浏览器中,分别在网站A、网站B中点击“提交”按钮,效果一样,如下图:

    • 这下麻烦了,因为网站A自己也不能访问了,接下来templates/booktest/csrf1.html内容,在form表单中使用标签csrf_token
    <html>
    <head>
        <title>CSRF</title>
    </head>
    <body>
    <form method="post" action="/csrf2/">
        {%csrf_token%}
        <input type="hidden" name="title" value="100">
        <input type="submit" name="提交">
    </form>
    </body>
    </html>
    

      

    • 回到windows浏览器中,在网站A中点击“提交”按钮,效果如下图:

    • 回到windows浏览器中,在网站B中点击“提交”按钮,效果如下图:

    • 好了,Django中成功完成CSRF防护

    总结

    • 以上的演示过程了解即可,不需要重现,以下的内容是重点,必须记住
    • 重要信息如金额、积分等,采用POST方式传递
    • 启用CSRF中间件,默认启用
    • 在form表单中加入标签csrf_token

    保护原理

    • 了解原理即可
    • 加入标签后,可以查看csrf1的源代码,发现多了一个隐藏域

    • 在浏览器的“开发者工具”中查看cookie信息

    • 说明:当启用中间件并加入标签csrf_token后,会向客户端浏览器中写入一条Cookie信息,这条信息的值与隐藏域控制的value属性是一致的,提交到服务器后会先由csrf中间件进行验证,如果对比失败则返回403页面,而不会进行后续的处理
  • 相关阅读:
    JAVA_集合_作业01
    Java_Objects_hashCode
    Java成员内部类
    Java集合练习_实现购物车需求
    Java初级_单例设计模式
    HelloWorld
    vue中视频标点
    防抖节流?俩者区别?vue如何使用防抖、节流来解决点击问题?
    keep-alive
    axios和ajax的区别
  • 原文地址:https://www.cnblogs.com/yoyo1216/p/10131017.html
Copyright © 2020-2023  润新知