【问题标题】:SQL Injection not working on SQL injection vulnerable forms?SQL 注入不适用于 SQL 注入易受攻击的表单?
【发布时间】:2013-08-31 00:52:12
【问题描述】:

我有以下代码,很容易受到 SQL 注入(我认为?):

$IDquery = mysqli_query($connection, "SELECT `ID` FROM users WHERE username=$usernamelogin");

我没有转义$usernamelogin,这不是参数化查询。这显然需要解决,你不需要指出这一点,这不是这个问题的意义所在。在我修复它之前,我想确保我了解 SQL 注入是如何工作的。因此,我尝试创建一个名为“droptable”的表并将以下内容输入到用户名输入中:

x; DROP TABLE droptable;

我认为应该输入这个 SQL 查询:

SELECT `ID` FROM users WHERE username=x; DROP TABLE droptable;

但是,droptable 仍然存在,并且其中的行保持不变。谁能告诉我为什么?

【问题讨论】:

  • 因为当您在测试后开始确保它的安全时,您使用 mysqli 就已经成功了一半。只需切换到准备好的陈述,你就很好了。 stackoverflow.com/questions/60174/…

标签: php sql sql-injection


【解决方案1】:

mysqli_query() 不支持多查询执行。

【讨论】:

  • 那么这种形式如何容易受到 SQL 注入的攻击呢?
  • sql注入并不意味着“多查询执行”。如果你设法将一些代码注入到查询中 - 它很容易被注入
  • 哦,我明白了。可以将x' or 'username'=$username 之类的东西放入其中,但是这种特定的注入不起作用。这是否意味着现代 SQL 注入不可能删除表(和其他函数,如果它们尚未在查询中调用)?
  • 我只是想更全面地理解这个概念。我读过的所有文字都没有指出不支持多个查询(除了手册,我在那里错过了),所以这是新的。
  • 仍然将某些无关紧要的查询(仅用作示例)与一般概念混淆。再说一遍:SQL 注入的概念是关于注入代码,而不是删除表。
【解决方案2】:

$usernamelogin 周围没有引号,因此当您提供会产生错误的字符串时。添加引号或提供数字

【讨论】:

  • 即使使用引号,SQL 注入似乎也不起作用。我实际上取出了引号,认为它们可能会以某种方式阻止注射。
  • 做你在问题中做的同样的事情,但不是 x 放一个数字
  • 我试过了:32; DROP TABLE droptable; 还是没有掉表?
猜你喜欢
  • 2015-10-03
  • 2019-08-10
  • 2013-05-21
  • 1970-01-01
  • 1970-01-01
  • 2015-03-26
  • 1970-01-01
  • 1970-01-01
  • 2021-09-02
相关资源
最近更新 更多