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

php:为什么这种不正确的数据库请求方式不易受到攻击,php,sql-injection,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['p

我有这个特定的代码(这是一个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";
}   
当我输入合法值时,代码被正确执行(
欢迎
此密码不正确
),当我输入
时,我到达
错误
子句,但没有打印任何内容,并且此代码似乎对SQLi免疫

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

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

您需要插入类似于
”或密码不为NULL和“=”
(注意:我还没有测试过这一点)的内容来创建有效的攻击


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

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

您需要插入类似于
”或密码不为NULL和“=”
(注意:我还没有测试过这一点)的内容来创建有效的攻击


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

将其放入try-catch应该会返回您没有专门检查的任何错误。至少,您的代码应该回显
错误
字符串,因为您不检查错误,所以无法看到它们。结账Mysqli层不会引发php异常。您是否尝试过实际传入sql命令而不仅仅是
?尝试传递类似于
”的内容;DROP TABLE vulnDB
@jfadich无法工作,因为mysqli\u查询只允许一条语句。(与mysqli_multi_query不同)“适当的保护将包括使用PDO”,不,适当的保护将包括使用准备好的语句,您可以这样做,使用或将其放入try-catch将返回您没有特别检查的任何错误。至少,您的代码应该回显
错误
字符串,因为您不检查错误,所以无法看到它们。结账Mysqli层不会引发php异常。您是否尝试过实际传入sql命令而不仅仅是
?尝试传递类似于
”的内容;DROP TABLE vulnDB
@jfadich无法工作,因为mysqli\u查询只允许一条语句。(与mysqli_multi_query不同)“适当的保护将包括使用PDO”,不,适当的保护将包括使用准备好的语句,您可以使用或