xypriss 2.2.6 → 2.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/mods/security/src/algorithms/hash-algorithms.js +9 -5
- package/dist/cjs/mods/security/src/algorithms/hash-algorithms.js.map +1 -1
- package/dist/cjs/mods/security/src/components/cache/cacheSys.utils.js +9 -5
- package/dist/cjs/mods/security/src/components/cache/cacheSys.utils.js.map +1 -1
- package/dist/cjs/mods/security/src/components/cache/index.js +9 -5
- package/dist/cjs/mods/security/src/components/cache/index.js.map +1 -1
- package/dist/cjs/mods/security/src/components/fortified-function/index.js +8 -4
- package/dist/cjs/mods/security/src/components/fortified-function/index.js.map +1 -1
- package/dist/cjs/mods/security/src/components/fortified-function/security/security-handler.js +9 -5
- package/dist/cjs/mods/security/src/components/fortified-function/security/security-handler.js.map +1 -1
- package/dist/cjs/mods/security/src/index.js +9 -5
- package/dist/cjs/mods/security/src/index.js.map +1 -1
- package/dist/cjs/src/middleware/XyPrissMiddlewareAPI.js +87 -30
- package/dist/cjs/src/middleware/XyPrissMiddlewareAPI.js.map +1 -1
- package/dist/cjs/src/middleware/built-in/BuiltInMiddleware.js +320 -0
- package/dist/cjs/src/middleware/built-in/BuiltInMiddleware.js.map +1 -0
- package/dist/cjs/src/middleware/built-in/security/CommandInjectionDetector.js +215 -0
- package/dist/cjs/src/middleware/built-in/security/CommandInjectionDetector.js.map +1 -0
- package/dist/cjs/src/middleware/built-in/security/LDAPInjectionDetector.js +96 -0
- package/dist/cjs/src/middleware/built-in/security/LDAPInjectionDetector.js.map +1 -0
- package/dist/cjs/src/middleware/built-in/security/PathTraversalDetector.js +212 -0
- package/dist/cjs/src/middleware/built-in/security/PathTraversalDetector.js.map +1 -0
- package/dist/cjs/src/middleware/built-in/security/SQLInjectionDetector.js +335 -0
- package/dist/cjs/src/middleware/built-in/security/SQLInjectionDetector.js.map +1 -0
- package/dist/cjs/src/middleware/built-in/security/XXEProtector.js +175 -0
- package/dist/cjs/src/middleware/built-in/security/XXEProtector.js.map +1 -0
- package/dist/cjs/src/middleware/security-middleware.js +249 -132
- package/dist/cjs/src/middleware/security-middleware.js.map +1 -1
- package/dist/cjs/src/plugins/modules/index.js +8 -4
- package/dist/cjs/src/plugins/modules/index.js.map +1 -1
- package/dist/cjs/src/server/FastServer.js +49 -32
- package/dist/cjs/src/server/FastServer.js.map +1 -1
- package/dist/cjs/src/server/ServerFactory.js +34 -1
- package/dist/cjs/src/server/ServerFactory.js.map +1 -1
- package/dist/cjs/src/server/components/multi-server/MultiServerManager.js +11 -2
- package/dist/cjs/src/server/components/multi-server/MultiServerManager.js.map +1 -1
- package/dist/cjs/src/server/const/default.js +15 -1
- package/dist/cjs/src/server/const/default.js.map +1 -1
- package/dist/esm/mods/security/src/algorithms/hash-algorithms.js +9 -5
- package/dist/esm/mods/security/src/algorithms/hash-algorithms.js.map +1 -1
- package/dist/esm/mods/security/src/components/cache/cacheSys.utils.js +9 -5
- package/dist/esm/mods/security/src/components/cache/cacheSys.utils.js.map +1 -1
- package/dist/esm/mods/security/src/components/cache/index.js +9 -5
- package/dist/esm/mods/security/src/components/cache/index.js.map +1 -1
- package/dist/esm/mods/security/src/components/fortified-function/index.js +8 -4
- package/dist/esm/mods/security/src/components/fortified-function/index.js.map +1 -1
- package/dist/esm/mods/security/src/components/fortified-function/security/security-handler.js +9 -5
- package/dist/esm/mods/security/src/components/fortified-function/security/security-handler.js.map +1 -1
- package/dist/esm/mods/security/src/index.js +9 -5
- package/dist/esm/mods/security/src/index.js.map +1 -1
- package/dist/esm/src/middleware/XyPrissMiddlewareAPI.js +75 -18
- package/dist/esm/src/middleware/XyPrissMiddlewareAPI.js.map +1 -1
- package/dist/esm/src/middleware/built-in/BuiltInMiddleware.js +318 -0
- package/dist/esm/src/middleware/built-in/BuiltInMiddleware.js.map +1 -0
- package/dist/esm/src/middleware/built-in/security/CommandInjectionDetector.js +213 -0
- package/dist/esm/src/middleware/built-in/security/CommandInjectionDetector.js.map +1 -0
- package/dist/esm/src/middleware/built-in/security/LDAPInjectionDetector.js +94 -0
- package/dist/esm/src/middleware/built-in/security/LDAPInjectionDetector.js.map +1 -0
- package/dist/esm/src/middleware/built-in/security/PathTraversalDetector.js +210 -0
- package/dist/esm/src/middleware/built-in/security/PathTraversalDetector.js.map +1 -0
- package/dist/esm/src/middleware/built-in/security/SQLInjectionDetector.js +333 -0
- package/dist/esm/src/middleware/built-in/security/SQLInjectionDetector.js.map +1 -0
- package/dist/esm/src/middleware/built-in/security/XXEProtector.js +173 -0
- package/dist/esm/src/middleware/built-in/security/XXEProtector.js.map +1 -0
- package/dist/esm/src/middleware/security-middleware.js +248 -131
- package/dist/esm/src/middleware/security-middleware.js.map +1 -1
- package/dist/esm/src/plugins/modules/index.js +8 -4
- package/dist/esm/src/plugins/modules/index.js.map +1 -1
- package/dist/esm/src/server/FastServer.js +50 -33
- package/dist/esm/src/server/FastServer.js.map +1 -1
- package/dist/esm/src/server/ServerFactory.js +34 -1
- package/dist/esm/src/server/ServerFactory.js.map +1 -1
- package/dist/esm/src/server/components/multi-server/MultiServerManager.js +11 -2
- package/dist/esm/src/server/components/multi-server/MultiServerManager.js.map +1 -1
- package/dist/esm/src/server/const/default.js +15 -1
- package/dist/esm/src/server/const/default.js.map +1 -1
- package/dist/index.d.ts +895 -39
- package/package.json +2 -2
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Path Traversal Detection Module
|
|
5
|
+
*
|
|
6
|
+
* Detects and prevents directory traversal attacks with intelligent
|
|
7
|
+
* false positive avoidance for legitimate file paths
|
|
8
|
+
*/
|
|
9
|
+
class PathTraversalDetector {
|
|
10
|
+
constructor(config = {}) {
|
|
11
|
+
// High-risk path traversal patterns
|
|
12
|
+
this.highRiskPatterns = [
|
|
13
|
+
// Classic traversal with multiple levels
|
|
14
|
+
/(\.\.[\/\\]){2,}/g,
|
|
15
|
+
// URL encoded traversal
|
|
16
|
+
/(%2e%2e[\/\\]|%2e%2e%2f|%2e%2e%5c)/gi,
|
|
17
|
+
// Double URL encoded
|
|
18
|
+
/(%252e%252e[\/\\]|%252e%252e%252f)/gi,
|
|
19
|
+
// Unicode/UTF-8 encoded
|
|
20
|
+
/(\.\.%c0%af|\.\.%c1%9c)/gi,
|
|
21
|
+
// Null byte injection
|
|
22
|
+
/\.\.[\/\\].*%00/g,
|
|
23
|
+
// Absolute paths (Unix/Windows)
|
|
24
|
+
/^(\/|\\\\|[a-zA-Z]:\\)/,
|
|
25
|
+
// System directories
|
|
26
|
+
/(\/etc\/|\/proc\/|\/sys\/|\/dev\/|C:\\Windows\\|C:\\Program Files\\)/gi,
|
|
27
|
+
// Traversal with encoded slashes
|
|
28
|
+
/\.\.(%2f|%5c)/gi,
|
|
29
|
+
];
|
|
30
|
+
// Medium-risk patterns (context-dependent)
|
|
31
|
+
this.mediumRiskPatterns = [
|
|
32
|
+
// Single parent directory reference
|
|
33
|
+
/\.\.[\/\\]/g,
|
|
34
|
+
// Hidden files (Unix)
|
|
35
|
+
/\/\.[^\/]+/g,
|
|
36
|
+
// Backup files
|
|
37
|
+
/\.(bak|backup|old|tmp|swp)$/gi,
|
|
38
|
+
// Config files
|
|
39
|
+
/\.(conf|config|ini|env)$/gi,
|
|
40
|
+
];
|
|
41
|
+
this.config = {
|
|
42
|
+
enabled: config.enabled ?? true,
|
|
43
|
+
strictMode: config.strictMode ?? false,
|
|
44
|
+
logAttempts: config.logAttempts ?? true,
|
|
45
|
+
blockOnDetection: config.blockOnDetection ?? true,
|
|
46
|
+
falsePositiveThreshold: config.falsePositiveThreshold ?? 0.6,
|
|
47
|
+
customPatterns: config.customPatterns ?? [],
|
|
48
|
+
allowedPaths: config.allowedPaths ?? [],
|
|
49
|
+
allowedExtensions: config.allowedExtensions ?? ['.jpg', '.png', '.pdf', '.txt'],
|
|
50
|
+
maxDepth: config.maxDepth ?? 3,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Detect path traversal attempts
|
|
55
|
+
*/
|
|
56
|
+
detect(path, context) {
|
|
57
|
+
if (!path || typeof path !== 'string') {
|
|
58
|
+
return {
|
|
59
|
+
isMalicious: false,
|
|
60
|
+
confidence: 0,
|
|
61
|
+
detectedPatterns: [],
|
|
62
|
+
riskLevel: 'LOW',
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
const result = {
|
|
66
|
+
isMalicious: false,
|
|
67
|
+
confidence: 0,
|
|
68
|
+
detectedPatterns: [],
|
|
69
|
+
sanitizedInput: path,
|
|
70
|
+
riskLevel: 'LOW',
|
|
71
|
+
};
|
|
72
|
+
// Check if path is in allowed paths
|
|
73
|
+
if (this.isAllowedPath(path)) {
|
|
74
|
+
return result;
|
|
75
|
+
}
|
|
76
|
+
// High-risk pattern detection
|
|
77
|
+
let highRiskScore = 0;
|
|
78
|
+
this.highRiskPatterns.forEach((pattern, index) => {
|
|
79
|
+
const matches = path.match(pattern);
|
|
80
|
+
if (matches) {
|
|
81
|
+
const patternName = this.getHighRiskPatternName(index);
|
|
82
|
+
result.detectedPatterns.push(`${patternName}: ${matches.join(', ')}`);
|
|
83
|
+
highRiskScore += 0.8;
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
// Medium-risk pattern detection
|
|
87
|
+
let mediumRiskScore = 0;
|
|
88
|
+
this.mediumRiskPatterns.forEach((pattern) => {
|
|
89
|
+
const matches = path.match(pattern);
|
|
90
|
+
if (matches) {
|
|
91
|
+
mediumRiskScore += 0.2 * matches.length;
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
// Calculate depth
|
|
95
|
+
const depth = this.calculatePathDepth(path);
|
|
96
|
+
if (depth > this.config.maxDepth) {
|
|
97
|
+
result.detectedPatterns.push(`Excessive depth: ${depth}`);
|
|
98
|
+
mediumRiskScore += 0.3;
|
|
99
|
+
}
|
|
100
|
+
// Legitimacy checks
|
|
101
|
+
const legitimacyScore = this.calculateLegitimacyScore(path);
|
|
102
|
+
// Calculate final confidence
|
|
103
|
+
result.confidence = Math.max(0, highRiskScore + mediumRiskScore * 0.4 - legitimacyScore);
|
|
104
|
+
result.confidence = Math.min(result.confidence, 1.0);
|
|
105
|
+
// Determine risk level
|
|
106
|
+
if (result.confidence >= 0.8) {
|
|
107
|
+
result.riskLevel = 'CRITICAL';
|
|
108
|
+
result.isMalicious = true;
|
|
109
|
+
}
|
|
110
|
+
else if (result.confidence >= this.config.falsePositiveThreshold) {
|
|
111
|
+
result.riskLevel = 'HIGH';
|
|
112
|
+
result.isMalicious = true;
|
|
113
|
+
}
|
|
114
|
+
else if (result.confidence >= 0.3) {
|
|
115
|
+
result.riskLevel = 'MEDIUM';
|
|
116
|
+
result.isMalicious = false;
|
|
117
|
+
}
|
|
118
|
+
// Sanitize path
|
|
119
|
+
if (result.confidence >= 0.3) {
|
|
120
|
+
result.sanitizedInput = this.sanitizePath(path);
|
|
121
|
+
}
|
|
122
|
+
// Log attempts
|
|
123
|
+
if (this.config.logAttempts && result.confidence >= 0.7) {
|
|
124
|
+
this.logAttempt(path, result);
|
|
125
|
+
}
|
|
126
|
+
return result;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Sanitize path by removing traversal sequences
|
|
130
|
+
*/
|
|
131
|
+
sanitizePath(path) {
|
|
132
|
+
let sanitized = path;
|
|
133
|
+
// Remove all traversal sequences
|
|
134
|
+
sanitized = sanitized.replace(/\.\.[\/\\]/g, '');
|
|
135
|
+
// Remove URL encoded traversal
|
|
136
|
+
sanitized = sanitized.replace(/%2e%2e[\/\\%]/gi, '');
|
|
137
|
+
// Remove null bytes
|
|
138
|
+
sanitized = sanitized.replace(/%00/g, '');
|
|
139
|
+
// Normalize slashes
|
|
140
|
+
sanitized = sanitized.replace(/[\\]/g, '/');
|
|
141
|
+
// Remove duplicate slashes
|
|
142
|
+
sanitized = sanitized.replace(/\/+/g, '/');
|
|
143
|
+
// Remove leading slash if present
|
|
144
|
+
sanitized = sanitized.replace(/^\//, '');
|
|
145
|
+
return sanitized;
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Check if path is in allowed paths
|
|
149
|
+
*/
|
|
150
|
+
isAllowedPath(path) {
|
|
151
|
+
return this.config.allowedPaths.some(allowed => path.startsWith(allowed));
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Calculate path depth
|
|
155
|
+
*/
|
|
156
|
+
calculatePathDepth(path) {
|
|
157
|
+
const normalized = path.replace(/[\\]/g, '/');
|
|
158
|
+
const parts = normalized.split('/').filter(p => p && p !== '.');
|
|
159
|
+
return parts.length;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Calculate legitimacy score
|
|
163
|
+
*/
|
|
164
|
+
calculateLegitimacyScore(path) {
|
|
165
|
+
let score = 0;
|
|
166
|
+
// Check for allowed extensions
|
|
167
|
+
const hasAllowedExt = this.config.allowedExtensions.some(ext => path.toLowerCase().endsWith(ext));
|
|
168
|
+
if (hasAllowedExt) {
|
|
169
|
+
score += 0.3;
|
|
170
|
+
}
|
|
171
|
+
// Simple filename pattern (no traversal)
|
|
172
|
+
if (/^[a-zA-Z0-9_\-\.]+$/.test(path)) {
|
|
173
|
+
score += 0.3;
|
|
174
|
+
}
|
|
175
|
+
// Reasonable path depth
|
|
176
|
+
const depth = this.calculatePathDepth(path);
|
|
177
|
+
if (depth <= 2) {
|
|
178
|
+
score += 0.2;
|
|
179
|
+
}
|
|
180
|
+
return Math.min(score, 0.5);
|
|
181
|
+
}
|
|
182
|
+
getHighRiskPatternName(index) {
|
|
183
|
+
const names = [
|
|
184
|
+
'Multiple traversal sequences',
|
|
185
|
+
'URL encoded traversal',
|
|
186
|
+
'Double URL encoded traversal',
|
|
187
|
+
'Unicode encoded traversal',
|
|
188
|
+
'Null byte injection',
|
|
189
|
+
'Absolute path',
|
|
190
|
+
'System directory access',
|
|
191
|
+
'Encoded slash traversal',
|
|
192
|
+
];
|
|
193
|
+
return names[index] || `High-risk pattern ${index}`;
|
|
194
|
+
}
|
|
195
|
+
logAttempt(path, result) {
|
|
196
|
+
console.warn('[PathTraversal] Attack detected:', {
|
|
197
|
+
timestamp: new Date().toISOString(),
|
|
198
|
+
path: path.substring(0, 100),
|
|
199
|
+
confidence: result.confidence,
|
|
200
|
+
patterns: result.detectedPatterns,
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
updateConfig(newConfig) {
|
|
204
|
+
this.config = { ...this.config, ...newConfig };
|
|
205
|
+
}
|
|
206
|
+
getConfig() {
|
|
207
|
+
return { ...this.config };
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
module.exports = PathTraversalDetector;
|
|
212
|
+
//# sourceMappingURL=PathTraversalDetector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PathTraversalDetector.js","sources":["../../../../../../src/middleware/built-in/security/PathTraversalDetector.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
class SQLInjectionDetector {
|
|
4
|
+
constructor(config = {}) {
|
|
5
|
+
// High-confidence SQL injection patterns (more specific to reduce false positives)
|
|
6
|
+
this.highRiskPatterns = [
|
|
7
|
+
// Union attacks with SELECT
|
|
8
|
+
/(\s|^)(union|UNION)(\s)+(all\s+)?(select|SELECT)/gi,
|
|
9
|
+
// SQL comments at end of input or before SQL keywords
|
|
10
|
+
/(--|#|\/\*).*?(select|union|drop|delete|insert|update|create|alter)/gi,
|
|
11
|
+
/;(\s)*--.*/gi,
|
|
12
|
+
// Enhanced boolean injections (more comprehensive)
|
|
13
|
+
/(\s|^)(or|OR)(\s)+('?\d+'?\s*=\s*'?\d+'?|'[^']*'\s*=\s*'[^']*'|true|false)/gi,
|
|
14
|
+
/(\s|^)(and|AND)(\s)+('?\d+'?\s*=\s*'?\d+'?|'[^']*'\s*=\s*'[^']*'|true|false)/gi,
|
|
15
|
+
// Quote-based boolean injections
|
|
16
|
+
/'(\s)+(or|OR|and|AND)(\s)+'/gi,
|
|
17
|
+
// Comment-obfuscated patterns
|
|
18
|
+
/\/\*.*?\*\/(or|OR|and|AND)\/\*.*?\*\//gi,
|
|
19
|
+
// Time-based with specific syntax (enhanced)
|
|
20
|
+
/(sleep|SLEEP|waitfor|WAITFOR|delay|DELAY)\s*\(.*?\)/gi,
|
|
21
|
+
/(waitfor|WAITFOR)\s+(delay|DELAY)\s+'/gi,
|
|
22
|
+
// System stored procedures
|
|
23
|
+
/(exec|EXEC|execute|EXECUTE)\s+(sp_|xp_)\w+/gi,
|
|
24
|
+
// Information schema with specific queries
|
|
25
|
+
/(information_schema|INFORMATION_SCHEMA)\.(tables|columns|schemata)/gi,
|
|
26
|
+
// Dangerous DDL operations with semicolons
|
|
27
|
+
/;(\s)*(drop|DROP|delete|DELETE|truncate|TRUNCATE)\s+(table|database)/gi,
|
|
28
|
+
// Hex encoding of common injection strings
|
|
29
|
+
/0x(27|22|5C|2D|2D)/gi, // ', ", \, --
|
|
30
|
+
// Multiple quotes for quote breaking
|
|
31
|
+
/('{3,}|"{3,})/g,
|
|
32
|
+
// Stacked queries with dangerous operations
|
|
33
|
+
/;(\s)*(drop|delete|insert|update|create|alter)(\s)+/gi,
|
|
34
|
+
];
|
|
35
|
+
// Medium risk patterns (require context analysis)
|
|
36
|
+
this.mediumRiskPatterns = [
|
|
37
|
+
// Single SQL keywords (common in legitimate text)
|
|
38
|
+
/\b(select|union|drop|delete|insert|update|create|alter)\b/gi,
|
|
39
|
+
// Simple OR/AND conditions
|
|
40
|
+
/\b(or|and)\s+\w+\s*=\s*\w+/gi,
|
|
41
|
+
// Single quotes or double quotes
|
|
42
|
+
/'/g,
|
|
43
|
+
/"/g,
|
|
44
|
+
// Basic SQL comments
|
|
45
|
+
/(--|#)/g,
|
|
46
|
+
// Wildcards
|
|
47
|
+
/[%_]/g,
|
|
48
|
+
];
|
|
49
|
+
// Characters that are suspicious in certain contexts
|
|
50
|
+
this.contextSensitiveChars = /[';\"\\%_]/g;
|
|
51
|
+
this.config = {
|
|
52
|
+
strictMode: config.strictMode ?? false,
|
|
53
|
+
allowedChars: config.allowedChars ?? /^[a-zA-Z0-9\s\-@.!?,()]+$/,
|
|
54
|
+
maxLength: config.maxLength ?? 1000,
|
|
55
|
+
logAttempts: config.logAttempts ?? true,
|
|
56
|
+
contextualAnalysis: config.contextualAnalysis ?? true,
|
|
57
|
+
falsePositiveThreshold: config.falsePositiveThreshold ?? 0.6,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Main detection method with improved false positive handling
|
|
62
|
+
*/
|
|
63
|
+
detect(input, context) {
|
|
64
|
+
if (!input || typeof input !== "string") {
|
|
65
|
+
return {
|
|
66
|
+
isMalicious: false,
|
|
67
|
+
confidence: 0,
|
|
68
|
+
detectedPatterns: [],
|
|
69
|
+
riskLevel: "LOW",
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
const result = {
|
|
73
|
+
isMalicious: false,
|
|
74
|
+
confidence: 0,
|
|
75
|
+
detectedPatterns: [],
|
|
76
|
+
sanitizedInput: input,
|
|
77
|
+
riskLevel: "LOW",
|
|
78
|
+
};
|
|
79
|
+
// Check input length (very long inputs are suspicious)
|
|
80
|
+
if (input.length > this.config.maxLength) {
|
|
81
|
+
result.confidence += 0.2; // Reduced penalty for length
|
|
82
|
+
result.detectedPatterns.push("Excessive length");
|
|
83
|
+
}
|
|
84
|
+
// High-risk pattern analysis (strong indicators)
|
|
85
|
+
let highRiskScore = 0;
|
|
86
|
+
this.highRiskPatterns.forEach((pattern, index) => {
|
|
87
|
+
const matches = input.match(pattern);
|
|
88
|
+
if (matches) {
|
|
89
|
+
const patternName = this.getHighRiskPatternName(index);
|
|
90
|
+
result.detectedPatterns.push(`${patternName}: ${matches.join(", ")}`);
|
|
91
|
+
highRiskScore += this.getHighRiskPatternWeight(index);
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
// Medium-risk pattern analysis (context-dependent)
|
|
95
|
+
let mediumRiskScore = 0;
|
|
96
|
+
if (this.config.contextualAnalysis) {
|
|
97
|
+
mediumRiskScore = this.analyzeContext(input, context || "");
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
// Basic medium risk analysis without context
|
|
101
|
+
this.mediumRiskPatterns.forEach((pattern, index) => {
|
|
102
|
+
const matches = input.match(pattern);
|
|
103
|
+
if (matches) {
|
|
104
|
+
mediumRiskScore += 0.1 * matches.length; // Lower weight for medium risk
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
// Contextual analysis for legitimate use cases
|
|
109
|
+
const legitimacyScore = this.calculateLegitimacyScore(input);
|
|
110
|
+
// Calculate confidence with false positive mitigation
|
|
111
|
+
const rawScore = highRiskScore + mediumRiskScore * 0.3;
|
|
112
|
+
result.confidence = Math.max(0, rawScore - legitimacyScore);
|
|
113
|
+
result.confidence = Math.min(result.confidence, 1.0);
|
|
114
|
+
// Determine risk level and malicious status
|
|
115
|
+
if (result.confidence >= 0.8) {
|
|
116
|
+
result.riskLevel = "CRITICAL";
|
|
117
|
+
result.isMalicious = true;
|
|
118
|
+
}
|
|
119
|
+
else if (result.confidence >= this.config.falsePositiveThreshold) {
|
|
120
|
+
result.riskLevel = "HIGH";
|
|
121
|
+
result.isMalicious = true;
|
|
122
|
+
}
|
|
123
|
+
else if (result.confidence >= 0.3) {
|
|
124
|
+
result.riskLevel = "MEDIUM";
|
|
125
|
+
result.isMalicious = false; // Don't block medium risk by default
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
result.riskLevel = "LOW";
|
|
129
|
+
result.isMalicious = false;
|
|
130
|
+
}
|
|
131
|
+
// Log only high confidence attempts
|
|
132
|
+
if (this.config.logAttempts && result.confidence >= 0.7) {
|
|
133
|
+
this.logAttempt(input, result);
|
|
134
|
+
}
|
|
135
|
+
// Provide sanitized version only for high-risk inputs
|
|
136
|
+
if (result.confidence >= 0.4) {
|
|
137
|
+
result.sanitizedInput = this.smartSanitize(input);
|
|
138
|
+
}
|
|
139
|
+
return result;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Analyze context to reduce false positives
|
|
143
|
+
*/
|
|
144
|
+
analyzeContext(input, context) {
|
|
145
|
+
let score = 0;
|
|
146
|
+
// Check for legitimate business contexts
|
|
147
|
+
const businessContexts = [
|
|
148
|
+
"search",
|
|
149
|
+
"filter",
|
|
150
|
+
"name",
|
|
151
|
+
"description",
|
|
152
|
+
"comment",
|
|
153
|
+
"review",
|
|
154
|
+
"address",
|
|
155
|
+
"title",
|
|
156
|
+
"content",
|
|
157
|
+
"message",
|
|
158
|
+
"email",
|
|
159
|
+
];
|
|
160
|
+
const isBusinessContext = businessContexts.some((ctx) => context.toLowerCase().includes(ctx));
|
|
161
|
+
this.mediumRiskPatterns.forEach((pattern, index) => {
|
|
162
|
+
const matches = input.match(pattern);
|
|
163
|
+
if (matches) {
|
|
164
|
+
let patternScore = 0.1 * matches.length;
|
|
165
|
+
// Reduce score for legitimate contexts
|
|
166
|
+
if (isBusinessContext) {
|
|
167
|
+
patternScore *= 0.3; // Reduce by 70%
|
|
168
|
+
}
|
|
169
|
+
// Special handling for common false positives
|
|
170
|
+
if (index === 0 && isBusinessContext) {
|
|
171
|
+
// SQL keywords in business text
|
|
172
|
+
patternScore *= 0.1; // Very low weight for SQL keywords in business context
|
|
173
|
+
}
|
|
174
|
+
if (index === 2 || index === 3) {
|
|
175
|
+
// Single quotes in names, descriptions
|
|
176
|
+
if (context.includes("name") ||
|
|
177
|
+
context.includes("description")) {
|
|
178
|
+
patternScore *= 0.2;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
score += patternScore;
|
|
182
|
+
}
|
|
183
|
+
});
|
|
184
|
+
return score;
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Calculate legitimacy score to offset false positives
|
|
188
|
+
*/
|
|
189
|
+
calculateLegitimacyScore(input) {
|
|
190
|
+
let legitimacyScore = 0;
|
|
191
|
+
// Natural language indicators
|
|
192
|
+
const naturalWords = input.match(/\b[a-zA-Z]{3,}\b/g);
|
|
193
|
+
if (naturalWords && naturalWords.length > 2) {
|
|
194
|
+
legitimacyScore += 0.2; // Looks like natural text
|
|
195
|
+
}
|
|
196
|
+
// Check for common legitimate patterns
|
|
197
|
+
const legitimatePatterns = [
|
|
198
|
+
/^[A-Z][a-z]+\s[A-Z][a-z]+$/, // First Last name
|
|
199
|
+
/^[\w\.-]+@[\w\.-]+\.\w+$/, // Email
|
|
200
|
+
/^\d{1,5}\s\w+(\s\w+)*$/, // Address format
|
|
201
|
+
/^[A-Za-z0-9\s\-.,!?()]+$/, // Normal text with punctuation
|
|
202
|
+
];
|
|
203
|
+
legitimatePatterns.forEach((pattern) => {
|
|
204
|
+
if (pattern.test(input)) {
|
|
205
|
+
legitimacyScore += 0.15;
|
|
206
|
+
}
|
|
207
|
+
});
|
|
208
|
+
// Length-based legitimacy (very short or very specific lengths are more suspicious)
|
|
209
|
+
if (input.length > 10 && input.length < 200) {
|
|
210
|
+
legitimacyScore += 0.1;
|
|
211
|
+
}
|
|
212
|
+
// Check for balanced quotes (legitimate text often has balanced quotes)
|
|
213
|
+
const singleQuotes = (input.match(/'/g) || []).length;
|
|
214
|
+
const doubleQuotes = (input.match(/"/g) || []).length;
|
|
215
|
+
if (singleQuotes % 2 === 0 && doubleQuotes % 2 === 0) {
|
|
216
|
+
legitimacyScore += 0.1;
|
|
217
|
+
}
|
|
218
|
+
return Math.min(legitimacyScore, 0.5); // Cap legitimacy score
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Smart sanitization that preserves legitimate content
|
|
222
|
+
*/
|
|
223
|
+
smartSanitize(input) {
|
|
224
|
+
if (!input)
|
|
225
|
+
return input;
|
|
226
|
+
let sanitized = input;
|
|
227
|
+
// Only remove obvious SQL injection patterns, not all SQL keywords
|
|
228
|
+
sanitized = sanitized.replace(/(--|#).*$/gm, ""); // Remove comment tails
|
|
229
|
+
sanitized = sanitized.replace(/\/\*.*?\*\//g, ""); // Remove /* */ comments
|
|
230
|
+
// Only escape quotes if they appear to be part of injection attempts
|
|
231
|
+
const suspiciousQuotes = /'(\s*(or|and|union|select)\s|;|\s*--)/gi;
|
|
232
|
+
sanitized = sanitized.replace(suspiciousQuotes, "''$1");
|
|
233
|
+
// Remove only dangerous control characters
|
|
234
|
+
sanitized = sanitized.replace(/[\x00\x1a]/g, "");
|
|
235
|
+
// Only remove semicolons if followed by SQL keywords
|
|
236
|
+
sanitized = sanitized.replace(/;(\s)*(drop|delete|insert|update|create|alter|union|select)/gi, " $2");
|
|
237
|
+
return sanitized.trim();
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Validate and sanitize input, throwing error if malicious
|
|
241
|
+
*/
|
|
242
|
+
validateAndSanitize(input, throwOnDetection = false) {
|
|
243
|
+
const result = this.detect(input);
|
|
244
|
+
if (result.isMalicious && throwOnDetection) {
|
|
245
|
+
throw new Error(`SQL injection attempt detected. Confidence: ${(result.confidence * 100).toFixed(1)}%. ` +
|
|
246
|
+
`Patterns: ${result.detectedPatterns.join(", ")}`);
|
|
247
|
+
}
|
|
248
|
+
return result.sanitizedInput || "";
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Create parameterized query helper
|
|
252
|
+
*/
|
|
253
|
+
createParameterizedQuery(query, params) {
|
|
254
|
+
// Simple parameterization helper
|
|
255
|
+
let parameterizedQuery = query;
|
|
256
|
+
const safeParams = [];
|
|
257
|
+
params.forEach((param, index) => {
|
|
258
|
+
if (typeof param === "string") {
|
|
259
|
+
const result = this.detect(param);
|
|
260
|
+
if (result.isMalicious) {
|
|
261
|
+
throw new Error(`Parameter ${index} contains potential SQL injection`);
|
|
262
|
+
}
|
|
263
|
+
safeParams.push(result.sanitizedInput);
|
|
264
|
+
}
|
|
265
|
+
else {
|
|
266
|
+
safeParams.push(param);
|
|
267
|
+
}
|
|
268
|
+
});
|
|
269
|
+
return { query: parameterizedQuery, params: safeParams };
|
|
270
|
+
}
|
|
271
|
+
getHighRiskPatternName(index) {
|
|
272
|
+
const names = [
|
|
273
|
+
"Union-Select attack",
|
|
274
|
+
"Commented injection",
|
|
275
|
+
"Comment with semicolon",
|
|
276
|
+
"Enhanced boolean OR",
|
|
277
|
+
"Enhanced boolean AND",
|
|
278
|
+
"Quote-based boolean",
|
|
279
|
+
"Comment-obfuscated injection",
|
|
280
|
+
"Time-based delay",
|
|
281
|
+
"WAITFOR delay attack",
|
|
282
|
+
"System procedure call",
|
|
283
|
+
"Information schema query",
|
|
284
|
+
"DDL with semicolon",
|
|
285
|
+
"Hex-encoded injection",
|
|
286
|
+
"Quote sequence attack",
|
|
287
|
+
"Stacked query attack",
|
|
288
|
+
];
|
|
289
|
+
return names[index] || `High-risk pattern ${index}`;
|
|
290
|
+
}
|
|
291
|
+
getHighRiskPatternWeight(index) {
|
|
292
|
+
// Higher weights for more definitive attack patterns
|
|
293
|
+
const weights = [
|
|
294
|
+
0.9, // Union-Select attack
|
|
295
|
+
0.8, // Commented injection
|
|
296
|
+
0.7, // Comment with semicolon
|
|
297
|
+
0.8, // Enhanced boolean OR
|
|
298
|
+
0.8, // Enhanced boolean AND
|
|
299
|
+
0.7, // Quote-based boolean
|
|
300
|
+
0.8, // Comment-obfuscated injection
|
|
301
|
+
0.9, // Time-based delay
|
|
302
|
+
0.8, // WAITFOR delay attack
|
|
303
|
+
0.8, // System procedure call
|
|
304
|
+
0.7, // Information schema query
|
|
305
|
+
0.9, // DDL with semicolon
|
|
306
|
+
0.6, // Hex-encoded injection
|
|
307
|
+
0.5, // Quote sequence attack
|
|
308
|
+
0.8, // Stacked query attack
|
|
309
|
+
];
|
|
310
|
+
return weights[index] || 0.7;
|
|
311
|
+
}
|
|
312
|
+
logAttempt(input, result) {
|
|
313
|
+
console.warn(`SQL Injection Attempt Detected:`, {
|
|
314
|
+
timestamp: new Date().toISOString(),
|
|
315
|
+
input: input.substring(0, 100) + (input.length > 100 ? "..." : ""),
|
|
316
|
+
confidence: result.confidence,
|
|
317
|
+
patterns: result.detectedPatterns,
|
|
318
|
+
});
|
|
319
|
+
}
|
|
320
|
+
/**
|
|
321
|
+
* Update configuration
|
|
322
|
+
*/
|
|
323
|
+
updateConfig(newConfig) {
|
|
324
|
+
this.config = { ...this.config, ...newConfig };
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* Get current configuration
|
|
328
|
+
*/
|
|
329
|
+
getConfig() {
|
|
330
|
+
return { ...this.config };
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
module.exports = SQLInjectionDetector;
|
|
335
|
+
//# sourceMappingURL=SQLInjectionDetector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SQLInjectionDetector.js","sources":["../../../../../../src/middleware/built-in/security/SQLInjectionDetector.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|