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

时间:2019-02-07 22:49:37

标签: php sql-injection

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

$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),当我输入"'时,我会到达{{1} }子句,但没有任何内容得到打印,并且此代码似乎不受SQLi的影响。

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

1 个答案:

答案 0 :(得分:3)

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

您需要注入' OR password IS NOT NULL AND '' = '之类的东西(注意:我尚未测试过这种东西)才能产生有效的攻击。<​​/ p>

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