@ibm/ibmi-mcp-server 0.2.0 → 0.3.0
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/README.md +140 -0
- package/dist/config/index.d.ts +2 -0
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +14 -0
- package/dist/config/index.js.map +1 -1
- package/dist/config/resolver.d.ts.map +1 -1
- package/dist/config/resolver.js.map +1 -1
- package/dist/ibmi-mcp-server/tools/executeSql.tool.d.ts +80 -0
- package/dist/ibmi-mcp-server/tools/executeSql.tool.d.ts.map +1 -0
- package/dist/ibmi-mcp-server/tools/executeSql.tool.js +356 -0
- package/dist/ibmi-mcp-server/tools/executeSql.tool.js.map +1 -0
- package/dist/ibmi-mcp-server/tools/generateSql.tool.d.ts +36 -0
- package/dist/ibmi-mcp-server/tools/generateSql.tool.d.ts.map +1 -0
- package/dist/ibmi-mcp-server/tools/generateSql.tool.js +281 -0
- package/dist/ibmi-mcp-server/tools/generateSql.tool.js.map +1 -0
- package/dist/ibmi-mcp-server/tools/index.d.ts +85 -0
- package/dist/ibmi-mcp-server/tools/index.d.ts.map +1 -0
- package/dist/ibmi-mcp-server/tools/index.js +21 -0
- package/dist/ibmi-mcp-server/tools/index.js.map +1 -0
- package/dist/ibmi-mcp-server/utils/config/configParser.d.ts +9 -0
- package/dist/ibmi-mcp-server/utils/config/configParser.d.ts.map +1 -1
- package/dist/ibmi-mcp-server/utils/config/configParser.js +58 -0
- package/dist/ibmi-mcp-server/utils/config/configParser.js.map +1 -1
- package/dist/ibmi-mcp-server/utils/config/toolDefinitions.d.ts +4 -4
- package/dist/ibmi-mcp-server/utils/config/toolDefinitions.d.ts.map +1 -1
- package/dist/ibmi-mcp-server/utils/config/toolDefinitions.js +7 -8
- package/dist/ibmi-mcp-server/utils/config/toolDefinitions.js.map +1 -1
- package/dist/ibmi-mcp-server/utils/config/toolFactory.d.ts +0 -8
- package/dist/ibmi-mcp-server/utils/config/toolFactory.d.ts.map +1 -1
- package/dist/ibmi-mcp-server/utils/config/toolFactory.js +0 -31
- package/dist/ibmi-mcp-server/utils/config/toolFactory.js.map +1 -1
- package/dist/ibmi-mcp-server/utils/config/toolsetManager.d.ts +1 -1
- package/dist/ibmi-mcp-server/utils/config/toolsetManager.d.ts.map +1 -1
- package/dist/ibmi-mcp-server/utils/config/toolsetManager.js +2 -2
- package/dist/ibmi-mcp-server/utils/config/toolsetManager.js.map +1 -1
- package/dist/ibmi-mcp-server/utils/language/document.d.ts +26 -0
- package/dist/ibmi-mcp-server/utils/language/document.d.ts.map +1 -0
- package/dist/ibmi-mcp-server/utils/language/document.js +318 -0
- package/dist/ibmi-mcp-server/utils/language/document.js.map +1 -0
- package/dist/ibmi-mcp-server/utils/language/statement.d.ts +43 -0
- package/dist/ibmi-mcp-server/utils/language/statement.d.ts.map +1 -0
- package/dist/ibmi-mcp-server/utils/language/statement.js +796 -0
- package/dist/ibmi-mcp-server/utils/language/statement.js.map +1 -0
- package/dist/ibmi-mcp-server/utils/language/tokens.d.ts +32 -0
- package/dist/ibmi-mcp-server/utils/language/tokens.d.ts.map +1 -0
- package/dist/ibmi-mcp-server/utils/language/tokens.js +532 -0
- package/dist/ibmi-mcp-server/utils/language/tokens.js.map +1 -0
- package/dist/ibmi-mcp-server/utils/language/types.d.ts +138 -0
- package/dist/ibmi-mcp-server/utils/language/types.d.ts.map +1 -0
- package/dist/ibmi-mcp-server/utils/language/types.js +93 -0
- package/dist/ibmi-mcp-server/utils/language/types.js.map +1 -0
- package/dist/ibmi-mcp-server/utils/security/ibmiSqlParser.d.ts +48 -0
- package/dist/ibmi-mcp-server/utils/security/ibmiSqlParser.d.ts.map +1 -0
- package/dist/ibmi-mcp-server/utils/security/ibmiSqlParser.js +93 -0
- package/dist/ibmi-mcp-server/utils/security/ibmiSqlParser.js.map +1 -0
- package/dist/ibmi-mcp-server/utils/security/sqlSecurityValidator.d.ts +35 -59
- package/dist/ibmi-mcp-server/utils/security/sqlSecurityValidator.d.ts.map +1 -1
- package/dist/ibmi-mcp-server/utils/security/sqlSecurityValidator.js +108 -288
- package/dist/ibmi-mcp-server/utils/security/sqlSecurityValidator.js.map +1 -1
- package/dist/ibmi-mcp-server/utils/security/sqlSecurityValidatorFallback.d.ts +54 -0
- package/dist/ibmi-mcp-server/utils/security/sqlSecurityValidatorFallback.d.ts.map +1 -0
- package/dist/ibmi-mcp-server/utils/security/sqlSecurityValidatorFallback.js +91 -0
- package/dist/ibmi-mcp-server/utils/security/sqlSecurityValidatorFallback.js.map +1 -0
- package/dist/mcp-server/tools/index.d.ts +13 -2
- package/dist/mcp-server/tools/index.d.ts.map +1 -1
- package/dist/mcp-server/tools/index.js +29 -9
- package/dist/mcp-server/tools/index.js.map +1 -1
- package/dist/mcp-server/tools/utils/index.d.ts +7 -0
- package/dist/mcp-server/tools/utils/index.d.ts.map +1 -0
- package/dist/mcp-server/tools/utils/index.js +7 -0
- package/dist/mcp-server/tools/utils/index.js.map +1 -0
- package/dist/mcp-server/tools/utils/tool-factory.d.ts +129 -0
- package/dist/mcp-server/tools/utils/tool-factory.d.ts.map +1 -0
- package/dist/mcp-server/tools/utils/tool-factory.js +179 -0
- package/dist/mcp-server/tools/utils/tool-factory.js.map +1 -0
- package/dist/mcp-server/tools/utils/types.d.ts +117 -0
- package/dist/mcp-server/tools/utils/types.d.ts.map +1 -0
- package/dist/mcp-server/tools/utils/types.js +11 -0
- package/dist/mcp-server/tools/utils/types.js.map +1 -0
- package/dist/mcp-server/transports/core/cleanupTransformStream.d.ts +26 -0
- package/dist/mcp-server/transports/core/cleanupTransformStream.d.ts.map +1 -0
- package/dist/mcp-server/transports/core/cleanupTransformStream.js +60 -0
- package/dist/mcp-server/transports/core/cleanupTransformStream.js.map +1 -0
- package/dist/mcp-server/transports/core/statefulTransportManager.d.ts +1 -1
- package/dist/mcp-server/transports/core/statefulTransportManager.d.ts.map +1 -1
- package/dist/mcp-server/transports/core/statefulTransportManager.js +50 -40
- package/dist/mcp-server/transports/core/statefulTransportManager.js.map +1 -1
- package/dist/mcp-server/transports/core/statelessTransportManager.d.ts +2 -13
- package/dist/mcp-server/transports/core/statelessTransportManager.d.ts.map +1 -1
- package/dist/mcp-server/transports/core/statelessTransportManager.js +35 -62
- package/dist/mcp-server/transports/core/statelessTransportManager.js.map +1 -1
- package/dist/mcp-server/transports/core/transportRequest.d.ts +1 -2
- package/dist/mcp-server/transports/core/transportRequest.d.ts.map +1 -1
- package/dist/mcp-server/transports/http/mcpTransportMiddleware.d.ts.map +1 -1
- package/dist/mcp-server/transports/http/mcpTransportMiddleware.js +1 -3
- package/dist/mcp-server/transports/http/mcpTransportMiddleware.js.map +1 -1
- package/package.json +21 -22
- package/dist/ibmi-mcp-server/tools/executeSql/index.d.ts +0 -9
- package/dist/ibmi-mcp-server/tools/executeSql/index.d.ts.map +0 -1
- package/dist/ibmi-mcp-server/tools/executeSql/index.js +0 -9
- package/dist/ibmi-mcp-server/tools/executeSql/index.js.map +0 -1
- package/dist/ibmi-mcp-server/tools/executeSql/logic.d.ts +0 -51
- package/dist/ibmi-mcp-server/tools/executeSql/logic.d.ts.map +0 -1
- package/dist/ibmi-mcp-server/tools/executeSql/logic.js +0 -179
- package/dist/ibmi-mcp-server/tools/executeSql/logic.js.map +0 -1
- package/dist/ibmi-mcp-server/tools/executeSql/registration.d.ts +0 -52
- package/dist/ibmi-mcp-server/tools/executeSql/registration.d.ts.map +0 -1
- package/dist/ibmi-mcp-server/tools/executeSql/registration.js +0 -161
- package/dist/ibmi-mcp-server/tools/executeSql/registration.js.map +0 -1
- package/dist/ibmi-mcp-server/tools/generateSql/index.d.ts +0 -13
- package/dist/ibmi-mcp-server/tools/generateSql/index.d.ts.map +0 -1
- package/dist/ibmi-mcp-server/tools/generateSql/index.js +0 -13
- package/dist/ibmi-mcp-server/tools/generateSql/index.js.map +0 -1
- package/dist/ibmi-mcp-server/tools/generateSql/logic.d.ts +0 -64
- package/dist/ibmi-mcp-server/tools/generateSql/logic.d.ts.map +0 -1
- package/dist/ibmi-mcp-server/tools/generateSql/logic.js +0 -190
- package/dist/ibmi-mcp-server/tools/generateSql/logic.js.map +0 -1
- package/dist/ibmi-mcp-server/tools/generateSql/registration.d.ts +0 -18
- package/dist/ibmi-mcp-server/tools/generateSql/registration.d.ts.map +0 -1
- package/dist/ibmi-mcp-server/tools/generateSql/registration.js +0 -64
- package/dist/ibmi-mcp-server/tools/generateSql/registration.js.map +0 -1
- package/dist/mcp-server/tools/catFactFetcher/index.d.ts +0 -8
- package/dist/mcp-server/tools/catFactFetcher/index.d.ts.map +0 -1
- package/dist/mcp-server/tools/catFactFetcher/index.js +0 -8
- package/dist/mcp-server/tools/catFactFetcher/index.js.map +0 -1
- package/dist/mcp-server/tools/catFactFetcher/logic.d.ts +0 -52
- package/dist/mcp-server/tools/catFactFetcher/logic.d.ts.map +0 -1
- package/dist/mcp-server/tools/catFactFetcher/logic.js +0 -95
- package/dist/mcp-server/tools/catFactFetcher/logic.js.map +0 -1
- package/dist/mcp-server/tools/catFactFetcher/registration.d.ts +0 -9
- package/dist/mcp-server/tools/catFactFetcher/registration.d.ts.map +0 -1
- package/dist/mcp-server/tools/catFactFetcher/registration.js +0 -43
- package/dist/mcp-server/tools/catFactFetcher/registration.js.map +0 -1
- package/dist/mcp-server/tools/echoTool/index.d.ts +0 -13
- package/dist/mcp-server/tools/echoTool/index.d.ts.map +0 -1
- package/dist/mcp-server/tools/echoTool/index.js +0 -13
- package/dist/mcp-server/tools/echoTool/index.js.map +0 -1
- package/dist/mcp-server/tools/echoTool/logic.d.ts +0 -69
- package/dist/mcp-server/tools/echoTool/logic.d.ts.map +0 -1
- package/dist/mcp-server/tools/echoTool/logic.js +0 -119
- package/dist/mcp-server/tools/echoTool/logic.js.map +0 -1
- package/dist/mcp-server/tools/echoTool/registration.d.ts +0 -9
- package/dist/mcp-server/tools/echoTool/registration.d.ts.map +0 -1
- package/dist/mcp-server/tools/echoTool/registration.js +0 -45
- package/dist/mcp-server/tools/echoTool/registration.js.map +0 -1
- package/dist/mcp-server/tools/imageTest/index.d.ts +0 -7
- package/dist/mcp-server/tools/imageTest/index.d.ts.map +0 -1
- package/dist/mcp-server/tools/imageTest/index.js +0 -7
- package/dist/mcp-server/tools/imageTest/index.js.map +0 -1
- package/dist/mcp-server/tools/imageTest/logic.d.ts +0 -27
- package/dist/mcp-server/tools/imageTest/logic.d.ts.map +0 -1
- package/dist/mcp-server/tools/imageTest/logic.js +0 -44
- package/dist/mcp-server/tools/imageTest/logic.js.map +0 -1
- package/dist/mcp-server/tools/imageTest/registration.d.ts +0 -9
- package/dist/mcp-server/tools/imageTest/registration.d.ts.map +0 -1
- package/dist/mcp-server/tools/imageTest/registration.js +0 -49
- package/dist/mcp-server/tools/imageTest/registration.js.map +0 -1
- package/dist/mcp-server/tools/utils/tool-utils.d.ts +0 -43
- package/dist/mcp-server/tools/utils/tool-utils.d.ts.map +0 -1
- package/dist/mcp-server/tools/utils/tool-utils.js +0 -44
- package/dist/mcp-server/tools/utils/tool-utils.js.map +0 -1
- package/dist/mcp-server/transports/core/headerUtils.d.ts +0 -27
- package/dist/mcp-server/transports/core/headerUtils.d.ts.map +0 -1
- package/dist/mcp-server/transports/core/headerUtils.js +0 -53
- package/dist/mcp-server/transports/core/headerUtils.js.map +0 -1
- package/dist/mcp-server/transports/core/honoNodeBridge.d.ts +0 -77
- package/dist/mcp-server/transports/core/honoNodeBridge.d.ts.map +0 -1
- package/dist/mcp-server/transports/core/honoNodeBridge.js +0 -150
- package/dist/mcp-server/transports/core/honoNodeBridge.js.map +0 -1
- package/dist/services/duck-db/duckDBConnectionManager.d.ts +0 -55
- package/dist/services/duck-db/duckDBConnectionManager.d.ts.map +0 -1
- package/dist/services/duck-db/duckDBConnectionManager.js +0 -184
- package/dist/services/duck-db/duckDBConnectionManager.js.map +0 -1
- package/dist/services/duck-db/duckDBQueryExecutor.d.ts +0 -18
- package/dist/services/duck-db/duckDBQueryExecutor.d.ts.map +0 -1
- package/dist/services/duck-db/duckDBQueryExecutor.js +0 -115
- package/dist/services/duck-db/duckDBQueryExecutor.js.map +0 -1
- package/dist/services/duck-db/duckDBService.d.ts +0 -27
- package/dist/services/duck-db/duckDBService.d.ts.map +0 -1
- package/dist/services/duck-db/duckDBService.js +0 -151
- package/dist/services/duck-db/duckDBService.js.map +0 -1
- package/dist/services/duck-db/types.d.ts +0 -135
- package/dist/services/duck-db/types.d.ts.map +0 -1
- package/dist/services/duck-db/types.js +0 -6
- package/dist/services/duck-db/types.js.map +0 -1
- package/dist/services/llm-providers/openRouterProvider.d.ts +0 -36
- package/dist/services/llm-providers/openRouterProvider.d.ts.map +0 -1
- package/dist/services/llm-providers/openRouterProvider.js +0 -235
- package/dist/services/llm-providers/openRouterProvider.js.map +0 -1
- package/dist/services/supabase/supabaseClient.d.ts +0 -25
- package/dist/services/supabase/supabaseClient.d.ts.map +0 -1
- package/dist/services/supabase/supabaseClient.js +0 -68
- package/dist/services/supabase/supabaseClient.js.map +0 -1
- package/dist/storage/duckdbExample.d.ts +0 -8
- package/dist/storage/duckdbExample.d.ts.map +0 -1
- package/dist/storage/duckdbExample.js +0 -197
- package/dist/storage/duckdbExample.js.map +0 -1
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @fileoverview SQL Security Validator for validating SQL queries against security policies
|
|
3
|
-
*
|
|
3
|
+
* Uses vscode-db2i tokenizer for precise validation and regex patterns as fallback
|
|
4
4
|
*
|
|
5
5
|
* @module src/utils/security/sqlSecurityValidator
|
|
6
6
|
*/
|
|
7
|
-
import pkg from "node-sql-parser";
|
|
8
|
-
const { Parser } = pkg;
|
|
9
7
|
import { logger } from "../../../utils/internal/logger.js";
|
|
10
8
|
import { JsonRpcErrorCode, McpError } from "../../../types-global/errors.js";
|
|
9
|
+
import { IbmiSqlParser } from "./ibmiSqlParser.js";
|
|
10
|
+
import SQLTokeniser from "../../utils/language/tokens.js";
|
|
11
|
+
import { SqlSecurityValidatorFallback } from "./sqlSecurityValidatorFallback.js";
|
|
11
12
|
/**
|
|
12
13
|
* Dangerous SQL operations that should be blocked in read-only mode
|
|
13
14
|
*/
|
|
@@ -16,7 +17,6 @@ export const DANGEROUS_OPERATIONS = [
|
|
|
16
17
|
"INSERT",
|
|
17
18
|
"UPDATE",
|
|
18
19
|
"DELETE",
|
|
19
|
-
"REPLACE",
|
|
20
20
|
"MERGE",
|
|
21
21
|
"TRUNCATE",
|
|
22
22
|
// Schema operations
|
|
@@ -60,45 +60,79 @@ export const DANGEROUS_OPERATIONS = [
|
|
|
60
60
|
"QCMDEXC",
|
|
61
61
|
"SQL_EXECUTE_IMMEDIATE",
|
|
62
62
|
];
|
|
63
|
-
/**
|
|
64
|
-
* Dangerous SQL functions that should be monitored/blocked
|
|
65
|
-
*/
|
|
66
|
-
export const DANGEROUS_FUNCTIONS = [
|
|
67
|
-
"SYSTEM",
|
|
68
|
-
"QCMDEXC",
|
|
69
|
-
"SQL_EXECUTE_IMMEDIATE",
|
|
70
|
-
"SQLCMD",
|
|
71
|
-
"LOAD_EXTENSION",
|
|
72
|
-
"EXEC",
|
|
73
|
-
"EXECUTE_IMMEDIATE",
|
|
74
|
-
"EVAL",
|
|
75
|
-
"CONCAT",
|
|
76
|
-
"CHAR",
|
|
77
|
-
"VARCHAR", // Can be used for dynamic SQL construction
|
|
78
|
-
];
|
|
79
63
|
/**
|
|
80
64
|
* Dangerous SQL patterns that should be detected
|
|
81
65
|
*/
|
|
82
66
|
export const DANGEROUS_PATTERNS = [
|
|
83
|
-
//
|
|
84
|
-
/\bCONCAT\s*\(/i,
|
|
85
|
-
/\b(CHAR|VARCHAR|CLOB)\s*\(/i,
|
|
86
|
-
// System function patterns
|
|
87
|
-
/\bSYSTEM\s*\(/i,
|
|
88
|
-
/\bLOAD_EXTENSION\s*\(/i,
|
|
89
|
-
/\bQCMDEXC\s*\(/i,
|
|
90
|
-
// Comment-based bypass attempts
|
|
91
|
-
/\/\*.*?(DROP|DELETE|INSERT|UPDATE).*?\*\//i,
|
|
92
|
-
// Multiple statement patterns
|
|
67
|
+
// Multiple statement patterns (SQL injection via statement chaining)
|
|
93
68
|
/;\s*(DROP|DELETE|INSERT|UPDATE|CREATE|ALTER)/i,
|
|
94
|
-
// Union-based attacks
|
|
69
|
+
// Union-based attacks (SQL injection via UNION with dangerous operations)
|
|
95
70
|
/\bUNION\s+(ALL\s+)?\s*\(\s*(DROP|DELETE|INSERT|UPDATE)/i,
|
|
71
|
+
// REPLACE statement (MySQL-specific write operation)
|
|
72
|
+
/\bREPLACE\s+INTO\b/i,
|
|
96
73
|
];
|
|
97
74
|
/**
|
|
98
75
|
* SQL Security Validator class for comprehensive SQL security validation
|
|
76
|
+
* Uses token-based validation with vscode-db2i tokenizer as primary method
|
|
99
77
|
*/
|
|
100
78
|
export class SqlSecurityValidator {
|
|
101
|
-
static
|
|
79
|
+
static tokeniser = new SQLTokeniser();
|
|
80
|
+
/**
|
|
81
|
+
* Truncate query string for error messages and logging
|
|
82
|
+
* @param query - SQL query to truncate
|
|
83
|
+
* @param maxLength - Maximum length before truncation (default: 100)
|
|
84
|
+
* @returns Truncated query with ellipsis if needed
|
|
85
|
+
* @private
|
|
86
|
+
*/
|
|
87
|
+
static truncateQuery(query, maxLength = 100) {
|
|
88
|
+
return query.length > maxLength
|
|
89
|
+
? query.substring(0, maxLength) + "..."
|
|
90
|
+
: query;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Throw validation error with standardized format
|
|
94
|
+
* @param message - Error message
|
|
95
|
+
* @param violations - List of violations
|
|
96
|
+
* @param context - Additional context for error
|
|
97
|
+
* @param query - SQL query being validated
|
|
98
|
+
* @throws McpError with ValidationError code
|
|
99
|
+
* @private
|
|
100
|
+
*/
|
|
101
|
+
static throwValidationError(message, violations, context, query) {
|
|
102
|
+
throw new McpError(JsonRpcErrorCode.ValidationError, message, {
|
|
103
|
+
violations,
|
|
104
|
+
...context,
|
|
105
|
+
query: this.truncateQuery(query),
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Validate forbidden keywords using token-based approach
|
|
110
|
+
* This method uses the vscode-db2i tokenizer to precisely identify SQL keywords
|
|
111
|
+
* @param query - SQL query to validate
|
|
112
|
+
* @param forbiddenKeywords - List of forbidden keywords
|
|
113
|
+
* @returns Security validation result
|
|
114
|
+
* @private
|
|
115
|
+
*/
|
|
116
|
+
static validateForbiddenKeywordsToken(query, forbiddenKeywords) {
|
|
117
|
+
const tokens = this.tokeniser.tokenise(query);
|
|
118
|
+
const violations = [];
|
|
119
|
+
// Use Set for O(1) lookup performance
|
|
120
|
+
const forbiddenSet = new Set(forbiddenKeywords.map(kw => kw.toUpperCase()));
|
|
121
|
+
for (const token of tokens) {
|
|
122
|
+
// Skip string literals - only check actual SQL keywords
|
|
123
|
+
if (token.type === "string")
|
|
124
|
+
continue;
|
|
125
|
+
const value = token.value?.toUpperCase();
|
|
126
|
+
if (value && forbiddenSet.has(value)) {
|
|
127
|
+
violations.push(`Forbidden keyword: ${value}`);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return {
|
|
131
|
+
isValid: violations.length === 0,
|
|
132
|
+
violations,
|
|
133
|
+
validationMethod: "combined",
|
|
134
|
+
};
|
|
135
|
+
}
|
|
102
136
|
/**
|
|
103
137
|
* Validate SQL query against security configuration
|
|
104
138
|
* @param query - SQL query to validate
|
|
@@ -137,12 +171,12 @@ export class SqlSecurityValidator {
|
|
|
137
171
|
throw new McpError(JsonRpcErrorCode.ValidationError, `Query exceeds maximum length of ${maxLength} characters`, {
|
|
138
172
|
queryLength: query.length,
|
|
139
173
|
maxLength,
|
|
140
|
-
query:
|
|
174
|
+
query: this.truncateQuery(query),
|
|
141
175
|
});
|
|
142
176
|
}
|
|
143
177
|
}
|
|
144
178
|
/**
|
|
145
|
-
* Validate forbidden keywords using
|
|
179
|
+
* Validate forbidden keywords using token-based approach with regex fallback
|
|
146
180
|
* @param query - SQL query to validate
|
|
147
181
|
* @param securityConfig - Security configuration
|
|
148
182
|
* @param context - Request context for logging
|
|
@@ -153,274 +187,60 @@ export class SqlSecurityValidator {
|
|
|
153
187
|
securityConfig.forbiddenKeywords.length === 0) {
|
|
154
188
|
return;
|
|
155
189
|
}
|
|
156
|
-
// Try AST-based validation first
|
|
157
|
-
const astResult = this.validateForbiddenKeywordsAST(query, securityConfig.forbiddenKeywords, context);
|
|
158
|
-
if (!astResult.isValid) {
|
|
159
|
-
throw new McpError(JsonRpcErrorCode.ValidationError, `Forbidden keywords detected: ${astResult.violations.join(", ")}`, {
|
|
160
|
-
violations: astResult.violations,
|
|
161
|
-
forbiddenKeywords: securityConfig.forbiddenKeywords,
|
|
162
|
-
query: query.substring(0, 100) + (query.length > 100 ? "..." : ""),
|
|
163
|
-
});
|
|
164
|
-
}
|
|
165
|
-
// Fallback to regex validation
|
|
166
|
-
const regexResult = this.validateForbiddenKeywordsRegex(query, securityConfig.forbiddenKeywords);
|
|
167
|
-
if (!regexResult.isValid) {
|
|
168
|
-
throw new McpError(JsonRpcErrorCode.ValidationError, `Forbidden keywords detected: ${regexResult.violations.join(", ")}`, {
|
|
169
|
-
violations: regexResult.violations,
|
|
170
|
-
forbiddenKeywords: securityConfig.forbiddenKeywords,
|
|
171
|
-
query: query.substring(0, 100) + (query.length > 100 ? "..." : ""),
|
|
172
|
-
});
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
/**
|
|
176
|
-
* Validate read-only restrictions using comprehensive validation
|
|
177
|
-
* @param query - SQL query to validate
|
|
178
|
-
* @param context - Request context for logging
|
|
179
|
-
* @private
|
|
180
|
-
*/
|
|
181
|
-
static validateReadOnlyRestrictions(query, context) {
|
|
182
|
-
// Try AST-based validation first (more reliable)
|
|
183
|
-
const astResult = this.validateQueryAST(query, context);
|
|
184
|
-
if (!astResult.isValid) {
|
|
185
|
-
throw new McpError(JsonRpcErrorCode.ValidationError, `Write operations detected: ${astResult.violations.join(", ")}`, {
|
|
186
|
-
violations: astResult.violations,
|
|
187
|
-
readOnly: true,
|
|
188
|
-
query: query.substring(0, 100) + (query.length > 100 ? "..." : ""),
|
|
189
|
-
});
|
|
190
|
-
}
|
|
191
|
-
// Fallback to regex validation for additional coverage
|
|
192
|
-
const regexResult = this.validateQueryRegex(query, context);
|
|
193
|
-
if (!regexResult.isValid) {
|
|
194
|
-
throw new McpError(JsonRpcErrorCode.ValidationError, `Write operations detected: ${regexResult.violations.join(", ")}`, {
|
|
195
|
-
violations: regexResult.violations,
|
|
196
|
-
readOnly: true,
|
|
197
|
-
query: query.substring(0, 100) + (query.length > 100 ? "..." : ""),
|
|
198
|
-
});
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
/**
|
|
202
|
-
* Validate SQL query using AST parsing
|
|
203
|
-
* @param query - SQL query to validate
|
|
204
|
-
* @param context - Request context for logging
|
|
205
|
-
* @private
|
|
206
|
-
*/
|
|
207
|
-
static validateQueryAST(query, context) {
|
|
208
|
-
const violations = [];
|
|
209
190
|
try {
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
for (const statement of statements) {
|
|
218
|
-
if (!statement || typeof statement !== "object")
|
|
219
|
-
continue;
|
|
220
|
-
const objStmt = statement;
|
|
221
|
-
const stmtType = String(objStmt.type || "").toUpperCase();
|
|
222
|
-
// 1. Check top-level statement type
|
|
223
|
-
if (stmtType &&
|
|
224
|
-
DANGEROUS_OPERATIONS.includes(stmtType)) {
|
|
225
|
-
violations.push(`Dangerous statement type: ${stmtType}`);
|
|
226
|
-
}
|
|
227
|
-
// 2. Check for dangerous functions anywhere in the AST
|
|
228
|
-
const dangerousFunctions = this.findDangerousFunctionsInAST(statement);
|
|
229
|
-
if (dangerousFunctions.length > 0) {
|
|
230
|
-
violations.push(...dangerousFunctions.map((f) => `Dangerous function: ${f}`));
|
|
231
|
-
}
|
|
232
|
-
// 3. Check for UNION-based attacks
|
|
233
|
-
if (this.hasUnionWithDangerousStatements(statement)) {
|
|
234
|
-
violations.push("UNION with dangerous statements detected");
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
return {
|
|
238
|
-
isValid: violations.length === 0,
|
|
239
|
-
violations,
|
|
240
|
-
validationMethod: "ast",
|
|
241
|
-
};
|
|
242
|
-
}
|
|
243
|
-
catch (parseError) {
|
|
244
|
-
logger.warning({
|
|
245
|
-
...context,
|
|
246
|
-
error: parseError instanceof Error
|
|
247
|
-
? parseError.message
|
|
248
|
-
: String(parseError),
|
|
249
|
-
queryLength: query.length,
|
|
250
|
-
}, "SQL AST parsing failed, will use regex validation only");
|
|
251
|
-
return {
|
|
252
|
-
isValid: true, // Let regex validation handle it
|
|
253
|
-
violations: [],
|
|
254
|
-
validationMethod: "ast",
|
|
255
|
-
};
|
|
256
|
-
}
|
|
257
|
-
}
|
|
258
|
-
/**
|
|
259
|
-
* Validate SQL query using regex patterns
|
|
260
|
-
* @param query - SQL query to validate
|
|
261
|
-
* @param _context - Request context for logging (unused but kept for consistency)
|
|
262
|
-
* @private
|
|
263
|
-
*/
|
|
264
|
-
static validateQueryRegex(query, _context) {
|
|
265
|
-
const violations = [];
|
|
266
|
-
// Check for dangerous operations
|
|
267
|
-
for (const operation of DANGEROUS_OPERATIONS) {
|
|
268
|
-
const pattern = new RegExp(`\\b${operation}\\b`, "i");
|
|
269
|
-
if (pattern.test(query)) {
|
|
270
|
-
violations.push(`Write operation '${operation}' detected`);
|
|
271
|
-
}
|
|
272
|
-
}
|
|
273
|
-
// Check for dangerous patterns
|
|
274
|
-
for (const pattern of DANGEROUS_PATTERNS) {
|
|
275
|
-
if (pattern.test(query)) {
|
|
276
|
-
violations.push(`Dangerous pattern detected: ${pattern.source}`);
|
|
191
|
+
// Try token-based validation first (more precise)
|
|
192
|
+
const tokenResult = this.validateForbiddenKeywordsToken(query, securityConfig.forbiddenKeywords);
|
|
193
|
+
if (!tokenResult.isValid) {
|
|
194
|
+
this.throwValidationError(`Forbidden keywords detected: ${tokenResult.violations.join(", ")}`, tokenResult.violations, {
|
|
195
|
+
forbiddenKeywords: securityConfig.forbiddenKeywords,
|
|
196
|
+
validatedBy: "token",
|
|
197
|
+
}, query);
|
|
277
198
|
}
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
199
|
+
logger.debug({ ...context, validatedBy: "token" }, "Forbidden keywords validation passed");
|
|
200
|
+
}
|
|
201
|
+
catch (tokenError) {
|
|
202
|
+
// If tokenization fails, fall back to regex validation
|
|
203
|
+
logger.debug({ ...context, error: String(tokenError) }, "Token validation failed, falling back to regex");
|
|
204
|
+
const regexResult = SqlSecurityValidatorFallback.validateForbiddenKeywords(query, securityConfig.forbiddenKeywords, context);
|
|
205
|
+
if (!regexResult.isValid) {
|
|
206
|
+
this.throwValidationError(`Forbidden keywords detected: ${regexResult.violations.join(", ")}`, regexResult.violations, {
|
|
207
|
+
forbiddenKeywords: securityConfig.forbiddenKeywords,
|
|
208
|
+
validatedBy: "regex-fallback",
|
|
209
|
+
}, query);
|
|
284
210
|
}
|
|
285
211
|
}
|
|
286
|
-
return {
|
|
287
|
-
isValid: violations.length === 0,
|
|
288
|
-
violations,
|
|
289
|
-
validationMethod: "regex",
|
|
290
|
-
};
|
|
291
212
|
}
|
|
292
213
|
/**
|
|
293
|
-
* Validate
|
|
214
|
+
* Validate read-only restrictions using IBM i parser with regex fallback
|
|
294
215
|
* @param query - SQL query to validate
|
|
295
|
-
* @param forbiddenKeywords - List of forbidden keywords
|
|
296
216
|
* @param context - Request context for logging
|
|
297
217
|
* @private
|
|
298
218
|
*/
|
|
299
|
-
static
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
219
|
+
static validateReadOnlyRestrictions(query, context) {
|
|
220
|
+
// Try IBM i parser first (understands IBM i syntax and uses vscode-db2i)
|
|
221
|
+
const ibmiResult = IbmiSqlParser.parseQuery(query, context);
|
|
222
|
+
if (ibmiResult.success) {
|
|
223
|
+
// If IBM i parser successfully validated, use its results
|
|
224
|
+
if (!ibmiResult.isReadOnly) {
|
|
225
|
+
this.throwValidationError(`Write operations detected: ${ibmiResult.violations.join(", ")}`, ibmiResult.violations, {
|
|
226
|
+
readOnly: true,
|
|
227
|
+
validatedBy: "ibmi-vscode",
|
|
228
|
+
}, query);
|
|
307
229
|
}
|
|
308
|
-
}
|
|
309
|
-
catch (parseError) {
|
|
310
230
|
logger.debug({
|
|
311
231
|
...context,
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
}
|
|
323
|
-
/**
|
|
324
|
-
* Validate forbidden keywords using regex patterns
|
|
325
|
-
* @param query - SQL query to validate
|
|
326
|
-
* @param forbiddenKeywords - List of forbidden keywords
|
|
327
|
-
* @private
|
|
328
|
-
*/
|
|
329
|
-
static validateForbiddenKeywordsRegex(query, forbiddenKeywords) {
|
|
330
|
-
const violations = [];
|
|
331
|
-
for (const keyword of forbiddenKeywords) {
|
|
332
|
-
const pattern = new RegExp(`\\b${keyword.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}\\b`, "i");
|
|
333
|
-
if (pattern.test(query)) {
|
|
334
|
-
violations.push(`Forbidden keyword: ${keyword}`);
|
|
335
|
-
}
|
|
336
|
-
}
|
|
337
|
-
return {
|
|
338
|
-
isValid: violations.length === 0,
|
|
339
|
-
violations,
|
|
340
|
-
validationMethod: "regex",
|
|
341
|
-
};
|
|
342
|
-
}
|
|
343
|
-
/**
|
|
344
|
-
* Find dangerous functions anywhere in the AST
|
|
345
|
-
* @param node - AST node to analyze
|
|
346
|
-
* @private
|
|
347
|
-
*/
|
|
348
|
-
static findDangerousFunctionsInAST(node) {
|
|
349
|
-
const violations = [];
|
|
350
|
-
if (!node || typeof node !== "object")
|
|
351
|
-
return violations;
|
|
352
|
-
const objNode = node;
|
|
353
|
-
// Check if this node is a function call
|
|
354
|
-
if (objNode.type === "function" && objNode.name) {
|
|
355
|
-
const funcName = String(objNode.name).toUpperCase();
|
|
356
|
-
if (DANGEROUS_FUNCTIONS.includes(funcName)) {
|
|
357
|
-
violations.push(funcName);
|
|
358
|
-
}
|
|
359
|
-
}
|
|
360
|
-
// Recursively check all properties
|
|
361
|
-
for (const key in objNode) {
|
|
362
|
-
const value = objNode[key];
|
|
363
|
-
if (Array.isArray(value)) {
|
|
364
|
-
value.forEach((item) => violations.push(...this.findDangerousFunctionsInAST(item)));
|
|
365
|
-
}
|
|
366
|
-
else if (typeof value === "object") {
|
|
367
|
-
violations.push(...this.findDangerousFunctionsInAST(value));
|
|
368
|
-
}
|
|
369
|
-
}
|
|
370
|
-
return violations;
|
|
371
|
-
}
|
|
372
|
-
/**
|
|
373
|
-
* Find forbidden keywords anywhere in the AST
|
|
374
|
-
* @param node - AST node to analyze
|
|
375
|
-
* @param forbiddenKeywords - List of forbidden keywords
|
|
376
|
-
* @private
|
|
377
|
-
*/
|
|
378
|
-
static findForbiddenKeywordsInAST(node, forbiddenKeywords) {
|
|
379
|
-
const violations = [];
|
|
380
|
-
if (!node || typeof node !== "object")
|
|
381
|
-
return violations;
|
|
382
|
-
const objNode = node;
|
|
383
|
-
// Check string values for forbidden keywords
|
|
384
|
-
for (const key in objNode) {
|
|
385
|
-
const value = objNode[key];
|
|
386
|
-
if (typeof value === "string") {
|
|
387
|
-
for (const keyword of forbiddenKeywords) {
|
|
388
|
-
const pattern = new RegExp(`\\b${keyword.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}\\b`, "i");
|
|
389
|
-
if (pattern.test(value)) {
|
|
390
|
-
violations.push(keyword);
|
|
391
|
-
}
|
|
392
|
-
}
|
|
393
|
-
}
|
|
394
|
-
else if (Array.isArray(value)) {
|
|
395
|
-
value.forEach((item) => violations.push(...this.findForbiddenKeywordsInAST(item, forbiddenKeywords)));
|
|
396
|
-
}
|
|
397
|
-
else if (typeof value === "object") {
|
|
398
|
-
violations.push(...this.findForbiddenKeywordsInAST(value, forbiddenKeywords));
|
|
399
|
-
}
|
|
400
|
-
}
|
|
401
|
-
return violations;
|
|
402
|
-
}
|
|
403
|
-
/**
|
|
404
|
-
* Check for UNION with dangerous statements
|
|
405
|
-
* @param statement - AST statement to check
|
|
406
|
-
* @private
|
|
407
|
-
*/
|
|
408
|
-
static hasUnionWithDangerousStatements(statement) {
|
|
409
|
-
if (!statement || typeof statement !== "object")
|
|
410
|
-
return false;
|
|
411
|
-
const stmt = statement;
|
|
412
|
-
// Check if this is a UNION statement
|
|
413
|
-
if (stmt.type === "select" && stmt.union) {
|
|
414
|
-
// Check each part of the union
|
|
415
|
-
const unionParts = Array.isArray(stmt.union) ? stmt.union : [stmt.union];
|
|
416
|
-
for (const part of unionParts) {
|
|
417
|
-
const partObj = part;
|
|
418
|
-
if (partObj.type && String(partObj.type).toUpperCase() !== "SELECT") {
|
|
419
|
-
return true;
|
|
420
|
-
}
|
|
421
|
-
}
|
|
232
|
+
validatedBy: "ibmi-vscode",
|
|
233
|
+
statementTypes: ibmiResult.statementTypes,
|
|
234
|
+
}, "Read-only validation passed using IBM i vscode parser");
|
|
235
|
+
return; // Success - skip regex fallback
|
|
236
|
+
}
|
|
237
|
+
// Fall back to regex validation
|
|
238
|
+
logger.debug({ ...context }, "Falling back to regex validation for read-only check");
|
|
239
|
+
const regexResult = SqlSecurityValidatorFallback.validateReadOnly(query, context);
|
|
240
|
+
if (!regexResult.isValid) {
|
|
241
|
+
this.throwValidationError(`Write operations detected: ${regexResult.violations.join(", ")}`, regexResult.violations, { readOnly: true, validatedBy: "regex-fallback" }, query);
|
|
422
242
|
}
|
|
423
|
-
|
|
243
|
+
logger.debug({ ...context, validatedBy: "regex-fallback" }, "Read-only validation passed via regex fallback");
|
|
424
244
|
}
|
|
425
245
|
}
|
|
426
246
|
//# sourceMappingURL=sqlSecurityValidator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqlSecurityValidator.js","sourceRoot":"","sources":["../../../../src/ibmi-mcp-server/utils/security/sqlSecurityValidator.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sqlSecurityValidator.js","sourceRoot":"","sources":["../../../../src/ibmi-mcp-server/utils/security/sqlSecurityValidator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AAEpD,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAEtE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,YAAY,MAAM,4CAA4C,CAAC;AACtE,OAAO,EAAE,4BAA4B,EAAE,MAAM,mCAAmC,CAAC;AAcjF;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,oBAAoB;IACpB,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,OAAO;IACP,UAAU;IACV,oBAAoB;IACpB,MAAM;IACN,QAAQ;IACR,OAAO;IACP,QAAQ;IACR,oBAAoB;IACpB,MAAM;IACN,MAAM;IACN,SAAS;IACT,KAAK;IACL,SAAS;IACT,sBAAsB;IACtB,OAAO;IACP,QAAQ;IACR,MAAM;IACN,gBAAgB;IAChB,MAAM;IACN,QAAQ;IACR,QAAQ;IACR,MAAM;IACN,iBAAiB;IACjB,UAAU;IACV,SAAS;IACT,MAAM;IACN,MAAM;IACN,OAAO;IACP,iBAAiB;IACjB,QAAQ;IACR,SAAS;IACT,MAAM;IACN,UAAU;IACV,MAAM;IACN,QAAQ;IACR,mDAAmD;IACnD,QAAQ;IACR,UAAU;IACV,WAAW;IACX,iBAAiB;IACjB,SAAS;IACT,uBAAuB;CACf,CAAC;AAEX;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,qEAAqE;IACrE,+CAA+C;IAC/C,0EAA0E;IAC1E,yDAAyD;IACzD,qDAAqD;IACrD,qBAAqB;CACb,CAAC;AAEX;;;GAGG;AACH,MAAM,OAAO,oBAAoB;IACvB,MAAM,CAAC,SAAS,GAAG,IAAI,YAAY,EAAE,CAAC;IAE9C;;;;;;OAMG;IACK,MAAM,CAAC,aAAa,CAAC,KAAa,EAAE,SAAS,GAAG,GAAG;QACzD,OAAO,KAAK,CAAC,MAAM,GAAG,SAAS;YAC7B,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,SAAS,CAAC,GAAG,KAAK;YACvC,CAAC,CAAC,KAAK,CAAC;IACZ,CAAC;IAED;;;;;;;;OAQG;IACK,MAAM,CAAC,oBAAoB,CACjC,OAAe,EACf,UAAoB,EACpB,OAAgC,EAChC,KAAa;QAEb,MAAM,IAAI,QAAQ,CAAC,gBAAgB,CAAC,eAAe,EAAE,OAAO,EAAE;YAC5D,UAAU;YACV,GAAG,OAAO;YACV,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;SACjC,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;OAOG;IACK,MAAM,CAAC,8BAA8B,CAC3C,KAAa,EACb,iBAA2B;QAE3B,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC9C,MAAM,UAAU,GAAa,EAAE,CAAC;QAEhC,sCAAsC;QACtC,MAAM,YAAY,GAAG,IAAI,GAAG,CAC1B,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,CAC9C,CAAC;QAEF,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,wDAAwD;YACxD,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;gBAAE,SAAS;YAEtC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,WAAW,EAAE,CAAC;YACzC,IAAI,KAAK,IAAI,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;gBACrC,UAAU,CAAC,IAAI,CAAC,sBAAsB,KAAK,EAAE,CAAC,CAAC;YACjD,CAAC;QACH,CAAC;QAED,OAAO;YACL,OAAO,EAAE,UAAU,CAAC,MAAM,KAAK,CAAC;YAChC,UAAU;YACV,gBAAgB,EAAE,UAAU;SAC7B,CAAC;IACJ,CAAC;IAED;;;;;;OAMG;IACH,MAAM,CAAC,aAAa,CAClB,KAAa,EACb,cAAqC,EACrC,OAAuB;QAEvB,MAAM,CAAC,KAAK,CACV;YACE,GAAG,OAAO;YACV,WAAW,EAAE,KAAK,CAAC,MAAM;YACzB,QAAQ,EAAE,cAAc,CAAC,QAAQ;YACjC,cAAc,EAAE,cAAc,CAAC,cAAc;SAC9C,EACD,kCAAkC,CACnC,CAAC;QAEF,8BAA8B;QAC9B,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;QAEhD,0EAA0E;QAC1E,IAAI,CAAC,yBAAyB,CAAC,KAAK,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC;QAE/D,4EAA4E;QAC5E,IAAI,cAAc,CAAC,QAAQ,KAAK,KAAK,EAAE,CAAC;YACtC,IAAI,CAAC,4BAA4B,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACpD,CAAC;QAED,MAAM,CAAC,KAAK,CACV;YACE,GAAG,OAAO;SACX,EACD,gCAAgC,CACjC,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACK,MAAM,CAAC,mBAAmB,CAChC,KAAa,EACb,cAAqC;QAErC,MAAM,SAAS,GAAG,cAAc,CAAC,cAAc,IAAI,KAAK,CAAC;QACzD,IAAI,KAAK,CAAC,MAAM,GAAG,SAAS,EAAE,CAAC;YAC7B,MAAM,IAAI,QAAQ,CAChB,gBAAgB,CAAC,eAAe,EAChC,mCAAmC,SAAS,aAAa,EACzD;gBACE,WAAW,EAAE,KAAK,CAAC,MAAM;gBACzB,SAAS;gBACT,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;aACjC,CACF,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;;;;OAMG;IACK,MAAM,CAAC,yBAAyB,CACtC,KAAa,EACb,cAAqC,EACrC,OAAuB;QAEvB,IACE,CAAC,cAAc,CAAC,iBAAiB;YACjC,cAAc,CAAC,iBAAiB,CAAC,MAAM,KAAK,CAAC,EAC7C,CAAC;YACD,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,kDAAkD;YAClD,MAAM,WAAW,GAAG,IAAI,CAAC,8BAA8B,CACrD,KAAK,EACL,cAAc,CAAC,iBAAiB,CACjC,CAAC;YAEF,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;gBACzB,IAAI,CAAC,oBAAoB,CACvB,gCAAgC,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EACnE,WAAW,CAAC,UAAU,EACtB;oBACE,iBAAiB,EAAE,cAAc,CAAC,iBAAiB;oBACnD,WAAW,EAAE,OAAO;iBACrB,EACD,KAAK,CACN,CAAC;YACJ,CAAC;YAED,MAAM,CAAC,KAAK,CACV,EAAE,GAAG,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,EACpC,sCAAsC,CACvC,CAAC;QACJ,CAAC;QAAC,OAAO,UAAU,EAAE,CAAC;YACpB,uDAAuD;YACvD,MAAM,CAAC,KAAK,CACV,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC,EAAE,EACzC,gDAAgD,CACjD,CAAC;YAEF,MAAM,WAAW,GACf,4BAA4B,CAAC,yBAAyB,CACpD,KAAK,EACL,cAAc,CAAC,iBAAiB,EAChC,OAAO,CACR,CAAC;YAEJ,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;gBACzB,IAAI,CAAC,oBAAoB,CACvB,gCAAgC,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EACnE,WAAW,CAAC,UAAU,EACtB;oBACE,iBAAiB,EAAE,cAAc,CAAC,iBAAiB;oBACnD,WAAW,EAAE,gBAAgB;iBAC9B,EACD,KAAK,CACN,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACK,MAAM,CAAC,4BAA4B,CACzC,KAAa,EACb,OAAuB;QAEvB,yEAAyE;QACzE,MAAM,UAAU,GAAG,aAAa,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAE5D,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;YACvB,0DAA0D;YAC1D,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC;gBAC3B,IAAI,CAAC,oBAAoB,CACvB,8BAA8B,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAChE,UAAU,CAAC,UAAU,EACrB;oBACE,QAAQ,EAAE,IAAI;oBACd,WAAW,EAAE,aAAa;iBAC3B,EACD,KAAK,CACN,CAAC;YACJ,CAAC;YAED,MAAM,CAAC,KAAK,CACV;gBACE,GAAG,OAAO;gBACV,WAAW,EAAE,aAAa;gBAC1B,cAAc,EAAE,UAAU,CAAC,cAAc;aAC1C,EACD,uDAAuD,CACxD,CAAC;YAEF,OAAO,CAAC,gCAAgC;QAC1C,CAAC;QAED,gCAAgC;QAChC,MAAM,CAAC,KAAK,CACV,EAAE,GAAG,OAAO,EAAE,EACd,sDAAsD,CACvD,CAAC;QAEF,MAAM,WAAW,GAAG,4BAA4B,CAAC,gBAAgB,CAC/D,KAAK,EACL,OAAO,CACR,CAAC;QAEF,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;YACzB,IAAI,CAAC,oBAAoB,CACvB,8BAA8B,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EACjE,WAAW,CAAC,UAAU,EACtB,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,gBAAgB,EAAE,EACjD,KAAK,CACN,CAAC;QACJ,CAAC;QAED,MAAM,CAAC,KAAK,CACV,EAAE,GAAG,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,EAC7C,gDAAgD,CACjD,CAAC;IACJ,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Regex-based SQL Security Validator Fallback
|
|
3
|
+
* Simple regex pattern matching for cases where vscode-db2i parser cannot handle a query
|
|
4
|
+
*
|
|
5
|
+
* @module src/ibmi-mcp-server/utils/security/sqlSecurityValidatorFallback
|
|
6
|
+
*/
|
|
7
|
+
import { RequestContext } from "../../../utils/internal/requestContext.js";
|
|
8
|
+
import { SecurityValidationResult } from "./sqlSecurityValidator.js";
|
|
9
|
+
/**
|
|
10
|
+
* Regex-based SQL Security Validator Fallback
|
|
11
|
+
* Provides simple pattern-matching validation when primary validators cannot parse the query
|
|
12
|
+
*/
|
|
13
|
+
export declare class SqlSecurityValidatorFallback {
|
|
14
|
+
/**
|
|
15
|
+
* Strip string literals from SQL to prevent false positives in regex validation
|
|
16
|
+
* @param sql - Raw SQL query
|
|
17
|
+
* @returns Normalized SQL with strings replaced with empty literals
|
|
18
|
+
* @private
|
|
19
|
+
*/
|
|
20
|
+
private static stripSqlLiterals;
|
|
21
|
+
/**
|
|
22
|
+
* Validate query against list of keywords using regex patterns
|
|
23
|
+
* @param query - SQL query to validate
|
|
24
|
+
* @param keywords - Keywords to check for
|
|
25
|
+
* @param patternBuilder - Function to build regex pattern from keyword
|
|
26
|
+
* @param violationFormatter - Function to format violation message
|
|
27
|
+
* @returns Array of violation messages
|
|
28
|
+
* @private
|
|
29
|
+
*/
|
|
30
|
+
private static validateWithRegexList;
|
|
31
|
+
/**
|
|
32
|
+
* Create standardized validation result
|
|
33
|
+
* @param violations - List of validation violations
|
|
34
|
+
* @returns Security validation result object
|
|
35
|
+
* @private
|
|
36
|
+
*/
|
|
37
|
+
private static createValidationResult;
|
|
38
|
+
/**
|
|
39
|
+
* Validate read-only restrictions using regex patterns
|
|
40
|
+
* @param query - SQL query to validate
|
|
41
|
+
* @param context - Request context for logging
|
|
42
|
+
* @returns Security validation result
|
|
43
|
+
*/
|
|
44
|
+
static validateReadOnly(query: string, context: RequestContext): SecurityValidationResult;
|
|
45
|
+
/**
|
|
46
|
+
* Validate forbidden keywords using regex patterns
|
|
47
|
+
* @param query - SQL query to validate
|
|
48
|
+
* @param forbiddenKeywords - List of forbidden keywords
|
|
49
|
+
* @param context - Request context for logging
|
|
50
|
+
* @returns Security validation result
|
|
51
|
+
*/
|
|
52
|
+
static validateForbiddenKeywords(query: string, forbiddenKeywords: string[], context: RequestContext): SecurityValidationResult;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=sqlSecurityValidatorFallback.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlSecurityValidatorFallback.d.ts","sourceRoot":"","sources":["../../../../src/ibmi-mcp-server/utils/security/sqlSecurityValidatorFallback.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACpE,OAAO,EAGL,wBAAwB,EACzB,MAAM,2BAA2B,CAAC;AAEnC;;;GAGG;AACH,qBAAa,4BAA4B;IACvC;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAM/B;;;;;;;;OAQG;IACH,OAAO,CAAC,MAAM,CAAC,qBAAqB;IAmBpC;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAAC,sBAAsB;IAUrC;;;;;OAKG;IACH,MAAM,CAAC,gBAAgB,CACrB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,cAAc,GACtB,wBAAwB;IA6B3B;;;;;;OAMG;IACH,MAAM,CAAC,yBAAyB,CAC9B,KAAK,EAAE,MAAM,EACb,iBAAiB,EAAE,MAAM,EAAE,EAC3B,OAAO,EAAE,cAAc,GACtB,wBAAwB;CAgB5B"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Regex-based SQL Security Validator Fallback
|
|
3
|
+
* Simple regex pattern matching for cases where vscode-db2i parser cannot handle a query
|
|
4
|
+
*
|
|
5
|
+
* @module src/ibmi-mcp-server/utils/security/sqlSecurityValidatorFallback
|
|
6
|
+
*/
|
|
7
|
+
import { logger } from "../../../utils/internal/logger.js";
|
|
8
|
+
import { DANGEROUS_OPERATIONS, DANGEROUS_PATTERNS, } from "./sqlSecurityValidator.js";
|
|
9
|
+
/**
|
|
10
|
+
* Regex-based SQL Security Validator Fallback
|
|
11
|
+
* Provides simple pattern-matching validation when primary validators cannot parse the query
|
|
12
|
+
*/
|
|
13
|
+
export class SqlSecurityValidatorFallback {
|
|
14
|
+
/**
|
|
15
|
+
* Strip string literals from SQL to prevent false positives in regex validation
|
|
16
|
+
* @param sql - Raw SQL query
|
|
17
|
+
* @returns Normalized SQL with strings replaced with empty literals
|
|
18
|
+
* @private
|
|
19
|
+
*/
|
|
20
|
+
static stripSqlLiterals(sql) {
|
|
21
|
+
// Replace single-quoted strings with empty string literals
|
|
22
|
+
// Pattern handles escaped quotes: 'can''t' -> ''
|
|
23
|
+
return sql.replace(/'(?:''|[^'])*'/g, "''");
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Validate query against list of keywords using regex patterns
|
|
27
|
+
* @param query - SQL query to validate
|
|
28
|
+
* @param keywords - Keywords to check for
|
|
29
|
+
* @param patternBuilder - Function to build regex pattern from keyword
|
|
30
|
+
* @param violationFormatter - Function to format violation message
|
|
31
|
+
* @returns Array of violation messages
|
|
32
|
+
* @private
|
|
33
|
+
*/
|
|
34
|
+
static validateWithRegexList(query, keywords, patternBuilder, violationFormatter) {
|
|
35
|
+
const violations = [];
|
|
36
|
+
const normalizedQuery = this.stripSqlLiterals(query);
|
|
37
|
+
for (const keyword of keywords) {
|
|
38
|
+
const pattern = patternBuilder(keyword);
|
|
39
|
+
if (pattern.test(normalizedQuery)) {
|
|
40
|
+
violations.push(violationFormatter(keyword));
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return violations;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Create standardized validation result
|
|
47
|
+
* @param violations - List of validation violations
|
|
48
|
+
* @returns Security validation result object
|
|
49
|
+
* @private
|
|
50
|
+
*/
|
|
51
|
+
static createValidationResult(violations) {
|
|
52
|
+
return {
|
|
53
|
+
isValid: violations.length === 0,
|
|
54
|
+
violations,
|
|
55
|
+
validationMethod: "regex",
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Validate read-only restrictions using regex patterns
|
|
60
|
+
* @param query - SQL query to validate
|
|
61
|
+
* @param context - Request context for logging
|
|
62
|
+
* @returns Security validation result
|
|
63
|
+
*/
|
|
64
|
+
static validateReadOnly(query, context) {
|
|
65
|
+
const violations = [];
|
|
66
|
+
logger.debug({ ...context }, "Using regex fallback for read-only validation");
|
|
67
|
+
// Check for dangerous operations
|
|
68
|
+
violations.push(...this.validateWithRegexList(query, DANGEROUS_OPERATIONS, (op) => new RegExp(`\\b${op}\\b`, "i"), (op) => `Write operation '${op}' detected`));
|
|
69
|
+
// Check for dangerous patterns
|
|
70
|
+
const normalizedQuery = this.stripSqlLiterals(query);
|
|
71
|
+
for (const pattern of DANGEROUS_PATTERNS) {
|
|
72
|
+
if (pattern.test(normalizedQuery)) {
|
|
73
|
+
violations.push(`Dangerous pattern detected: ${pattern.source}`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return this.createValidationResult(violations);
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Validate forbidden keywords using regex patterns
|
|
80
|
+
* @param query - SQL query to validate
|
|
81
|
+
* @param forbiddenKeywords - List of forbidden keywords
|
|
82
|
+
* @param context - Request context for logging
|
|
83
|
+
* @returns Security validation result
|
|
84
|
+
*/
|
|
85
|
+
static validateForbiddenKeywords(query, forbiddenKeywords, context) {
|
|
86
|
+
logger.debug({ ...context, keywordCount: forbiddenKeywords.length }, "Using regex fallback for forbidden keywords validation");
|
|
87
|
+
const violations = this.validateWithRegexList(query, forbiddenKeywords, (kw) => new RegExp(`\\b${kw.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}\\b`, "i"), (kw) => `Forbidden keyword: ${kw}`);
|
|
88
|
+
return this.createValidationResult(violations);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=sqlSecurityValidatorFallback.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlSecurityValidatorFallback.js","sourceRoot":"","sources":["../../../../src/ibmi-mcp-server/utils/security/sqlSecurityValidatorFallback.ts"],"names":[],"mappings":"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"}
|