代码之家  ›  专栏  ›  技术社区  ›  Daren Schwenke

使用绑定参数的PHP MySQLi准备的查询是否安全?

  •  5
  • Daren Schwenke  · 技术社区  · 16 年前

    从历史上看,我一直使用

    mysql_real_escape_string()
    

    对于从最终接触数据库的用户派生的所有输入。

    现在我已经完全转换到MySQLi,并且使用带绑定参数的准备好的查询,我是否有效地消除了SQL注入攻击的可能性?

    mysql_real_escape_string()?
    

    http://sourceforge.net/projects/mysqldoneright/files/Base/MysqlDoneRight-0.23.tar.gz/download

    这并不是我想弄错的,因为现在我已经发布了它,它也可能影响其他人。

    所有用户提供的输入现在都将在bind_parms中结束。

    3 回复  |  直到 16 年前
        1
  •  6
  •   Bill Karwin    16 年前

    文字值 仅:

    $sql = "SELECT * FROM MyTable WHERE id = ".$_GET["id"]; // not safe
    
    $sql = "SELECT * FROM MyTable WHERE id = ?"; // safe
    

    $sql = "SELECT * FROM MyTable ORDER BY ".$_GET["sortcolumn"]; // not safe
    
    $sql = "SELECT * FROM MyTable ORDER BY ?"; // doesn't work!
    

    参数将始终被解释为值,而不是列标识符。您可以使用运行查询 ORDER BY 'score' ,这与 ORDER BY score ,并使用参数将被解释为前者--常量字符串 'score' ,而不是名为 score .

    因此,在很多情况下,您必须使用动态SQL并在查询中插入应用程序变量以获得所需的结果。在这种情况下,查询参数帮不了你。为了防止SQL注入缺陷,您仍然必须保持警惕并进行代码防御。

    没有任何框架或数据访问库可以为您完成这项工作。您可以始终构造包含SQL注入缺陷的SQL查询字符串,并在数据访问库看到SQL查询之前执行此操作。那么,它如何知道什么是故意的,什么是缺陷呢?

    以下是实现安全SQL查询的方法:

    • 过滤输入。 跟踪插入到SQL查询中的任何变量数据。使用输入 filters

    • 转义输出。 此上下文中的输出可以是发送到数据库服务器的SQL查询。您知道可以对值使用SQL查询参数,但是列名呢?您需要一个用于标识符的转义/引用函数,就像旧的 mysql_real_escape_string() 用于字符串值。

    • 代码审查。 让某人成为你的第二双眼睛,检查你的SQL代码,帮助你找出你忽略使用以上两种技术的地方。

        2
  •  13
  •   Jeff Ober    16 年前

    对使用准备好的查询将转义参数。

        3
  •  1
  •   MattBelanger    16 年前

    当您将参数绑定到准备好的语句时,它会自动转义数据,因此在发送之前不应转义数据。双重逃跑通常是件坏事。至少,它会在以后产生额外转义字符的丑陋结果。

    推荐文章