Php 带有密码的SQL注入\u verify()

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

我正在创建一个网站,我想阻止SQL注入的发生。我有一个获取POST数据的代码,通过MYSQL查询来检查它。然后运行mysqli_num_rows()函数,然后执行密码验证()

这是我的密码:

<?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()或参数绑定修复这两个问题,您仍然应该确保您的用户名是唯一的,并且每次身份验证尝试最多只测试一行。

您可以共享代码的最小、完整和可验证版本吗?刚刚完成,请查看