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

  • 相关阅读:
    ASCII、Unicode和UTF-8等常见字符编码格式介绍
    pycharm创建脚本头文件模板
    pycharm常用设置项和快捷键
    Genymotion安装apk问题
    [Android测试] Appium的一些坑问题错误解决 与 技巧集锦
    Appium+python自动化测试过程中问题
    python客户端和Appium服务端联调出现的问题解决办法
    移动端自动化测试环境搭建
    "http://127.0.0.1:4723/wd/hub"的解释
    wireshark抓包看ECN
  • 原文地址:https://www.cnblogs.com/zpchcbd/p/12374083.html
Copyright © 2020-2023  润新知