php :为什么这种请求数据库的错误方式不容易受到攻击

php : why this incorrect way of requesting databases is not vulnerable

我有这个特定的代码(这是一个 mwe),我不明白为什么没有 MySQL 在浏览器或 apache 日志文件中打印错误:

$sql= "SELECT * from vulnDB where username = admin and password = '" . $_POST['password'] ."'";

if($result = mysqli_query($conn, $sql)) {
   $row = mysqli_fetch_assoc($result);
   if ($_POST['password'] == $row['password']) {
     echo "Welcome!";
   } else {
     echo "This password is incorrect";
   }   
} else {
   echo "Error";
}   

当我输入合法值时,代码被正确执行(WelcomeThis password is incorrect),当我输入"'时,我到达Error 子句,但没有打印任何内容,这段代码似乎不受 SQLi 的影响。

在 PHP 中是否有一些特殊的保护来避免 SQLi 注入成功? 适当的保护将包括使用 PDO,但我发现这段代码显然很容易受到攻击;并且无法触发 sqli 错误语法或其他人想到的,只打印 "error"。

要以有用的方式注入 SQL,您需要使 SQL 语句有效 并将您的参数注入字符串 。简单地注入 ' 不会变成有效的 SQL。 (结果会是 SELECT * from vulnDB where username = admin and password = '''。)

你需要注入类似 ' OR password IS NOT NULL AND '' = ' 的东西(注意:我还没有测试过这个)来创建一个有效的攻击。

如果您不使用准备好的语句,而是将用户输入的字符串直接打印到要执行的 SQL 中,您很容易受到 SQL 注入攻击。