【问题标题】:Is it impossible to manually force a $_SESSION['iamlogged'] value? [duplicate]是否无法手动强制 $_SESSION['iamlogged'] 值? [复制]
【发布时间】:2018-05-01 19:54:22
【问题描述】:

我想确保$_SESSION 不会在涉及它的登录方案中被愚弄。我在这里过度简化了,只保留问题的核心。

使用时

<?php 
$password = "...";

session_set_cookie_params(3600, dirname($_SERVER['SCRIPT_NAME']));
session_start();

if (isset($_POST['pass']) && $_POST['pass'] === $password) { 
    $_SESSION['iamlogged'] = 1; 
}

if (!isset($_SESSION['iamlogged']) || !($_SESSION['iamlogged'] == 1)) { 
    echo '<html><body><form action="." method="post"><input type="password" name="pass" '
         . 'value=""><input type="submit" value="Submit"></form></body></html>'; 
    exit; 
}

echo "You logged in in the last 30 minutes.";
// Now we can do some work

确定对于没有密码的任何人都无法显示最后一行吗? 或者 PHP 中是否存在当前已知的技术来手动强制此 $_SESSION['iamlogged'] 值?

注意:当然,我确实使用密码 hasing+salting 等,但我删除了所有这些,只关注$_SESSION 安全性。

注意 2:我假设 register_globals 已关闭,因为 PHP 比 5.4 更新。

注意3:这里是live 版本。

【问题讨论】:

  • 我一定已经读了 10 遍了,但我没有掌握。你说的“被愚弄”是什么意思?就像“被黑/欺骗/绕过/中间人”一样?而这个echo "Can we arrive here without the password?";,是问题的一部分吗?
  • @Fred-ii- 我的意思是,除了强制所有密码,除了中间的人,不知道密码的用户是否有可能显示最后一行(echo ...)?示例:你能在secret-ravine-92114.herokuapp.com 中显示这一行吗?
  • 无论如何都会出现回声。您需要将其放在已登录用户的条件语句中并设置会话。
  • @Fred-ii- 不,它不会:如果你没有登录,它会在之前的exit; 停止,并且不会执行最后一行。
  • 会话数据存储在服务器上,不能由客户端设置。欺骗会话的唯一方法是让某人猜测别人的PHPSESSID cookie。

标签: php security session cookies session-variables


【解决方案1】:

如果之前有一个遗物$_SESSION['iamlogged'] 漂浮在会议上,则该会话可能会给您一个误报。

作为一项安全措施,您应该这样做:

<?php 
$password = "...";

//unset false positive, if it exists
if (array_key_exists('iamlogged', $_SESSION)) {
    unset($_SESSION['iamlogged'];
}

//carry on normally
if (isset($_POST['pass']) && $_POST['pass'] === $password) { 
    $_SESSION['iamlogged'] = 1; 
}
...

为了简单起见,您也可以这样做:

session_start();
session_destroy();
session_start();

但是这里的后者也会丢失$_SESSION 中的所有其他内容,因此如果您想要保留其中的其他相关内容,请不要使用第二种方式。

【讨论】:

  • 感谢您的回答。只是为了确保了解@mopsyd,你为什么要开始,破坏和开始? (我更新了问题以表明,如果已登录,我希望保持登录状态 30 分钟。在我的应用程序中,还有其他要注销的代码(+ 其他使用 hash+salt 的代码),但我没有发布它在这里。)
  • session_destroy 不能销毁一个不存在的会话,如果你还没有调用session_start,它在当前运行时还不存在。
  • 这不会破坏现有的cookie吗? (假设我想在登录后保持登录状态 30 分钟。)
  • 首先session_start 让PHP 知道有一个会话,然后session_destroy 杀死它,然后session_start 创建一个新的。
  • cookie 的哈希值对应于 PHP 会话目录中的临时文件的名称,该文件是会话值的平面文件。如果session_start 没有被调用,那么PHPSESSID 只是一个cookie,没有相关性。您也可以取消设置 cookie,但由于 PHPSESSID 可以重命名,PHP 在绑定到当前活动会话之前不会对其含义做出任何假设。
猜你喜欢
  • 2022-12-31
  • 1970-01-01
  • 2014-08-11
  • 2018-05-21
  • 1970-01-01
  • 2018-09-11
  • 2013-03-08
  • 2011-10-18
  • 1970-01-01
相关资源
最近更新 更多