【发布时间】:2016-02-08 07:54:35
【问题描述】:
我有这段代码将会话存储在数据库中。
public function read($id)
{
// $id=rtrim(@mcrypt_decrypt(MCRYPT_BLOWFISH, 'qwerty', base64_decode($id), MCRYPT_MODE_CBC, md5(md5('protect me')) ),'\0');
$result = mysqli_query($this->link,"SELECT Session_Data FROM Session WHERE Session_Id = '".$id."' AND Session_Expires > '".date('Y-m-d H:i:s')."'");
if($row = mysqli_fetch_assoc($result)){
return $row['Session_Data'];
}else{
return "";
}
}
public function write($id, $data)
{
//$id=@base64_encode(mcrypt_encrypt(MCRYPT_BLOWFISH, 'qwerty', $id, MCRYPT_MODE_CBC, md5(md5('protect me'))));
$DateTime = date('Y-m-d H:i:s');
$NewDateTime = date('Y-m-d H:i:s',strtotime($DateTime.' + 1 hour'));
$result = mysqli_query($this->link,"REPLACE INTO Session SET Session_Id = '".$id."', Session_Expires = '".$NewDateTime."', Session_Data = '".$data."'");
if($result){
return true;
}else{
return false;
}
}
在上面的代码中,我已经注释掉了加密和解密行,这些行实际上在存储到数据库中或从数据库中读取之前对 $id 进行加密和解密。
究竟会发生什么,当我不执行此加密和解密过程时。会话完全按应有的方式工作,但如果我要执行此过程,则存储在其中的会话数据将替换为当前会话。
为了让我的问题更清楚
我有两个 php 文件
1) test1.php
<?php
require_once('inc.session.php');
session_start();
$_SESSION['var1'] = "My Portuguese text: SOU Gaucho!";
?>
2) test2.php
<?php
//page 2
require_once('inc.session.php');
session_start();
$_SESSION['wef']="abbaba";
if(isset($_SESSION['var1'])){
echo $_SESSION['var1'];
}
?>
数据库:
上一个是没有加密过程,后一个是有加密过程。从图中可以清楚地看出会话数据与之前不完全相同。为什么会这样?
【问题讨论】:
-
您可以在解密 session_id 之前注册
var1,当您将 session_id 作为当前会话加载时,var1 只是删除,因为它不是同一个会话。但我只是预测。您能否分享与此过程相关的完整代码库。不清楚。
标签: php session encryption