很明显,我们大多数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字符串。但是,如果我不清楚我的主要问题是这种方法对于会话劫持是否可靠,为什么/为什么不呢?
答案 0 :(得分:1)
您不需要多种盐的花式方案。
此外,如果我可以窃取用户的会话cookie,那么您的方案根本不起作用。
登录后更改会话ID以避免会话固定
随处使用HTTPS
使用httpOnly会话cookie,因此JavaScript无法读取它
验证并拒绝XSS输入并在输出中转义用户生成的数据
使用长的随机会话ID
重新验证用户的重要操作
答案 1 :(得分:0)
始终针对跨站点伪造令牌检查任何表单,例如,在登录时创建令牌:
Session:set('token', md5(uniqid());
然后在每个表单上放置一个带有所述令牌的隐藏表单输入
<input type="hidden" name="crsf" value="<?php echo System::escape(Session::get('token'));">
然后你可以检查它们以确保:
if(Request::post('crsf') == Session::get('token'):
//do what you gotta do
确保在每个表单上重新生成一个新令牌是否成功
我为使用这种方法道歉,但你得到了如何处理表单的要点,以及没有。
答案 2 :(得分:0)
&#34;我遇到的另一种方法&#34; - 请引用你的消息来源。
您在此处描述的内容并不能影响会话劫持。使用多少会话值,多少盐和多少轮加密并不重要,结果将始终匹配。如果会话受到损害,您不能依赖它来验证会话。 session_regenerate_id()函数确实添加了一些值,但只减少了要利用的现有漏洞的窗口。花时间防止会话泄露 - 使用https,HSTS,仅http +安全cookie标志,严格的CSP,到期时会话销毁。
如果您真的觉得需要进一步增强安全性,那么在正常交换中使用令牌,例如使用本地存储或设备指纹识别的质询响应。