php - 这是否正确使用 PDO 和准备好的语句来实现安全登录?

标签 php security authentication

再次寻求有关 PHP 安全性和登录系统的帮助。想知道我在这里做得是否正确。如果我在任何地方不够具体,请询问,非常感谢任何帮助。我正在尝试创建一个安全的登录系统,仅供学习之用。这是代码:

require("constants.php");
$DBH = new mysqli($dbhost, $dbuser, $dbpass, $dbname);

function createSalt() {
    $length = mt_rand(64, 128);
    $salt = '';
    for ($i = 0; $i < $length; $i++) {
        $salt .= chr(mt_rand(33, 255));
    }
    return $salt;
}
//Salt function created by ircmaxell

function registerNewUser() {
    //Check to see if     Username Is In Use//
    $q = $DBH->prepare("SELECT id FROM users WHERE username = ?"); 
    $username = filter_var($username, FILTER_SANITIZE_STRING);
    $data = array($username);
    $q->execute($data);
    $row = $q->fetch();

    if ($row === false) { 
        //If Username Is Not Already In Use Insert Data//
        $hash = hash('sha256', $pass);
        $salt = createSalt();
        $hash = hash('sha256', $salt . $hash . $pass);  //UPDATED
        $data = array($username, $hash, $salt);
        $qInsert = $DBH->prepare(
            "INSERT INTO users (username, password, salt) values (?, ?, ?)"
        );
        $qInsert->execute($data); //Inserts User Data Into Table//  
    }
}

最佳答案

到目前为止看起来不错。不过,我有三点建议:

  1. 选择较长的盐
  2. 不要单独存储盐和密码摘要
  3. 如果您的数据库连接不是localhost,请使用不同的数据库连接器:PDO(尚)不支持 SSL 连接

编辑:此外,验证客户端提供的输入作为“用户名”。但由于您的代码示例只是摘录,我猜您正在这样做。

编辑#2:当我说“不要单独存储盐和密码”时,我的意思是将盐合并到存储的密码哈希中。由于您选择的哈希算法会生成一个由 [0-9a-f] 组成的相当长的字符串(64 个字符),您可能需要考虑生成随机长度的盐(此处归功于 ircmaxell),并将其连接到开头或密码哈希的末尾。因此,您最终将存储毫无意义的可变长度值(96 - 128 个字符)(对于外人来说):

$hash = hash('sha256', $pass);
$salt = substr(hash('sha256', mt_rand(0, 1337)), mt_rand(0, 31), 32);
$hash = $salt . hash('sha256', $salt . $hash . $pass);

关于php - 这是否正确使用 PDO 和准备好的语句来实现安全登录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4453769/

相关文章:

facebook - 来自 URL 和 session 的 "state"参数不匹配

java - 从 JNLP 运行应用程序时出现不需要的登录对话框

php - Laravel,dispatchAfterResponse 不释放前端请求

tomcat - Web 容器管理的安全性的常见替代方案?

authentication - BasicAuth、OAuth 和 XAuth 之间有什么区别?

java - 具有用户特定功能的 JSF Web 应用程序

javascript - Pixabay API CORB 问题

php - 如何在 Laravel 4 中连接表

php - MySQL 根据表列中的值返回不同的字符串

php - 如何只允许某些设备访问网站