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']对比
    
  • 相关阅读:
    codeforces C. Fixing Typos 解题报告
    codeforces B. The Fibonacci Segment 解题报告
    codeforces B. Color the Fence 解题报告
    codeforces B. Petya and Staircases 解题报告
    codeforces A. Sereja and Bottles 解题报告
    codeforces B. Levko and Permutation 解题报告
    codeforces B.Fence 解题报告
    tmp
    API 设计 POSIX File API
    分布式跟踪的一个流行标准是OpenTracing API,该标准的一个流行实现是Jaeger项目。
  • 原文地址:https://www.cnblogs.com/weizaiyes/p/7723052.html
Copyright © 2011-2022 走看看