我有一个用于测试我的编程方法的基本站点,我想获得一种让人们保持登录状态的半体面的安全方式。这是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
数据中。
在每一页的顶部,我都有以下代码片段:
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 清除,如果没有(如果任何检查失败,将给出rowCount
非 1),它会丢弃会话。
我将是第一个承认我对逃避会话劫持的当代安全措施不太熟悉的人(事实上,我对它是如何完成的只有一个松散的控制)。话虽这么说,这对于初学者程序员来说如何?我可以做些什么来使其更安全?在登录时分配第二个身份验证密钥,将其临时存储在 SQL 中并进行相同的检查(每次登录新密钥)?