很明显,我们大多数 PHP 程序员不希望我们发布的作品以我们不希望的方式被黑客入侵或利用。因此,在询问如何应对会话劫持时,我会格外小心。我知道有 session_regenerate_id() 函数可以部分对抗会话劫持,但我对我遇到的另一种方法更好奇:
当用户登录网站时,您将他们的 user_id(或另一个更秘密的预定义加密字符串)(普通用户未知)作为字符串,并用随机预定义符号对其进行加盐,md5() 字符串并设置它作为 $_SESSION['user_code'] = $that_string; 并且无论何时该用户进入您盐分的页面,重复该过程并将其与 $_SESSION['user_code'] 匹配,如果它们不匹配;销毁会话。
所以在代码中它看起来像这样(例如):
//user credentials are correct, user data is fetched from db
$_SESSION['username'] = $row[3]; //username
$_SESSION['password'] = $row[2]; //password
$_SESSION['user_id'] = $row[4]; //user_id
$salt1 = 'uNs819';
$salt2 = 'J2i';
$user_code = $salt1 . $row[4] . $salt2;
$user_code = md5($user_code);
$_SESSION['user_code'] = $user_code;
然后在每个可用页面的开头检查这是否正确:
//fetch user credentials from db again
//$row4 is the user_id
if($_SESSION['user_code'] != md5($salt1 . $row[4] . $salt2){
session_destroy();
}
我不认为使用 user_id 作为加密的一部分是最佳的,但这只是一个例子。最好我将使用创建用户时的时间戳的 md5 字符串。但是,如果我不清楚我的主要问题是这种方法对会话劫持是否有效,为什么/为什么不呢?