带有user_id和user_agent标识符的PHP Session

时间:2014-03-31 12:32:02

标签: php session encryption

什么人,

我现在正在创建一个登录系统,我想保护会话劫持(我在PHP Security Consortium网站上阅读)。我有一个问题,我使用session变量来存储user_id,这样我就可以在需要时从数据库加载正确的内容。但是,代替看起来像'58'的会话而58是user_id,它现在看起来像:

585C2reaY2wXT9bR92hgtQnXlcKcxBtWqa8DArzgElQv69L3JgYoO96Ra8CbXHz518Z9ltKn3fK0tL3C2nMbFXdUr8T0HWUHZGgYOsvx2eNTf3JuMlKi/cTTqpqDLGuXtBEa+cgKhgxXgh9QviFgbc50Js/vbpTZ4BmKArgt4kvQE= 

前两个数字58是user_id。其余的是已加密的登录用户的用户代理。

我的问题是,如何将user_id与加密的user_agent分开,以使用user_id进行所有正确的SQL查询并加载正确的数据?所以会话标识符在顶部,我必须将它分成两部分,第一部分是user_id,第二部分是加密的user_agent。

4 个答案:

答案 0 :(得分:1)

您需要稍微修改一下您的会话,以便按照以下方式执行操作。

58:5C2reaY2wXT9bR92hgtQnXlcKcxBtWqa8DArzgElQv69L3JgYoO96Ra8CbXHz518Z9ltKn3fK0tL3C2nMbFXdUr8T0HWUHZGgYOsvx2eNTf3JuMlKi

请注意我在用户ID后添加的:

然后你会做类似以下的事情来获取该字符串的用户id部分

$str = substr($string, 0, strpos($string, ":"));

答案 1 :(得分:1)

在user_id中使用可能的字符中的任何字符。在我看来,任何非数字字符都可能适合。然后拆分它。以下是“=”作为分隔符的示例:

$user_agent = base64_decode(substr($string, 0, strpos($string, "=")));

请注意,base64不是加密,它是一种简单的编码。

答案 2 :(得分:0)

我建议做以下

设置会话变量后,您需要这样做..

$user_id = 1299429; // example
// Generate the session variable with the user agent and set it
// In another session variable, save the length of the user_id so
$_SESSION['user_id_length'] = strlen($user_id);

然后在分离时,您可以执行以下操作

$user_id = substr($encrypted, 0, $_SESSION['user_id_length']);

答案 3 :(得分:-1)

您可以尝试使用此代码。它将采用前两个字符

$str = substr($string, 0, 2);

其中$string是您的长加密字符串。这将返回从第一个字符开始的字符串,并取两个字符。或者,如果您知道加密的长度,例如64个字符。

$enc_length = 64;
$userid_length = strlen($_SESSION['variables']) - $enc_length;
$userid  = substr($string, 0, $userid_length);