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自然破解了
——代码疯子 : )