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被记录为"不执行任何操作"。

其次,PDO的查询功能似乎确实支持多个语句(尽管使用起来相当烦人,我不能说我个人玩过它)。PHP PDO 多选查询始终删除最后一个行集

第三,即使没有多语句支持,也可以填充$email之类的内容nobody@example.com' OR username='admin以返回您不打算返回给用户的数据。

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