zoukankan      html  css  js  c++  java
  • CSRF的安全问题

    利用场景:后台存在添加管理员的功能,如下:

    进行抓包观察,发现成功抓包

    那么为了防止类似的CSRF攻击的话,肯定需要进行防御措施:

    1、验证请求是否token合法

    2、判断请求的来源是否合法


    token验证:

        <script type="text/javascript">
            function login() {
                var token = "{$token}"
                $.post("/index.php?m=index&a=add", {
                    username: $("#username").val(),
                    password: $("#password").val(),
                    token: token,
                }, function (data) {
                    if (data.status == 1) {
                        window.location.href = data.data.url
                    } else {
                        alert(data.msg)
                    }
                }, 'json');
            }
        </script>
    
    		$username = isset($_POST['username']) ? $_POST['username'] : '';
            $password = isset($_POST['password']) ? $_POST['password'] : '';
    		$token = isset($_POST['token']) ? $_POST['token'] : '';
    
    		if(empty($username)) {$this->json(['status'=>0,'msg'=>'账户不能为空!']);unset($_SESSION['token']);}
            if(empty($password)) {$this->json(['status'=>0,'msg'=>'密码不能为空!']);unset($_SESSION['token']);}
            if(empty($token)) {$this->json(['status'=>0,'msg'=>'token异常!']);unset($_SESSION['token']);}
    
            if($token != $_SESSION['token']){
                $this->json(['status'=>0,'msg'=>'token异常!']);
            }
    
            //防止token重用需要进行删除
            unset($_SESSION['token']);
    

    重新进行抓包,如下,发现添加成功

    如果删除token的话再次测试,添加失败


    判断请求的来源是否合法: $_SERVER["HTTP_REFERER"]

    实现代码:

            $referer = $_SERVER["HTTP_REFERER"];
            if(!preg_match('~http://smarty.com/.*~',$referer,$a)){
                unset($_SESSION['token']);
                $this->json(['status'=>0,'msg'=>'非法请求']);
            }
    
    	    $username = isset($_POST['username']) ? $_POST['username'] : '';
                $password = isset($_POST['password']) ? $_POST['password'] : '';
    	    $token = isset($_POST['token']) ? $_POST['token'] : '';
    
    	    if(empty($username)) {$this->json(['status'=>0,'msg'=>'账户不能为空!']);unset($_SESSION['token']);}
                if(empty($password)) {$this->json(['status'=>0,'msg'=>'密码不能为空!']);unset($_SESSION['token']);}
            if(empty($token)) {$this->json(['status'=>0,'msg'=>'token异常!']);unset($_SESSION['token']);}
    
            if($token != $_SESSION['token']){
                unset($_SESSION['token']);
                $this->json(['status'=>0,'msg'=>'token异常!']);
            }
    
            //防止token重用需要进行删除
            unset($_SESSION['token']);
    

  • 相关阅读:
    61. Rotate List
    60. Permutation Sequence
    59. Spiral Matrix II
    57. Insert Interval
    18多校8th
    2019山东省赛总结
    二分图——poj2239
    二分图匹配——poj1469
    二分图——poj2446匈牙利算法
    思维构造,建图——cf1159E
  • 原文地址:https://www.cnblogs.com/zpchcbd/p/12374083.html
Copyright © 2011-2022 走看看