CSRF 会话令牌不起作用


CSRF Session token not working

我的会话未设置,我不确定为什么...

public static function generate( $key )
{
    $extra = self::$doOriginCheck ? sha1( $_SERVER['REMOTE_ADDR'] . $_SERVER['HTTP_USER_AGENT'] ) : '';
    $token = base64_encode( time() . $extra . self::randomString( 32 ) );
    $_SESSION[ 'csrf_' . $key ] = $token;
    return $token;
}

我用它来生成一个密钥。在我的登录表单上,在包含我的会话文件后,我使用:

$token = CSRF::generate("token"); // class name is CSRF

然后,我$token将其用作与表单一起提交的隐藏值。

现在为了检查它,我使用一个名为 check() 的函数(这是抛出异常的部分:

public static function check( $key, $origin, $throwException=false, $timespan=null, $multiple=false )
    {
        if ( !isset( $_SESSION[ 'csrf_' . $key ] ) )
            if($throwException)
                throw new Exception( 'Missing session token.' );
            else
                return false;
                ....

我正在检查它如下:

CSRF::check($token, $_POST, true, 60*10, false);

($token是提交的令牌)。为什么不在会话中保存令牌?

你$token作为 CSRF::check() 的第一个参数传入。当然,它应该是:

CSRF::check('token', $_POST, true, 60*10, false);

而不是

CSRF::check($token, $_POST, true, 60*10, false);

看到您在CSRF::generate中将密钥设置为"令牌"?否则:

if ( !isset( $_SESSION[ 'csrf_' . $key ] ) )

将是这样的:

if ( !isset( $_SESSION[ 'csrf_hed97988hdbnbnuihg07dede89723tg7yihoi3dh' ] ) )