【发布时间】:2023-03-16 15:28:01
【问题描述】:
我有一个基本站点,我用它来测试我的编程方法,并且我想获得一种让人们保持登录状态的安全方式。这是register.php 的代码。
$username = $_POST["username"]; //username stored plaintext
$passhashed = crypt($_POST["password"], $username); //hashed password salted with username
$rnum = rand(1000,9999); //assign random 4-digit number
$authkey = crypt($rnum, $passhashed); //unique authentication key per user, hashed and salted with hashed password
//insert into SQL
当他们登录时,$username、$passhashed 和 $authkey 存储在 $_SESSION 数据中。
在每一页的顶部,我都有以下 sn-p 代码:
if(isset($_SESSION["username"])
&& isset($_SESSION["password"])
&& isset($_SESSION["authkey"])) {
$verifyuser = $db->prepare("
SELECT *
FROM users
WHERE username = :user
AND password = :password
AND authkey = :authkey
");
$verifyuser->execute(array(
':user' => $_SESSION["username"],
':password' => $_SESSION["password"],
':authkey' => $_SESSION["authkey"]));
if($verifyuser->rowCount() != 1) {
unset($_SESSION["username"]);
unset($_SESSION["password"]);
unset($_SESSION["authkey"]);
}
}
基本上在任何给定的页面上,它都会检查$_SESSION 中存储的每个片段是否使用 SQL 清除,如果没有(如果任何检查失败,将给出非 1 的rowCount),它会丢弃会话。
我将是第一个承认我对逃避会话劫持的现代安全措施不太熟悉的人(事实上,我对它是如何完成的只是松散的掌握)。话虽这么说,这对于初学者程序员来说如何?我可以做些什么来使其更安全?在登录时分配第二个身份验证密钥,将其临时存储在 SQL 中并进行相同的检查(每次登录新密钥)?
【问题讨论】:
-
除非你经营一家银行,否则它可能就足够了
-
我认为这并不重要,但
$_SESSION的数据与ini_set('session.cookie_lifetime', 60*60*24*3);和ini_set('session.gc_maxlifetime', 60*60*24*3);一起保存了几天。 -
所以我是对的,通常 SESSION 不会存在。但这无论如何都行不通。用户回来时将获得一个新的会话 ID。