Php 带有密码的SQL注入\u verify()
我正在创建一个网站,我想阻止SQL注入的发生。我有一个获取POST数据的代码,通过MYSQL查询来检查它。然后运行mysqli_num_rows()函数,然后执行密码验证() 这是我的密码:Php 带有密码的SQL注入\u verify(),php,sql,mysqli,Php,Sql,Mysqli,我正在创建一个网站,我想阻止SQL注入的发生。我有一个获取POST数据的代码,通过MYSQL查询来检查它。然后运行mysqli_num_rows()函数,然后执行密码验证() 这是我的密码: <?php $Username = $_POST['Username']; $Password = $_POST['Password']; $Connect = mysqli_connect('localhost', 'user', 'pass', 'DB'); $sql = "SELECT * FR
<?php
$Username = $_POST['Username'];
$Password = $_POST['Password'];
$Connect = mysqli_connect('localhost', 'user', 'pass', 'DB');
$sql = "SELECT * FROM table WHERE Username = '$Username'";
$output = mysqli_query($Connect, $sql);
if (mysqli_num_rows($output) > 0) {
while($row = mysqli_fetch_assoc($output)) {
if (password_verify($Password, $row['Password'])) {
$_SESSION = $row;
header('Location: Account.php');
} else {
echo 'Invalid Username or Password';
}
}
} else {
echo 'Invalid Username or Password';
}
?>
我想知道是否有任何方法可以通过SQL注入绕过password\u verify()
函数
是的,经过一段时间。可以使用以下输入将精心编制的数据注入查询结果:
$Username = "' UNION SELECT 1, 'username', 'fake password hash', …, '";
生成查询
SELECT * FROM table WHERE username = ''
UNION SELECT 1, 'username', 'fake password hash', …, ''
这可用于使用密码散列(其密码为攻击者所知)注入包含结果的假行
password\u verify()
不能防止SQL注入。使用预先准备好的语句。您的代码有点可疑。为什么允许重复的用户名?这可能看起来像是一个评论,但它对你提出的问题相当重要。您向我们展示的代码容易被注入。只有当你知道这个问题是可以利用的时候,才去解决它,这不是正确的方法
除了通过提交anything'或'a'='a
强制检查数据库中存储的每个密码之外,攻击者还可以在联合中发送用户名和所选哈希密码-考虑:
SELECT * FROM table
WHERE Username = 'xxx'
UNION SELECT 'root' AS username,
'$6$ErsDojKr$7wXeObXJSXeSRzCWFi0ANfqTPndUGlEp0y1NkhzVl5lWaLibhkEucBklU6j43/JeUPEtLlpRFsFcSOqtEfqRe0'
AS Password'
在正确转义数据的同时,使用mysqli_real_escape_string()或参数绑定修复这两个问题,您仍然应该确保您的用户名是唯一的,并且每次身份验证尝试最多只测试一行。您可以共享代码的最小、完整和可验证版本吗?刚刚完成,请查看