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 {} 语句块么
你是对的,我想岔了,已修复,多谢