【问题标题】:Basic PHP sql injection question基本的 PHP sql 注入问题
【发布时间】:2011-08-19 15:17:52
【问题描述】:

我一直在对 SQL 注入进行一些研究,到目前为止,我所看到的只是当您将查询字符串与变量连接时,您会遇到问题。

我的问题是/是:

如果我有这个代码:

$query  = "SELECT id, name, inserted, size FROM products";
$result = odbc_exec($conn, $query);

我会受到 sql 注入的影响吗?我不这么认为,但我在 stackoverflow 上发现了一个帖子,表明它是。

如果我有这个代码:

$variable = "name";
$query = "SELECT"' .$variable. ' FROM products";
$reulst = odbc_exec($conn, $query);

我还在坚持注射吗?在我看来,我完全控制了该变量,并且代码在服务器端运行,这样很安全。这是正确的吗?

提前感谢您的任何意见!

【问题讨论】:

  • 没有。如果查询不包含任何用户提供的数据,则无法注入。您的第二个版本容易受到注入,但前提是您提供的数据包含易受攻击的数据。但这不是用户提供的数据,因此“很可能”是安全的。
  • 请注意,您也可以使用以下语法代替$query = "SELECT"' .$variable. ' FROM products";$query = "SELECT '$variable' FROM products";

标签: php mysql sql sql-injection


【解决方案1】:

如果您的输入来自您无法信任的来源,则通常会出现 SQL 注入问题。鉴于您的两个示例都不是这种情况,因此就恶意攻击而言,您没问题。

但是,在将$variable 插入到查询字符串之前,最好将其转义,即使您可以控制它。

【讨论】:

  • 确认了我的倾向。谢谢!
【解决方案2】:

如果您允许任何用户输入到您的查询中,那么您很容易发生 sql 注入。通过提供的两个示例,用户没有输入任何内容,因此它们都是安全的。

【讨论】:

    【解决方案3】:

    第一个查询不会被注入,因为它没有动态部分。

    第二个是。即使您认为您可以完全控制您的变量,但如果您使用的是用户提供的数据(无论是来自表单 sumbit、cookie 等...),您也可能容易受到攻击。

    始终通过 SQL 库使用参数化查询,以确保安全地转义数据。

    【讨论】:

      【解决方案4】:

      查询可以暴露的唯一情况是当部分从输入传递时

      $variable = $_GET["name"];
      $query = "SELECT " .$variable. " FROM products";  // now things can get bad
      $reulst = odbc_exec($conn, $query);
      

      在查询中使用输入变量的一种正确方法是转义它们

      $variable = addslashes($_GET["name"]); // sanitizing input
      $query = "SELECT " .$variable. " FROM products";  // all good here
      $reulst = odbc_exec($conn, $query);
      

      【讨论】:

        【解决方案5】:

        问题是“变量的值从何而来?”如果您在查询中使用用户提交的数据,那么您需要注意如何使用它。就你而言,据我所知,你是安全的。

        【讨论】:

        • 抱歉重复的答案。我们几乎同时点击“提交”。 :-)
        【解决方案6】:

        对于第一个示例,不,您不会受到任何 SQL 注入的影响,因为用户无法输入任何内容来更改您的查询。

        在第二种情况下,只有当$variable 源自某些用户输入时,您才会受到注入。

        【讨论】:

          【解决方案7】:

          任何时候你将用户输入直接输入到你的 $query 中,你都容易受到 sql 注入的影响。您显示的第一个代码很好,它是一个直接查询,用户无法输入任何有害代码。

          $query  = "SELECT id, name, inserted, size FROM products";
          $result = odbc_exec($conn, $query);
          

          但是第二个代码 sn-p(如果 $variable 取自表单)任何人都可以输入有害代码并杀死您的数据库。

          $variable = $_POST['name']; **for instance, this would be bad!
          $query = "SELECT"' .$variable. ' FROM products";
          $reulst = odbc_exec($conn, $query);
          

          $variable 是如何取值的?

          【讨论】:

          • 哇,我开始打字了,当我完成后有 7 个答案!你们真快!!
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-16
          • 1970-01-01
          • 1970-01-01
          • 2015-06-15
          • 1970-01-01
          相关资源
          最近更新 更多