anerg2046 / sns_auth

通用第三方登录SDK,支持微信,微信扫码,QQ,微博登录,支付宝登录,Facebook,Line,Twitter,Google

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

state判断安全漏洞

qilifengxiang opened this issue · comments

/**
* 获取access_token
*/
public function getAccessToken($ignore_stat = false) {
if ($ignore_stat === false && isset($_COOKIE['A_S']) && $_GET['state'] != $_COOKIE['A_S']) {
exception('传递的STATE参数不匹配!');
} else {
$this->initConfig();
$params = $this->_params();
$data = Http::post($this->AccessTokenURL, $params);
$this->token = $this->parseToken($data);
setcookie('A_S', $this->timestamp, $this->timestamp - 600, '/');
return $this->token;
}
}

$ignore_stat为false时判断逻辑应该为 if ($ignore_stat === false && (!isset($_COOKIE['A_S']) || $_GET['state'] != $_COOKIE['A_S']))

你再仔细想想呢?
如果$_COOKIE['A_S']不存在,那么isset($_COOKIE['A_S'])返回值就是false了,并不会再执行$_GET['state'] != $_COOKIE['A_S']的判断了

$_COOKIE['A_S'] 不存在的时候,应该执行 exception('传递的STATE参数不匹配!');
$_COOKIE['A_S'] 不存在就直接返回成功,这个是有安全问题的

$_COOKIE['A_S'] 不存在的时候,if ($ignore_stat === false && isset($_COOKIE['A_S']) && $_GET['state'] != $_COOKIE['A_S']) 这个判断中isset($_COOKIE['A_S'])的值是false,所以一定会直接抛出异常了。

isset($_COOKIE['A_S'])的值是false 不是应该执行 else {} 语句块么

你是对的,我想岔了,已修复,多谢