PHP 中的这段代码如何容易受到 SQL 注入的攻击?

How is this code in PHP vulnerable to SQL Injection?

我了解 SQL 注入的基础知识以及如何避免注入。 我知道我的代码容易受到攻击,但我正在尝试注入 SQL 但它不起作用。这是关于了解它是如何脆弱的,因为在实践中,我做不到。

这是代码:

   $email = filter_input(INPUT_GET, 'email');

   if ($email != '') { 
       try {
           $stm1 = $db->query("SELECT * from clients WHERE email =  '$email'");
           $result = $stm1->fetchAll();
       } catch (Exception $ex) {
           echo $ex->getMessage();
       }
  }

我正在尝试通过此输入进行注入

<input id="textinput" name="email" type="text">

我使用的代码如下:

'; UPDATE clients set status = 0 WHERE client_id = 1

请注意,这是一个有效的 SQL 查询。

我真正的问题是:

  1. 在这种情况下,filter_input 是否阻止了任何事情?
  2. PDO '$query' 函数是否只允许一个语句?
  3. 如果这在这种情况下不易受攻击,是否还有其他情况会受到攻击?

首先,$email = filter_input(INPUT_GET, 'email');$email = filter_input(INPUT_GET, 'email', FILTER_DEFAULT); 相同,不执行任何操作,FILTER_DEFAULT 记录为 "do nothing"。

其次,PDO 的 Query 函数似乎确实支持多语句(尽管使用方式相当烦人,我不能说我亲自玩过)。 PHP PDO multiple select query consistently dropping last rowset

第三,即使没有多语句支持,$email 也可以填充诸如 nobody@example.com' OR username='admin 到 return 之类的数据,而您并未计划 return用户。

从根本上说: 不要再担心糟糕的代码是否可以被利用,而是开始编写好的代码。开始使用正确准备的语句,不再担心注入。