CSRF会话令牌无效

时间:2013-11-15 19:38:23

标签: php session csrf

我的会话没有设置,我不知道为什么......

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是提交的令牌)。 为什么不在会话中保存令牌?

1 个答案:

答案 0 :(得分:0)

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

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

而不是

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

看到你在CSRF :: generate中将密钥设置为'token'?否则:

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

将是这样的:

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