zoukankan      html  css  js  c++  java
  • web安全问题-csrf

    web安全问题 csrf

    <script>
    document.write(`
        <form name="commentForm" target="csrf" method="post" action="http://localhost:1521/post/addComment">
        <input name="postId" type="hidden" value="13">
        <textarea name="content">来自csrf</textarea>
        </form>
        `
    );
    var iframe = document.createElement('iframe');
    iframe.name = 'csrf';
    iframe.style.display = 'none';
    document.body.appendChild(iframe);
    setTimeout(function(){
        document.querySelector('[name=commentForm]').submit();
    },1000)
    </script>
    
    <img src="http://localhost:1521/ajax/addComment?postId=13&content=123123">
    <a href="http://localhost:1521/ajax/addComment?postId=13&content=123123"></a>
    

    1.原理
    用户登录A网站 - A网站确认身份 - B网站向A网站发起请求(带A网站身份)
    cookie会保留在网页中

    2.CSRF攻击危害

    • 利用用户登录状态 (盗取用户资金 转账消费)
    • 用户不知情 (冒充用户发帖背锅)
    • 完成业务请求 (损坏网站声誉)

    www.a.com前端 <=> www.a.com后端
    www.b.com前端 => www.a.com后端

    B网站向A网站请求带A网站Cookies 不访问A网站前端 refer为B网站

    csrf防御攻击

    1.cookies进行设置 只是chrome支持
    sameSite: 'strict'

    2.在前端页面加入验证信息

    3.验证码 (前后端 图形验证码会降低用户体验)

    4.token 随机字符串

    • 必须经过目标网站前端才能获取token

    token

    var csrfToken = parseInt(Math.random()*999999,10);
    cookies.set('csrfToken',csrfToken);  //放到cookies
    
    this->ajaxReturn('要有token')
    
    前台不用显示 hidden
    
    

    post的时候校验
    post的token 和 cookie里面的token

    如果是ajax请求

    <meta name="csrf_token" content=""> 
    

    js获取之后在后台跟cookies里面的值对比

    用户打开很多窗口 提交在前面的token 只有最后一个表单可以成功提交 token在cookie中只有一个
    解决方法

     $_SESSION['SESSION_KEY.$form_name']
    

    判断refer

    var refer = request.headers.referer
    if(!/^https?//localhost/.test(referer)){
        throw new Error()
    }
    

    php防御CSRF

    1.Cookie sameSite属性

    2.HTTP refer头

    <?php
     //获取referer头
    if($_SERVER['HTTP_REFERER']){
        $isLegal = strpos($_SERVER['HTTP_REFERER'],'http://websecurity.local/') === 0;
        var_dump($isLegal);
    }
    

    3.token 一份给cookie 一份给表单

    $csrfToken = "1231321";
    setcookie('csrfToken',$csrfToken);
    
    $_POST['csrfToken'] $_COOKIE['csrfToken']对比
    
  • 相关阅读:
    学习笔记_2012_4_13垃圾回收原理与String类的学习
    第五篇
    HTML练习代码
    上课第一天base关键字
    第四篇
    firebug使用指南
    HTML5的新特性
    UML建模
    CSS学习总结
    (转载)About me [my way]
  • 原文地址:https://www.cnblogs.com/weizaiyes/p/7723052.html
Copyright © 2011-2022 走看看