PHP的MySQLI防止SQL注入
这个问题在这里已经有了答案:
任何查询都可以注入,无论是读取还是写入,持久还是瞬态。 注入可以通过结束一个查询并运行一个单独的(可能与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