PHP MySQLI 预防 SQL 注入攻击

34 浏览
0 Comments

PHP MySQLI 预防 SQL 注入攻击

这个问题已在这里有答案

如何在PHP中防止SQL注入?

我建立了一个即将上线的网站,关于如何防止SQL注入有几个问题,我知道如何使用mysqli_real_escape_string,但我想知道我是否必须在所有我获取的用于我的SQL语句的变量上使用它,以及在进行select语句时是否必须使用它,还是仅在insert、update和delete上使用?另外,在我将网站上线之前,您还推荐我实施哪些其他安全措施?非常感谢任何帮助!

admin 更改状态以发布 2023年5月25日
0
0 Comments

无论是读操作还是写操作、持久性操作还是短暂性操作,都可能会发生查询注入。注入可以通过结束一个查询并运行另一个查询(在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])");

总之:

  • 所有的查询都应该被适当地参数化(除非它们没有参数)。
  • 所有的查询参数视为尽可能敌对的,无论它们的来源如何。
0