【问题标题】:Session hijacking countering methods会话劫持应对方法
【发布时间】:2018-07-20 01:48:29
【问题描述】:

很明显,我们大多数 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 字符串。但是,如果我不清楚我的主要问题是这种方法对会话劫持是否有效,为什么/为什么不呢?

【问题讨论】:

    标签: php security session session-hijacking


    【解决方案1】:

    您不需要包含多种盐的花哨方案。

    另外,如果我可以窃取用户的会话 cookie,那么您的方案将根本不起作用。

    1. 登录后更改会话 ID 以避免会话固定

    2. 在任何地方都使用 HTTPS

    3. 使用 httpOnly 会话 cookie,以便 JavaScript 无法读取它

    4. 验证和拒绝 XSS 输入并转义用户生成的输出数据

    5. 使用长的随机会话 ID

    6. 为重要操作重新验证用户身份

    【讨论】:

      【解决方案2】:

      始终根据跨站点伪造令牌检查任何表单,例如,在登录时为它们创建一个令牌:

      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
      

      确保在每次提交表单时重新生成一个新令牌,无论它是否成功

      对于为此使用方法,我深表歉意,但您了解如何处理表单以及如何处理表单的要点。

      【讨论】:

      • Alien13 没有询问 CSRF,如果用户打开第二个窗口,您描述的内容将会中断
      【解决方案3】:

      “我遇到的另一种方法” - 请引用您的来源。

      您在此处描述的内容完全不会影响会话劫持。不管你使用多少会话值、多少盐和多少轮加密,结果总是匹配的。如果会话被破坏,您不能依赖它来验证会话。 session_regenerate_id() 函数确实增加了一点价值,但只会减少现有漏洞被利用的窗口。花时间防止会话受损 - 使用 https、HSTS、http-only+secure cookie 标志、严格的 CSP、到期时销毁会话。

      如果你真的觉得有必要进一步提高安全性,那么在普通交易所使用代币,例如使用本地存储或设备指纹的质询响应。

      【讨论】:

      • 我对会话劫持不是很熟悉,这可能是一个奇怪的问题,但这种方法可能有效,因为 $user_code 仅在成功、合法登录时生成并存储为会话值($ user_code 是结合存储在数据库中的数据生成的,该数据库仅在合法登录时获取)。外部会话劫持者永远无法猜测从数据库中获取的秘密字符串(对所有用户都是唯一的),因此有一个无效/空的 $user_code 并销毁会话?
      • 两者仍然是服务器端的事实并链接到会话。
      • 这是否仍然适用,即使仅在合法、成功登录时才生成 user_code 并链接到会话?
      猜你喜欢
      • 2013-10-09
      • 2011-09-22
      • 1970-01-01
      • 1970-01-01
      • 2014-07-09
      • 2012-08-27
      • 2012-04-17
      • 1970-01-01
      相关资源
      最近更新 更多