PHP MySQLI 预防 SQL 注入攻击
PHP MySQLI 预防 SQL 注入攻击
这个问题已在这里有答案:
我建立了一个即将上线的网站,关于如何防止SQL注入有几个问题,我知道如何使用mysqli_real_escape_string
,但我想知道我是否必须在所有我获取的用于我的SQL语句的变量上使用它,以及在进行select语句时是否必须使用它,还是仅在insert、update和delete上使用?另外,在我将网站上线之前,您还推荐我实施哪些其他安全措施?非常感谢任何帮助!
admin 更改状态以发布 2023年5月25日
无论是读操作还是写操作、持久性操作还是短暂性操作,都可能会发生查询注入。注入可以通过结束一个查询并运行另一个查询(在mysqli
中可能是可行的)来执行。从外部源(无论是来自用户还是内部)输入到查询中的任何内容应视为查询的参数。查询中的所有参数都需要被参数化。这将导致一个适当参数化的查询,您可以从中创建一个准备好的语句,并使用参数执行。例如:
SELECT col1 FROM t1 WHERE col2 = ?
?
是参数的占位符。使用mysqli
,您可以使用prepare
创建一个准备好的语句,使用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])");
总之:
- 所有的查询都应该被适当地参数化(除非它们没有参数)。
- 将所有的查询参数视为尽可能敌对的,无论它们的来源如何。