我的会话课中有以下snipet。整个MVC是基于PSR的,你可以在这里找到相似之处。
private function getFingerprint()
{
$headers = $this->registry->get('request')->getHeaders();
$server = $this->registry->get('request')->getServer();
$hash = '';
if (true === isset($headers['User-Agent'])) {
$hash .= $headers['User-Agent'];
}
// if (true === isset($headers['Accept'])) {
// $hash .= $headers['Accept'];
// }
// if (true === isset($headers['Accept-Encoding'])) {
// $hash .= $headers['Accept-Encoding'];
// }
// if (true === isset($headers['Accept-Language'])) {
// $hash .= $headers['Accept-Language'];
// }
// if (true === isset($headers['Accept-Charset'])) {
// $hash .= $headers['Accept-Charset'];
// }
if (true === isset($server['REMOTE_ADDR'])) {
$hash .= inet_ntop(inet_pton($server['REMOTE_ADDR']) & inet_pton('255.255.0.0'));
}
return hash('sha512', $hash);
}
在此之后我将返回的值与存储的值进行比较,测试方法无关紧要我得到了相同的行为:
strcmp($_SESSION['session.fingerprint'], $this->getFingerprint()) !== 0
问题出在其后:
if (true === isset($headers['Accept'])) {
$hash .= $headers['Accept'];
}
所有必需的值都可以多次检查。当任何评论的部分被取消注释时,我得到了误报。有人遇到过这种奇怪的行为吗?我正在使用Apache / 2.4.27(Win64)OpenSSL / 1.1.0f PHP / 7.1.7所有x64和TS版本。
编辑1:PHP / 5.6.31上也出现了同样奇怪的行为。它应该是我的代码中的内容,如果任何人阅读这个需要我可以提供的源。
编辑2:getFingerprint()的工作示例,它不会导致奇怪的行为:
private function getFingerprint()
{
$headers = $this->registry->get('request')->getHeaders();
$server = $this->registry->get('request')->getServer();
$hash = '';
if (true === isset($headers['User-Agent'])) {
$hash .= $headers['User-Agent'];
}
if (true === isset($server['REMOTE_ADDR'])) {
$hash .= inet_ntop(inet_pton($server['REMOTE_ADDR']) & inet_pton('255.255.0.0'));
}
return hash('sha512', $hash);
}