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