是否无法手动强制$ _SESSION ['iamlogged']值?

时间:2017-11-17 23:32:32

标签: php security session cookies session-variables

我想确保$_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']值?

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

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

注3:这是live版本。

1 个答案:

答案 0 :(得分:0)

如果遗物$_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中也会丢失其他所有内容,所以如果你想保留其他相关内容,请不要采取第二种方式。