三级安全检查;会话仍然脆弱?

时间:2013-09-22 23:15:21

标签: php security session

我有一个基本网站,我正在使用它来测试我的编程方法,我希望得到一种保持人们登录的半体面安全方式。这是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中并进行相同的检查(每次登录时使用新密钥)?

2 个答案:

答案 0 :(得分:2)

The crypt function有点过时了。你最好使用bcrypt,它是使用password_hashpassword_verify在PHP中提供的。此外,使用这些函数,盐(您称之为$authkey)被集成到字符串中,因此您无需单独存储它。

我注意到您在$_SESSION中存储了用户名和密码。客户端无法直接修改$_SESSION,因此您最好只在那里存储用户的ID。

答案 1 :(得分:2)

正如您所提到的,我对会话劫持也有基本的了解。

但是我认为如果这3个被劫持,这仍然可能无法阻止帐户劫持,但确实会使其更难。

当读取阻止会话劫持时,我看到一个简单的示例 - 如果当前IP与会话不匹配,请将用户注销。

<?php
if($_SESSION['ip'] != $_SERVER['REMOTE_ADDR'])
{
session_destroy();
}
?>

典型:我再也找不到说网站......

可能对您有所帮助的一些链接:

Preventing session hijacking

Proper session hijacking prevention in PHP