【问题标题】:CSRF Session token not workingCSRF 会话令牌不起作用
【发布时间】:2013-11-15 19:38:22
【问题描述】:

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

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

【问题讨论】:

    标签: php session csrf


    【解决方案1】:

    您将 $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' ] ) )
    

    【讨论】:

    • @user2738336 别担心。我今天有一些自己的想法!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-07
    • 2020-02-10
    • 2023-01-24
    • 1970-01-01
    • 2019-02-27
    • 2012-09-01
    • 2018-07-20
    相关资源
    最近更新 更多