laravel4.2 cookie 加密修改导致session失效

出于安全考虑,在服务器加了个Naxsi过滤一些可能是危险的请求,我发现这个过滤的规则包含cookie中不能含有 = 但是laravel现在的cookie基本末尾都是有=,所以会将一些正常的请求也过滤。我现在需要让cookie中不能有 =
我看了下cookie和session的源码,看到加密的方式是base64,这种加密方式会用=作为填补,我改了加密方式对应解密的地方也进行修改。我尝试在这种修改下登录 ,auth那里验证通过了,显示成功,但是只要一跳转就没有登陆状态了,估计是session 失效了。
我猜测有其他session的认证过滤的地方,也确实找到一个 sesison.reject,但是我完全找不到它赋值在哪里?在Illuminate\Foundation\Application.php 里面倒是有所谓的绑定----像这样
protected function getStackedClient()
{
    $sessionReject = $this->bound('session.reject') ? $this['session.reject'] : null;

    $client = (new Builder)
                ->push('Illuminate\Cookie\Guard', $this['encrypter'])
                ->push('Illuminate\Cookie\Queue', $this['cookie'])
                ->push('Illuminate\Session\Middleware', $this['session'], $sessionReject);

    $this->mergeCustomMiddlewares($client);

    return $client->resolve($this);
}

但那个值在哪里来的也看不出来啊啊啊啊!!!!

我用的是laravel 4.2 session驱动还是默认的那个file
修改cookie加密方式----为了直接看效果 ---我现在是直接在laravel源码上改的
在Illuminate\Encryption\Encrypter.php
public function encrypt($value)
{
    $iv = mcrypt_create_iv($this->getIvSize(), $this->getRandomizer());

    $value = base64_encode($this->padAndMcrypt($value, $iv));
    // Once we have the encrypted value we will go ahead base64_encode the input
    // vector and create the MAC for the encrypted value so we can verify its
    // authenticity. Then, we'll JSON encode the data in a "payload" array.
    $mac = $this->hash($iv = base64_encode($iv), $value);
        return base64_encode(json_encode(compact('iv', 'value', 'mac')));
}

加密函数---我把最后一句改了,加了个替换
return str_replace('=','_',base64_encode(json_encode(compact('iv', 'value', 'mac'))));
对应的解密函数
public function decrypt($payload)
{
    $payload = $this->getJsonPayload($payload);
    // We'll go ahead and remove the PKCS7 padding from the encrypted value before
    // we decrypt it. Once we have the de-padded value, we will grab the vector
    // and decrypt the data, passing back the unserialized from of the value.
    $value = base64_decode($payload['value']);
    $iv = base64_decode($payload['iv']);
    return unserialize($this->stripPadding($this->mcryptDecrypt($value, $iv)));
}
把调用的解密的调用的getJsonPayload 里面第一句改了
原来是:
protected function getJsonPayload($payload)
{
        $payload = json_decode(base64_decode($payload), true);

    // If the payload is not valid JSON or does not have the proper keys set we will
    // assume it is invalid and bail out of the routine since we will not be able
    // to decrypt the given value. We'll also check the MAC for this encryption.
    if ( ! $payload || $this->invalidPayload($payload))
    {
        throw new DecryptException('Invalid data.');
    }

    if ( ! $this->validMac($payload))
    {
        throw new DecryptException('MAC is invalid.');
    }

    return $payload;
}
现在将第一句改成
$payload = json_decode(base64_decode(str_replace('_','=',$payload), true));

求各位大神指导!!!看了好久源码,到这步找不到解决问题的方向了,真是吐血啊
已邀请:

可燃冰

赞同来自:

求大神给个方向,我都不知道要到哪方面找资料了,泪奔

要回复问题请先登录注册