在会话处理中从数组返回值的奇怪问题

时间:2017-09-03 20:31:06

标签: php session http-headers

我的会话课中有以下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);
}

0 个答案:

没有答案