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的文字。 而且每个都需要不同的一组格式规则