【ThinkPHP5初体验(二)1】CSRF防范原理(thinkphp5 CSRF ajax令牌)

CSRF是什么我就不解释了,百度一搜全是,比波姐的片源还要多,千篇一律都他么是复制粘贴。

那为什么这个令牌(token)操作可以防范CSRF呢?下面我就随便说说说错了大家不要介意。

首先我们要知道令牌是存储在session里面的,这个很重要

 php代码如下

<?php 
	namespace app\index\controller;
    //我直接允许跨域,因为伪装CSRF网站随便在nginx搞个反向代理,跨域问题随便破
	header('Access-Control-Allow-Origin:*');
    //$this->request要用到继承Controller
	use think\Controller;
    //操作session需要用到Session
	use think\Session;
    
	class Index extends Controller
	{
		function index()
		{
            //新建一个令牌
			$t = $this->request->token('__token__', 'sha1');
            //直接输出令牌,不做json处理了
			echo $t;
		}
		function action()
		{
            //判断,找到session的令牌和上传的令牌是不是一样
			if (Session::get('__token__') == $this->request->post('__token__')) {
				return '成功'.Session::get('__token__');
			} else{
				return '失败'.Session::get('__token__');
			}
		}
	}

html代码如下(这个直接放在www目录下面就好了,即网站根目录)(http://localhost和http://127.0.0.1都算是跨域噢

<html>
	<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
	<body>
        <div id="first">第一次ajax产生的token:</div>
        <div id="second">第二次ajax输出的token:</div>
	</body>
	<script>
		$.ajax({
                //tp的url地址我放在这里,根据自己定义
                url:'http://127.0.0.1/public/index/index/index',
                type:'GET'
                success(data1){
                    first.innerHTML += data1
                    $.ajax({
                       url:'http://127.0.0.1/public/index/index/action',
                       type:'POST',
                       data:{
                            __token__:__token__
                        },
                       success(data2){
                           second.innerHTML += data2
                       }
                    })
                }
            })
	</script>
</html>

当我们本域名访问时,session一直是用这个

#session里面的代码
think|a:1:{s:9:"__token__";s:40:"133bda9af0805a24c95e19cace0d858315372f98";}

当我们跨域访问时,session每次请求都不一样

#第一个session
think|a:1:{s:9:"__token__";s:40:"d966cee47e4ee0a54d9beb126f6454199f3acacd";}

#第二个session
空

所以我们第二次根本找不到session的令牌,CSRF自然破解了

——代码疯子  : )

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值