Php 如何在SQL中登录而不散列密码?
下午好!我自己在一个安全项目中工作。我在PHP中检查登录代码时遇到问题。我不知道为什么,但当我尝试与我创建的“数据库中的密码为纯文本”的用户登录时,它会说密码不正确 其思想不是将密码转换为散列。我知道这是一个很大的安全风险,但显然我不会将其用于专业用途。我的目的是做安全测试 check.php: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
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