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']);
    

  • 相关阅读:
    Week03-面向对象入门
    Week02-Java基本语法与类库
    201621123056 《Java程序设计》第1周学习总结
    2.2确定一个字符是否在指定范围内
    2.1确定一个char包含何种字符
    1.自己写一个计算器demo
    1.23 确定一个Decimal或Double的整数部分
    1.5 测试奇偶性
    1.2度转化为弧度 1.3弧度转换为度
    1.1确定分数与浮点数值之间的近似相等性。
  • 原文地址:https://www.cnblogs.com/zpchcbd/p/12374083.html
Copyright © 2011-2022 走看看