CSRF攻防

攻击

站点1

  • 需要授权访问的内容页面 page2
@RequestMapping("page2")
    @ResponseBody
    public String page2(){
        //需要授权
        if(SecurityUtils.getSubject().getSession().getAttribute("user") == null){
            return "<h1>没有登录,操作失败</h1>";
        }else{
            return "<h1>操作成功</h1>";
        }
    }
  • 未登录访问,显示
    在这里插入图片描述
  • 登陆后访问,显示
    在这里插入图片描述
    站点2
    在这里插入图片描述访问效果如下:
    在这里插入图片描述
    通过JS可以实现打开站点2,自动调用 go csrf。也就是访问站点1需要登录才能操作的内容。
    点击连接,如果站点1正好打开,浏览器内有session会话信息,并且已登录站点1,那么点击后如下图
    在这里插入图片描述也就是在用户未授权的情况下,站点2 访问了站点1需要授权的内容。同理,如果站点1是银行网站,page2是转账操作,那么如果用户在登录银行网站的同时,被诱导打开了站点2,可以在用户不知情的情况下实现转账操作。这就是所谓的csrf.
防御

通过referer字段,高速是从哪个连接过来的,可以用来避免跨站攻击。
代码如下:

@RequestMapping("page2")
    @ResponseBody
    public String page2(HttpServletRequest request){

        //验证referer
        String referer = request.getHeader("Referer");
        String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort() + request.getContextPath();
        if(referer == null || !referer.startsWith(basePath)){
            return "<h1>CSRF攻击拒绝</h1>";
        }
        //需要授权
        if(SecurityUtils.getSubject().getSession().getAttribute("user") == null){
            return "<h1>没有登录,操作失败</h1>";
        }else{
            return "<h1>操作成功</h1>";
        }
    }

再次通过站点2点击,显示:

在这里插入图片描述

Ajax rsrf
$("#ajax").click(function(){
                var ref = "http://localhost:18080";
                $.ajax({
                    url:"http://localhost:18080/demo/page2",
                    headers:{"X-Alt-Referer":ref, "Referer":ref},
                    dataType:"text",
                    success:function(data){
                        console.log(data);
                    }
                })
            })

在这里插入图片描述如上图所示,请求被拦截,具体原因就是跨域请求.
另外一个就是不允许手动设置Referer字段,浏览器的安全还是可以的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值