【问题标题】:How is this code in PHP vulnerable to SQL Injection?PHP 中的这段代码如何容易受到 SQL 注入的影响?
【发布时间】:2023-03-14 18:37:01
【问题描述】:

我知道 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、2 和 3 中的真正问题吗?
  • 没有。过滤器输入不会阻止任何事情。仅仅因为您想不出一种通过看起来像电子邮件地址的东西来利用查询的快速方法,并不意味着其他人不能。您不会将您的安全系统建立在“嗯,不太可能发生”的基础上,而只是使用您已经在正确使用的工具:您正在使用 PDO - 使用占位符。它不会花费您任何费用,并且您可以完全防御注入攻击。
  • 是的,每个查询调用只有一个查询语句。这不是 PDO 限制。这是底层 mysql 驱动程序内置的基本限制,用于防止某些(但绝对不是全部)形式的注入攻击。
  • 我认为这里的问题是人们很乐意帮助保护网站,但他们不太愿意向任何人展示如何利用网站。我敢肯定,人们之前曾问过一些听起来很真实的问题,然后用这些信息来对付某人。我们可能不应该向人们展示这种事情是如何完成的,如果他们还不知道,就不要告诉他们

标签: php sql sql-injection


【解决方案1】:

首先,$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 的内容,以返回您不打算返回给用户的数据。

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

【讨论】:

  • 我会赞成,因为这很有用,但这不是我现在正在寻找的答案。
  • @MarkGoebs 我回答了你所有的三个问题。什么鬼?
  • 其实你是对的。我会接受它,但我真正想要的是一个示例,表明我的数据库的其他表在使用这种不良做法时很容易受到攻击。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-16
  • 2015-04-17
  • 1970-01-01
  • 2022-01-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多