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

时间:2015-01-23 19:42:53

标签: php sql 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. 如果在这种情况下这不容易受到影响,是否还有其他可能容易受到攻击的情况?

1 个答案:

答案 0 :(得分:3)

首先,$email = filter_input(INPUT_GET, 'email');不执行与$email = filter_input(INPUT_GET, 'email', FILTER_DEFAULT);相同的操作,FILTER_DEFAULT被记录为“不执行任何操作”。

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

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

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