PHP MySQLI Prevent SQL Injection
我已经建立了一个即将上线的网站,关于防止SQL注入有几个问题,我知道如何使用
任何查询都可以被注入,不管是读还是写,持久的还是暂时的。注入可以通过结束一个查询并运行一个单独的查询来执行(可以使用
任何来自外部源(无论是来自用户还是内部)的查询输入都应被视为查询的参数,以及查询上下文中的参数。查询中的任何参数都需要参数化。这将导致一个正确参数化的查询,您可以从中创建一个准备好的语句并使用参数执行。例如:
1 | SELECT col1 FROM t1 WHERE col2 = ? |
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安全性-您不仅必须正确格式化字符串,还必须正确格式化任何类型的文本。每个都需要一组不同的格式规则