PHP MySQLI防止SQL注入

use*_*765 42 php mysql security mysqli code-injection

我已经建立了一个即将上线的网站,并且有一些关于防止SQL注入的问题,我理解如何使用,mysqli_real_escape_string但我只是想知道我是否必须在我得到的所有变量上使用它SQL语句,当我正在执行select语句时,或者只是在插入更新和删除时,我是否必须使用它?在我将网站上线之前,您还建议我实施其他安全措施,提前感谢您的帮助!

Exp*_*lls 48

无论是读还是写,持久或瞬态,都可以注入任何查询.可以通过结束一个查询并运行单独的查询(可能的mysqli)来执行注入,这使得预期的查询无关紧要.

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

SELECT col1 FROM t1 WHERE col2 = ?
Run Code Online (Sandbox Code Playgroud)

?是参数的占位符.使用mysqli,您可以使用创建预准备语句,使用prepare变量(参数)绑定参数bind_param,然后运行查询execute.你根本不需要消毒这个论点(事实上这样做是有害的). mysqli为你这样做.整个过程将是:

$stmt = mysqli->prepare("SELECT col1 FROM t1 WHERE col2 = ?");
$stmt->bind_param("s", $col2_arg);
$stmt->execute();
Run Code Online (Sandbox Code Playgroud)

参数化查询预准备语句之间也存在重要区别.这个陈述虽然准备好了,但没有参数化,因此很容易被注入:

$stmt = mysqli->prepare("INSERT INTO t1 VALUES ($_POST[user_input])");
Run Code Online (Sandbox Code Playgroud)

总结一下:

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