码迷,mamicode.com
首页 > 其他好文 > 详细

CSRF攻击/防御

时间:2020-02-27 20:51:46      阅读:62      评论:0      收藏:0      [点我收藏+]

标签:判断   防止   技术   val   data   status   oca   login   function   

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

技术图片

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

技术图片

那么为了防止类似的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']);

技术图片

CSRF攻击/防御

标签:判断   防止   技术   val   data   status   oca   login   function   

原文地址:https://www.cnblogs.com/zpchcbd/p/12374083.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!