Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在SQL中登录而不散列密码?_Php_Mysql_Sql_Forms_Login - Fatal编程技术网

Php 如何在SQL中登录而不散列密码?

Php 如何在SQL中登录而不散列密码?,php,mysql,sql,forms,login,Php,Mysql,Sql,Forms,Login,下午好!我自己在一个安全项目中工作。我在PHP中检查登录代码时遇到问题。我不知道为什么,但当我尝试与我创建的“数据库中的密码为纯文本”的用户登录时,它会说密码不正确 其思想不是将密码转换为散列。我知道这是一个很大的安全风险,但显然我不会将其用于专业用途。我的目的是做安全测试 check.php: <?php include 'conn.php'; $conn = mysqli_connect($dbhost, $dbuser, $dbpass, $dbn

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

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

密码\u hash()
创建的哈希

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


此函数不是对给定字符串进行简单的直接比较。如果您想这样做,只需编写
If($\u POST['password']==$row['password'])
即可,无需额外的函数

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

密码\u hash()
创建的哈希

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


此函数不是对给定字符串进行简单的直接比较。如果您想这样做,只需编写
If($\u POST['password']==$row['password'])
即可,无需额外的函数

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

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

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

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

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

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

您已经向我们显示了读取密码(或无法读取)的代码。但是您已经向我们展示了填充密码的代码,也没有告知您是否检查了数据,这是您所期望的

虽然我知道您还不想走密码散列的路线,但您确实应该了解一点web应用程序的安全性。您可以通过提供用户名作为登录

 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”变量应设置为会话变量。

您已经向我们展示了读取密码的代码(或无法读取密码)。但是您已经向我们展示了填充密码的代码,也没有告知您是否检查了数据,这是您所期望的

虽然我知道您还不想走密码散列的路线,但您确实应该了解一点web应用程序的安全性。您可以通过提供用户名作为登录

 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”变量设置为会话变量。

password\u verify()
无法处理纯文本密码存储。它是为完全相反的任务而设计的。如果要比较普通字符串,请使用
==
strcmp
,而不是
pw\u验证
。顺便说一句,这样做的理由完全是假的。缺少参数绑定也是如此。我记得我在前面结束了一个完全相同的问题,您没有按照所有副本中的步骤“一字不差”。警告:编写您自己的访问控制层并不容易,而且有很多机会会出现严重错误。请不要编写自己的身份验证系统,因为任何现代的类似系统都内置了强大的功能。注意:
mysqli
的面向对象接口明显不那么冗长,使代码更易于阅读和审核,并且不容易与过时的
mysql\u query
接口混淆。在你对程序性风格投入太多之前,值得换一种。示例:
$db=new mysqli(…)
$db->prepare(“…”)
过程接口是引入
mysqli
API时PHP4时代的产物,不应在新代码中使用。
password\u verify()
无法处理纯文本密码存储。它是为完全相反的任务而设计的。如果要比较普通字符串,请使用
==
strcmp
,而不是
pw\u验证
。顺便说一句,这样做的理由完全是假的。缺少参数绑定也是如此。我记得早些时候结束了一个完全相同的问题,您没有按照所有副本中的步骤“严格执行”。警告:Writin