PHP的MySQLI防止SQL注入

这个问题在这里已经有了答案:

  • 我如何防止PHP中的SQL注入? 28个答案

  • 任何查询都可以注入,无论是读取还是写入,持久还是瞬态。 注入可以通过结束一个查询并运行一个单独的(可能与mysqli )来执行,这使得预期的查询不相关。

    对来自外部源的查询的任何输入(无论是来自用户还是来自内部的输入)都应被视为查询的参数,以及查询上下文中的参数。 查询中的任何参数都需要参数化。 这导致了一个正确的参数化查询,您可以创建一个准备好的语句并使用参数执行。 例如:

    SELECT col1 FROM t1 WHERE col2 = ?
    

    ? 是参数的占位符。 使用mysqli ,您可以使用prepare创建一个mysqli准备语句,使用bind_param将变量(参数)绑定到参数,然后使用execute运行查询。 根本没有必要清理论证(实际上这样做是不利的)。 mysqli为你做到这一点。 整个过程将是:

    $stmt = mysqli->prepare("SELECT col1 FROM t1 WHERE col2 = ?");
    $stmt->bind_param("s", $col2_arg);
    $stmt->execute();
    

    参数化查询和预准备语句之间也有一个重要区别。 这一陈述虽然有所准备,但没有参数化,因此很容易被注入:

    $stmt = mysqli->prepare("INSERT INTO t1 VALUES ($_POST[user_input])");
    

    总结:

  • 所有查询都应该正确参数化(除非它们没有参数)
  • 无论其来源如何,对查询的所有论据都应该被视为敌对

  • 它会在几秒钟内关闭,但只是为了让事情顺利

    我明白如何使用mysqli_real_escape_string

    恐怕你不是。

    如果我必须在我为SQL语句获得的所有变量上使用它

    当然不。
    此功能必须使用格式化只有 SQL字符串

    当我正在执行select语句时还是仅仅在插入更新和删除时,是否必须使用它?

    ANY SQL语句。 但是,不是“使用mysqli_real_escape_string”,而是完全正确地格式化文字

    另外你会推荐什么其他安全性

    关于SQL的安全性 - 你必须正确地格式化字符串,而不是任何形式的文字。 并且每个都需要不同的一组格式规则

    链接地址: http://www.djcxy.com/p/16725.html

    上一篇: PHP MySQLI Prevent SQL Injection

    下一篇: real escape string and PDO