关于mysql:PHP MySQLI防止SQL注入

PHP MySQLI Prevent SQL Injection

本问题已经有最佳答案,请猛点这里访问。

我已经建立了一个即将上线的网站,关于防止SQL注入有几个问题,我知道如何使用mysqli_real_escape_string,但我只是想知道我是否必须在我的SQL语句中得到的所有变量上使用它,当我同时执行select语句或只执行insert update和delet时是否必须使用它。E?另外,在我将网站上线之前,您还建议我实施什么其他安全措施,提前感谢您的帮助!


任何查询都可以被注入,不管是读还是写,持久的还是暂时的。注入可以通过结束一个查询并运行一个单独的查询来执行(可以使用mysqli),这使得预期的查询不相关。

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

1
SELECT col1 FROM t1 WHERE col2 = ?

?是参数的占位符。使用mysqli可以使用prepare创建一条准备好的语句,使用bind_param将变量(参数)绑定到参数,并使用execute运行查询。你根本不必消除争论(事实上这样做是有害的)。mysqli是为你做的。整个过程将是:

1
2
3
$stmt = mysqli->prepare("SELECT col1 FROM t1 WHERE col2 = ?");
$stmt->bind_param("s", $col2_arg);
$stmt->execute();

参数化查询和准备好的语句之间还有一个重要的区别。此语句在准备时不是参数化的,因此容易被注入:

1
$stmt = mysqli->prepare("INSERT INTO t1 VALUES ($_POST[user_input])");

总结:

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


它几秒钟后就关闭了,但只是为了把事情弄清楚

I understand how to use mysqli_real_escape_string

恐怕你没有。

if I have to use that on all variables that I'm getting for my SQL statement

当然不是。此函数只能用于格式化SQL字符串

do I have to use it when I'm doing select statements also or just on insert update and delete?

任何SQL语句。但同样,不是"使用mysqli_real_escape_string",而是完全正确地格式化文本

Also what other security would you recommend

关于SQL安全性-您不仅必须正确格式化字符串,还必须正确格式化任何类型的文本。每个都需要一组不同的格式规则