穷人的会话ID导致分析错误

时间:2016-08-31 00:07:13

标签: php

我为了自己的目的创建了这个小家伙来获取大型会话ID:

// returns a 1024-byte hash for session IDs

class sha512_session {

private $IDvalue = '';
private $IDMAX_SALT = mt_getrandmax();

for ($i = 0; $i < 8; $i++) {
    $seed   = mt_rand(100, $IDMAX_SALT);
    $IDvalue .= strtoupper(hash('sha512', $seed, false));
  }

public function getID() {
    return $IDvalue;
  }

}

在类上下文之外,for()循环的工作方式应该如此。当我把这个(工作)代码放在上面的类中时,PHP会返回以下内容:

Parse error: syntax error, unexpected '(', expecting ',' or ';' in ../sha-iterator.php on line ... ( line # for "private $IDMAX_SALT = mt_getrandmax()" )

所以,它在一个类之外工作正常并在类中打破。我在哪里陷入困境?

2 个答案:

答案 0 :(得分:0)

For循环必须放在函数中。我认为你应该把它放在一个构造函数中。

class sha512_session {
    private $IDvalue = '';
    private $IDMAX_SALT;

    function __construct() {
        $this->IDMAX_SALT = mt_getrandmax();
        for ($i = 0; $i < 8; $i++) {
            $this->seed   = mt_rand(100, $this->IDMAX_SALT);
            $this->IDvalue .= strtoupper(hash('sha512', $this->seed, false));
        }
    }
    public function getID() {
        return $this->IDvalue;
    }

}

答案 1 :(得分:0)

好的评论在这里回答了我的问题。声明期间的类属性初始化在编译时必须是常量,但mt_getrandmax()是运行时信息,因此它失败。这里正确的方法是声明变量,然后单独初始化它:

class sha512_session {
    private $IDvalue = '';
    private $IDMAX_SALT;

private function getRandomMax() {
    $this->IDMAX_SALT = mt_getrandmax();
    return $this->IDMAX_SALT;
}

function __construct() {
    for ($i = 0; $i < 8; $i++) {
        $this->seed   = mt_rand(100, $this->getRandomMax());
        $this->IDvalue .= strtoupper(hash('sha512', $this->seed, false));
    }
}
public function getID() {
    return $this->IDvalue;
}

}

 $sessionID = new sha512_session();
 echo $sessionID->getID();

或该主题的任何变体。