当前位置: 首页 > 知识库问答 >
问题:

如何在SQL中登录而不散列密码?[副本]

端木昱
2023-03-14

下午好我自己在一个安全项目中工作。我在PHP中检查登录代码时遇到问题。我不知道为什么,但当我尝试与我创建的“数据库中的密码为纯文本”的用户登录时,它会说密码不正确。

其思想不是将密码转换为散列。我知道这是一个很大的安全风险,但显然我不会将其用于专业用途。我的目的是做安全测试。

check.php:

        <?php
    include 'conn.php'; 

    $conn = mysqli_connect($dbhost, $dbuser, $dbpass, $dbname);
    // Check connection
    if (!$conn) {
        die("Connection failed: " . mysqli_connect_error());
    }

    $name = $_POST['name']; 
    $password = $_POST['password'];

    $result = mysqli_query($conn, "SELECT Name, Password FROM users WHERE Name = '$name'");

    $row = mysqli_fetch_assoc($result);

    if (password_verify($_POST['password'], $row['Password'])) {    

        $_SESSION['loggedin'] = true;
        $_SESSION['name'] = $row['Name'];
        $_SESSION['start'] = time();
        $_SESSION['expire'] = $_SESSION['start'] + (1 * 60) ;                       

        echo "<div class='alert alert-success' role='alert'><strong>Welcome!</strong> $row[Name]            
        <p><a href='edit-profile.php'>Edit Profile</a></p>  
        <p><a href='logout.php'>Logout</a></p></div>";  

    } else {
        echo "<div class='alert alert-danger' role='alert'>Name or Password are incorrects!
        <p><a href='login.html'><strong>Please try again!</strong></a></p></div>";          
    }   
?>

编辑我已经纠正了错误,但我仍然有问题的日志,出现一个menssage:"姓名或密码不正确!".在我的数据库中,我有4列没有散列的信息。ID,姓名, Email,密码

共有3个答案

翟奇逸
2023-03-14

在您的情况下,您不能使用password\u verify(),因为它只用于散列密码(通过password\u hash())

您必须像检查密码一样检查密码

if ($password == $row['password']) 
壤驷坚
2023-03-14

您已经向我们展示了读取密码(或未能读取密码)的代码。但是您已经向我们展示了填充密码的代码,也没有建议您是否检查了您期望的数据。

虽然我知道您还不想走密码哈希路线,但您确实应该学习一点关于网络应用程序安全的知识。您将能够通过提供用户名为

 any' OR '1'='1

使用google for SQL注入。

代码中没有错误检查/处理。对MySQLi的每次调用都应该有一个与之关联的错误处理程序。

您可以通过将生成的SQL写回浏览器,并通过mysql命令行客户端或PHPMyAdmin运行它来检查它是否返回任何数据,从而开始解决问题。您还应该在代码中检查查询是否返回了零条或一条记录(并相应地处理每种情况)。

如果你没有学会调试,你就没有学会编程。

    $_SESSION['loggedin'] = true;
    $_SESSION['name'] = $row['Name'];
    $_SESSION['start'] = time();
    $_SESSION['expire'] = $_SESSION['start'] + (1 * 60) ;

只有“name”变量应设置为会话变量。

赫连泰宁
2023-03-14

如果数据库中的密码以纯文本形式存储,那么问题在于password\u verify()-如手册中所述-期望它的第二个参数为(我引用):

password_hash()创建的哈希。

函数将尝试以假定对$row变量进行哈希处理的相同方式对$\u POST变量进行哈希处理,然后将哈希后的$\u POST变量与$row变量进行比较。显然,这永远不会导致有效的匹配,因为$row变量不是有效的散列。

这个函数不是对给定字符串进行简单的直接比较。如果你想这样做,只需写if($_POST['密码'] === $行['密码']),而不需要额外的功能!

 类似资料:
  • 我在谷歌上搜索过正确的方法,但是有很多不同的方法。所以我想出了这个,不介意一些批评和更好实践的链接。 //注册表格-用户提供用户名(电子邮件)密码(文本)// 所以我抓取数据: 然后将user_email| encrypted_pass|salt插入数据库 //登录表单-用户提供用户名(电子邮件)密码(文本)// 所以首先根据用户(电子邮件)我抓取encrypted_pass和盐信息。然后 我读过

  • 问题内容: 我需要对密码进行哈希处理以存储在数据库中。如何用Java做到这一点? 我希望使用纯文本密码,添加随机盐,然后将盐和哈希密码存储在数据库中。 然后,当用户想要登录时,我可以使用其提交的密码,从其帐户信息中添加随机盐,对其进行哈希处理,然后查看其是否等同于其帐户信息所存储的哈希密码。 问题答案: 实际上,你可以使用Java运行时内置的工具来执行此操作。Java 6中的SunJCE支持PBK

  • 我试图修改代码以包含HASH_PASSWORD,但我不相信我做得对。

  • 我正在处理一个pet项目,现在我想添加用户注册支持。经过一些研究,我决定在数据库中保存哈希密码和salt,而不是原始密码。然而,我不知道这些步骤是什么,顺序是什么。以下是我的假设: 注册 客户端向服务器发送用户名和密码(https) 服务器获取密码,生成随机salt Base64对盐进行编码 用stringify salt散列密码 Base64对密码进行编码 将密码和salt保存到数据库中 登录

  • 我正在为拉拉维尔创建一个散列密码。现在有人告诉我使用Laravel哈希助手,但我似乎找不到它,或者我找错了方向。 如何创建laravel散列密码?在哪呢? 编辑:我知道代码是什么,但我不知道在哪里和如何使用它,所以它返回给我散列密码。如果得到散列密码,就可以手动将其插入数据库

  • 我试图完全理解密码散列,以便能够向审计员解释它。 基于我对答案的搜索,我知道函数是的包装器。在阅读预定义常量的PHP手册时,我看到它使用作为默认整数值(基本上它使用算法来散列密码)。 让我困惑的是,变量如果省略,会生成一个随机salt,并且成本将设置为。如果我提供了更高的成本(例如:),由于我没有提供salt值,它还会生成随机salt吗?我在这里感到困惑的原因是,我没有忽略,而是提供了不同的成本。