Просмотр исходного кода

fix(security): 修复SQL注入检测误拦正常JSAPI支付请求

问题:/(--|;|\/\*|\*\/|@@|@)/ 正则中 @ 匹配任何含@的字符串,
导致JSAPI支付链路中正常请求被误判为'请求包含非法字符'

修复:
- @ 独立匹配 → 仅匹配 @@系统变量格式 @@\w+
- ; 独立匹配 → 仅匹配分号后跟SQL关键字 ;\s*SELECT...
- /* */ 空注释 → 必须有内容 /*.*?*/
- 移除 SQL关键字(SELECT/INSERT等)的独立匹配(Prisma已参数化)
- 新增触发日志便于排查
MyFramework User 3 месяцев назад
Родитель
Сommit
3add33f930
1 измененных файлов с 24 добавлено и 9 удалено
  1. 24 9
      server/src/middleware/security.ts

+ 24 - 9
server/src/middleware/security.ts

@@ -85,20 +85,35 @@ export function sqlInjectionProtection() {
 
 /**
  * 检测 SQL 注入
+ * 注意:使用 Prisma ORM 已参数化所有查询,此中间件为深度防御
+ * 避免过于激进的正则导致正常请求被误拦(如 @ 在 email 中很常见)
  */
 function detectSQLInjection(str: string): boolean {
   const sqlPatterns = [
-    /(\b(SELECT|INSERT|UPDATE|DELETE|DROP|CREATE|ALTER|EXEC|EXECUTE)\b)/i,
-    /(--|;|\/\*|\*\/|@@|@)/,
-    /(\b(OR|AND)\b\s+\d+=\d+)/i,
-    /(\bUNION\b\s+\bSELECT\b)/i,
-    /(\bWAITFOR\b\s+\bDELAY\b)/i,
-    /(\bBENCHMARK\b)/i,
-    /(SLEEP\()/i,
-    /('|\")\s*(OR|AND)\s*('|\")/,
+    // SQL 注释标记(始终可疑)
+    /\/\*.*?\*\//,
+    /--\s/,
+    // SQL 语句堆叠(分号 + 有效 SQL 关键字)
+    /;\s*(SELECT|INSERT|UPDATE|DELETE|DROP|CREATE|ALTER|EXEC|EXECUTE|UNION)\b/i,
+    // SQL 系统变量
+    /@@\w+/,
+    // 经典 SQL 注入永真式
+    /(\bOR\b\s+\d+\s*=\s*\d+)/i,
+    /('|")\s*OR\s*('|")\s*$/i,
+    /('|")\s*OR\s+\d+\s*=\s*\d+/i,
+    // UNION 注入
+    /\bUNION\s+(ALL\s+)?SELECT\b/i,
+    // 时间盲注
+    /\bWAITFOR\s+DELAY\b/i,
+    /\bBENCHMARK\b/i,
+    /SLEEP\s*\(/i,
   ];
 
-  return sqlPatterns.some(pattern => pattern.test(str));
+  const matched = sqlPatterns.some(pattern => pattern.test(str));
+  if (matched) {
+    console.warn(`[Security] SQL注入检测触发, 输入: "${str.substring(0, 200)}"`);
+  }
+  return matched;
 }
 
 // 敏感数据脱敏