【问题标题】:Is an SQL Injection possible if input is only treated as a string?如果仅将输入视为字符串,是否可能进行 SQL 注入?
【发布时间】:2014-10-01 14:28:39
【问题描述】:

问题在标题中,但代码示例如下:

HTML:

<form name="input" action="demo_form_action.asp" method="post">
  Username: <input type="text" name="user">
  <input type="submit" value="Submit">
</form>

PHP:

$data['userName'] = $_POST['user'];

$query = "INSERT INTO Persons (value1) VALUES ('$data['userName']')";
mysqli_query($con,$query);

所以基本上我用输入填充数组的一部分,然后将该值放入某个数据库表中。为了澄清我正在使用 Drupal 7 - 稍后在代码中完成:

node_save($data);

但这似乎只是将字符串复制到数据库中。我对 Drupal 7 将如何处理这个问题感兴趣,但也在自定义环境中询问:

如果从表单传递的变量不用作 SQL 查询的一部分,而只是作为字符串写入数据库,是否仍有可能受到 SQL 注入攻击?

当然 - 这不包括在以后读取字符串,然后将其用作查询的一部分。在写完所有这些之后,我认为 - 无论如何都必须使用查询插入字符串,因此只要攻击者知道所使用查询的格式,他们就能够编写一个字符串来操纵它以执行注入攻击(当然,没有任何数据清理)...对不起,如果最初的问题听起来很愚蠢 - 我没有做这么久,只是想我会把它扔在那里。

谢谢,非常感谢!

【问题讨论】:

  • '; DROP TABLE Persons; #
  • 您正在将“外部”数据填充到字符串中,这意味着 PHP 会将数据本身转换为字符串。根据定义,填充到查询字符串中的 ANY 数据可用作注入攻击向量。它可能不实用,可能不容易,但如果它来自外部,则必须将其视为剧毒废物。这也意味着您自己创建的任何数据也可能导致注入攻击。

标签: php mysql drupal-7


【解决方案1】:

但这似乎只是将字符串复制到数据库中。

这不仅仅是“将字符串复制到数据库中”。

在某些可执行代码中使用字符串,然后告诉数据库服务器执行该代码。

它完全容易受到 SQL 注入的攻击。

【讨论】:

  • 是的......这是真的 - 我在打字时更正了自己 - 然后点击了发布...... :(
【解决方案2】:

SQL 注入的要点是这样的查询:

INSERT INTO Persons (value1) VALUES ('$data['userName']')

容易受到用户提交这样的用户名的影响:

something'); DROP TABLE Persons; SELECT 1=('1

导致执行以下查询:

INSERT INTO Persons (value1) VALUES ('something'); DROP TABLE Persons; SELECT 1=('1');

再见,Persons 表! DROP TABLE 也不是唯一的风险。例如,它可以用来绕过对数据库的用户密码检查、泄露敏感数据等。

【讨论】:

    【解决方案3】:

    您似乎并没有真正了解 SQL 注入攻击的工作原理。当您将该变量连接到 SQL 查询字符串中时,除非您已对其进行转义以防止注入,否则它很容易受到攻击,因为生成的连接字符串是数据库执行的命令。

    您应该强烈考虑对此类数据库访问使用参数化的预处理语句。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-27
      • 2014-02-06
      • 2015-07-22
      • 2022-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-06
      相关资源
      最近更新 更多