laravel4.2 cookie 加密修改导致session失效
出于安全考虑,在服务器加了个Naxsi过滤一些可能是危险的请求,我发现这个过滤的规则包含cookie中不能含有 = 但是laravel现在的cookie基本末尾都是有=,所以会将一些正常的请求也过滤。我现在需要让cookie中不能有 =
我看了下cookie和session的源码,看到加密的方式是base64,这种加密方式会用=作为填补,我改了加密方式对应解密的地方也进行修改。我尝试在这种修改下登录 ,auth那里验证通过了,显示成功,但是只要一跳转就没有登陆状态了,估计是session 失效了。
我猜测有其他session的认证过滤的地方,也确实找到一个 sesison.reject,但是我完全找不到它赋值在哪里?在Illuminate\Foundation\Application.php 里面倒是有所谓的绑定----像这样
但那个值在哪里来的也看不出来啊啊啊啊!!!!
我用的是laravel 4.2 session驱动还是默认的那个file
修改cookie加密方式----为了直接看效果 ---我现在是直接在laravel源码上改的
在Illuminate\Encryption\Encrypter.php
加密函数---我把最后一句改了,加了个替换
把调用的解密的调用的getJsonPayload 里面第一句改了
原来是:
现在将第一句改成
求各位大神指导!!!看了好久源码,到这步找不到解决问题的方向了,真是吐血啊
我看了下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));
求各位大神指导!!!看了好久源码,到这步找不到解决问题的方向了,真是吐血啊
1 个回复
可燃冰
赞同来自: