什么人,
我现在正在创建一个登录系统,我想保护会话劫持(我在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。
答案 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);