|
|
@@ -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;
|
|
|
}
|
|
|
|
|
|
// 敏感数据脱敏
|