我怎样才能把这个变成一个安全登录?

这个问题在这里已经有了答案:

  • 基于表单的网站身份验证的权威性指南[已关闭] 12个答案

  • 正如您已经注意到的那样,您需要安全地存储密码。 如果你不这样做,你可能会像Adobe Systems最近一样感到尴尬。

    有两个步骤:

    首先,当用户创建或更新密码时,对其进行编码并存储编码值。

    其次,当用户尝试登录时,对密码进行编码并将其与存储的编码值进行比较。 只有在编码值匹配的情况下,您才允许用户访问。

    一个很好的方法是使用一个难以反向的哈希算法和一个随机盐。 在这里看到一些关于这样做的优秀信息:

    在PHP中编码密码的最佳方法

    对你提出这个问题很有帮助。 安全编程很难做到正确。 许多人试图重新发明车轮,并成功地重新开发了爆胎。


    session_start();
    ob_start();
    
    // db connect
    $dbh = new PDO("mysql:host=localhost;dbname={$db_name}", $dbusername, $password);
    $stmt = $dbh->prepare("SELECT password FROM {$tbl_name} WHERE username = :username");
    $stmt->bindParam(':username', $_POST['username']);
    $stmt->execute();
    $password = $stmt->fetchColumn();
    
    if($password !== false && password_verify($_POST['password'], $password)){
        $_SESSION['username'] = $username;
        $_SESSION['password'] = $password;
        header('location:login_success.php');
    }else {
        include("top.php");
        include("style.css");
        echo '<p align=center><font size=2>Login Failed. <a href="http://www.sentuamessage.com/login.php">Please Try Again</a></p>';
        include("bottom.php");
    }
    ob_end_flush();
    

    为了将密码哈希保存到数据库,使用它来生成密码哈希

    // Assuming that password you want to store is in $_POST['password']
    $password = password_hash($_POST['password'], PASSWORD_DEFAULT);
    

    如果你的PHP版本大于5.5,那么你可以去看看@Mark Ba​​ker关于userland实现的评论。 如果你的版本低于5.3.7,那么也许你应该想一些其他的密码散列方法。

    还要将数据库上的所有密码转换为散列密码。 密码必须正确才能正常工作 。 否则,你将不得不使用类似password_verify(md5($_POST['password']), $password)来验证密码。

    您还应该将数据库VARCHAR(255)中的密码字段设置为将来安全。

    $dbHost = 'localhost';
    $dbUser = 'Database username here';
    $dbPass = 'Database password here';
    $dbBase = 'Database name here';
    
    $usersTable = 'users';
    $userIdColumn = 'username';
    $userPasswordColumn = 'password';
    
    if (function_exists('password_hash') && function_exists('password_verify')){
        $dbh = new PDO("mysql:host={$dbHost};dbname={$dbBase}", $dbUser, $dbPass);
        $users = $dbh->prepare("SELECT {$userIdColumn} as id, {$userPasswordColumn} as password FROM {$usersTable}");
        $users->execute();
        $userUpdate = $dbh->prepare("UPDATE `{$usersTable}` SET `{$userPasswordColumn}` = :password WHERE `{$userIdColumn}` = :id");
        $userUpdate->bindParam(':id', $userId);
        $userUpdate->bindParam(':password', $passwordHash);
        foreach($users->fetchAll() as $row){
            $userId = $row['id'];
            $passwordHash = password_hash($row['password'], PASSWORD_DEFAULT);
            $userUpdate->execute();
        }
    }
    
    链接地址: http://www.djcxy.com/p/3719.html

    上一篇: How can i turn this into a secure log in?

    下一篇: Best way to make and store SALT