PHP MySQLI阻止SQL注入

我已经build立了一个网站,将很快上线,只是有一些关于防止SQL注入的问题,我明白如何使用mysqli_real_escape_string但我只是想知道是否我必须使用所有我得到的variables我的SQL语句,我必须使用它时,我还做select语句还是只插入更新和删除? 还有什么其他的安全性,你会build议我实施之前,我把网站住,预先感谢任何帮助!

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

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

 SELECT col1 FROM t1 WHERE col2 = ? 

? 是一个参数的占位符。 使用mysqli ,你可以使用prepare创build一个准备好的语句,使用bind_param将一个variables(参数)绑定到一个参数,然后用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])"); 

总结:

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

它将在几秒钟内closures,但只是为了使事情顺利

我明白如何使用mysqli_real_escape_string

恐怕你不是。

如果我必须使用我得到的SQL语句的所有variables

当然不。
这个函数只能用来格式化SQLstring

当我正在做select语句的时候,还是只需要插入update和delete?

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

还有什么其他的安全性,你会build议

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