不要将密码转换为哈希值。我知道这是一个很大的安全风险,但显然我不会将其用于专业用途。我的目的是进行安全性测试。
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,名称,电子邮件,密码
答案 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
仅应将“名称”变量设置为会话变量。