如何在不哈希SQL密码的情况下登录?

时间:2019-01-01 19:39:59

标签: php mysql sql forms login

下午好!我自己在一个安全项目中工作。我在检查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>";          
    }   
?>

编辑我已经纠正了错误,但是我仍然无法登录,出现了提示:“名称或密码不正确!”。在我的数据库中,我有4列而没有散列信息。 ID,名称,电子邮件,密码

3 个答案:

答案 0 :(得分:3)

如果数据库中的密码以纯文本格式存储,那么问题是password_verify()-与explained in the manual-期望该密码的第二个参数是(我引用):

  

password_hash()创建的哈希。

该函数将尝试像假定$ row变量被哈希一样对$ _POST变量进行哈希处理,然后将哈希的$ _POST变量与$ row变量进行比较。显然,这绝不会导致有效的匹配,因为$ row变量不是有效的哈希。

此函数未对给定的字符串进行简单的直接比较。如果您要这样做,只需编写if ($_POST['password'] === $row['Password']),就不需要额外的功能!

答案 1 :(得分:0)

在您的情况下,您不能使用password_verify(),因为它仅用于哈希密码(通过password_hash())

您必须检查密码

if ($password == $row['password']) 

答案 2 :(得分:0)

您已向我们显示了读取密码(或无法读取密码)的代码。但是,您已经向我们展示了填充密码的代码,也没有建议您是否检查数据是否符合您的预期。

虽然我了解到您还不希望使用密码哈希散列,但您确实应该对Web应用程序安全性有所了解。您可以通过提供用户名

来登录
$ git blame -n foo

^592c0a1 1 (Michael G. Schwern 2019-01-01 12:56:35 -0800 1) Line 1
^592c0a1 2 (Michael G. Schwern 2019-01-01 12:56:35 -0800 2) Line 2
00000000 3 (Not Committed Yet  2019-01-01 13:03:06 -0800 3) Uncommitted line
4a87d48f 3 (Michael G. Schwern 2019-01-01 13:02:32 -0800 4) Line 2.5
^592c0a1 3 (Michael G. Schwern 2019-01-01 12:56:35 -0800 5) Line 3

$ git blame -n foo HEAD

^592c0a1 1 (Michael G. Schwern 2019-01-01 12:56:35 -0800 1) Line 1
^592c0a1 2 (Michael G. Schwern 2019-01-01 12:56:35 -0800 2) Line 2
4a87d48f 3 (Michael G. Schwern 2019-01-01 13:02:32 -0800 3) Line 2.5
^592c0a1 3 (Michael G. Schwern 2019-01-01 12:56:35 -0800 4) Line 3

拥有一个用于SQL注入的Google。

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

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

如果您不学习调试,就不学习编程。

 any' OR '1'='1

仅应将“名称”变量设置为会话变量。