From 37d8527f177de382a7aaf1d7ccc975090ff2f3f9 Mon Sep 17 00:00:00 2001 From: CyC2018 Date: Wed, 28 Oct 2026 13:35:20 +0800 Subject: [PATCH] =?UTF-8?q?Update=20=E6=94=BB=E5=87=BB=E6=8A=80=E6=9C=AF.m?= =?UTF-8?q?d?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 预处理语句示例的字段名与上文一致,补充用反斜线转义单引号,更新 PHP Magic Quotes 的说明。 --- notes/攻击技术.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/notes/攻击技术.md b/notes/攻击技术.md index 4f3c27d6..598f9307 100644 --- a/notes/攻击技术.md +++ b/notes/攻击技术.md @@ -188,9 +188,9 @@ strSQL = "SELECT * FROM users;" Java 中的 PreparedStatement 是预先编译的 SQL 语句,可以传入适当参数并且多次执行。SQL 语句的结构在预编译时已经确定,传入的参数只会被当作数据,因此可以防止 SQL 注入的发生。 ```java -PreparedStatement stmt = connection.prepareStatement("SELECT * FROM users WHERE userid=? AND password=?"); -stmt.setString(1, userid); -stmt.setString(2, password); +PreparedStatement stmt = connection.prepareStatement("SELECT * FROM users WHERE name = ? AND pw = ?"); +stmt.setString(1, name); +stmt.setString(2, pw); ResultSet rs = stmt.executeQuery(); ``` @@ -204,7 +204,7 @@ Query SELECT * FROM users WHERE name = '1'' OR ''1''=''1' AND pw = '1'' OR '' #### 2. 单引号转换 -将传入的参数中的单引号转换为连续两个单引号。PHP 的 Magic Quotes 曾经自动完成这个功能,但是因为不可靠已经被移除,应该使用数据库驱动提供的转义函数,并且只在无法使用参数化查询时使用。 +将传入的参数中的单引号转换为连续两个单引号,或者在单引号前加反斜线(MySQL 默认两种都支持)。PHP 的 Magic Quotes 曾经自动给单引号等字符加反斜线,但是因为不可靠,已经在 PHP 5.4 中移除,应该使用数据库驱动提供的转义函数,并且只在无法使用参数化查询时使用。 #### 3. 最小权限