PHP :为什么这种不正确的请求数据库方式不容易受到攻击



我有这个特定的代码(这是一个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错误语法或其他想法,只能打印"错误"。

要以有用的方式注入 SQL,您需要将参数注入到字符串中,使 SQL 语句有效。简单地注入'不会变成有效的 SQL。(这会导致类似 SELECT * from vulnDB where username = admin and password = '''

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

当您不使用预准备语句,并且将用户输入中的字符串直接打印到执行的 SQL 中时,您很容易受到 SQL 注入的影响。

最新更新