我有一个基本网站,我正在使用它来测试我的编程方法,我希望得到一种保持人们登录的半体面安全方式。这是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中并进行相同的检查(每次登录时使用新密钥)?
答案 0 :(得分:2)
The crypt
function有点过时了。你最好使用bcrypt,它是使用password_hash
和password_verify
在PHP中提供的。此外,使用这些函数,盐(您称之为$authkey
)被集成到字符串中,因此您无需单独存储它。
我注意到您在$_SESSION
中存储了用户名和密码。客户端无法直接修改$_SESSION
,因此您最好只在那里存储用户的ID。
答案 1 :(得分:2)
正如您所提到的,我对会话劫持也有基本的了解。
但是我认为如果这3个被劫持,这仍然可能无法阻止帐户劫持,但确实会使其更难。
当读取阻止会话劫持时,我看到一个简单的示例 - 如果当前IP与会话不匹配,请将用户注销。
<?php
if($_SESSION['ip'] != $_SERVER['REMOTE_ADDR'])
{
session_destroy();
}
?>
典型:我再也找不到说网站......
可能对您有所帮助的一些链接: