mcp-server-db2i 2.0.0 → 2.2.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 +11 -0
- package/dist/config.d.ts +104 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +273 -5
- package/dist/config.js.map +1 -1
- package/dist/customTools/context.d.ts +27 -0
- package/dist/customTools/context.d.ts.map +1 -0
- package/dist/customTools/context.js +35 -0
- package/dist/customTools/context.js.map +1 -0
- package/dist/customTools/execute.d.ts +22 -0
- package/dist/customTools/execute.d.ts.map +1 -0
- package/dist/customTools/execute.js +134 -0
- package/dist/customTools/execute.js.map +1 -0
- package/dist/customTools/loader.d.ts +56 -0
- package/dist/customTools/loader.d.ts.map +1 -0
- package/dist/customTools/loader.js +213 -0
- package/dist/customTools/loader.js.map +1 -0
- package/dist/customTools/params.d.ts +23 -0
- package/dist/customTools/params.d.ts.map +1 -0
- package/dist/customTools/params.js +93 -0
- package/dist/customTools/params.js.map +1 -0
- package/dist/customTools/registry.d.ts +18 -0
- package/dist/customTools/registry.d.ts.map +1 -0
- package/dist/customTools/registry.js +23 -0
- package/dist/customTools/registry.js.map +1 -0
- package/dist/customTools/schema.d.ts +127 -0
- package/dist/customTools/schema.d.ts.map +1 -0
- package/dist/customTools/schema.js +193 -0
- package/dist/customTools/schema.js.map +1 -0
- package/dist/db/connection.d.ts +9 -0
- package/dist/db/connection.d.ts.map +1 -1
- package/dist/db/connection.js +91 -0
- package/dist/db/connection.js.map +1 -1
- package/dist/db/sqlServices.d.ts +65 -0
- package/dist/db/sqlServices.d.ts.map +1 -0
- package/dist/db/sqlServices.js +311 -0
- package/dist/db/sqlServices.js.map +1 -0
- package/dist/index.js +23 -1
- package/dist/index.js.map +1 -1
- package/dist/server.d.ts +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +260 -104
- package/dist/server.js.map +1 -1
- package/dist/tools/metadata.d.ts +24 -12
- package/dist/tools/metadata.d.ts.map +1 -1
- package/dist/tools/metadata.js +43 -8
- package/dist/tools/metadata.js.map +1 -1
- package/dist/tools/query.d.ts +5 -0
- package/dist/tools/query.d.ts.map +1 -1
- package/dist/tools/query.js +50 -2
- package/dist/tools/query.js.map +1 -1
- package/dist/tools/sqlLimit.d.ts +5 -0
- package/dist/tools/sqlLimit.d.ts.map +1 -1
- package/dist/tools/sqlLimit.js +12 -0
- package/dist/tools/sqlLimit.js.map +1 -1
- package/dist/tools/sqlServices.d.ts +51 -0
- package/dist/tools/sqlServices.d.ts.map +1 -0
- package/dist/tools/sqlServices.js +122 -0
- package/dist/tools/sqlServices.js.map +1 -0
- package/dist/transports/http.d.ts.map +1 -1
- package/dist/transports/http.js +40 -1
- package/dist/transports/http.js.map +1 -1
- package/dist/utils/formatResult.d.ts +22 -0
- package/dist/utils/formatResult.d.ts.map +1 -0
- package/dist/utils/formatResult.js +66 -0
- package/dist/utils/formatResult.js.map +1 -0
- package/dist/utils/security/schemaAllowlist.d.ts +27 -0
- package/dist/utils/security/schemaAllowlist.d.ts.map +1 -0
- package/dist/utils/security/schemaAllowlist.js +156 -0
- package/dist/utils/security/schemaAllowlist.js.map +1 -0
- package/dist/utils/security/sqlSecurityValidator.d.ts +0 -4
- package/dist/utils/security/sqlSecurityValidator.d.ts.map +1 -1
- package/dist/utils/security/sqlSecurityValidator.js +134 -38
- package/dist/utils/security/sqlSecurityValidator.js.map +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatResult.js","sourceRoot":"","sources":["../../src/utils/formatResult.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema allowlist for execute_query and the SQL service tools.
|
|
3
|
+
*
|
|
4
|
+
* When QUERY_ALLOWED_SCHEMAS is set, every table reference must resolve to
|
|
5
|
+
* one of those libraries. Queries that cannot be parsed are rejected, so a
|
|
6
|
+
* dialect the parser does not understand cannot skip the check.
|
|
7
|
+
*/
|
|
8
|
+
export interface SchemaCheckOptions {
|
|
9
|
+
/** Uppercased library names the query may use */
|
|
10
|
+
allowed: string[];
|
|
11
|
+
/** Schema unqualified names resolve to. Empty means none is configured. */
|
|
12
|
+
defaultSchema?: string;
|
|
13
|
+
}
|
|
14
|
+
export interface SchemaCheckResult {
|
|
15
|
+
ok: boolean;
|
|
16
|
+
violations: string[];
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Check that every table reference stays inside the allowlist.
|
|
20
|
+
* Callers should skip this when the allowlist is unset.
|
|
21
|
+
*/
|
|
22
|
+
export declare function checkQuerySchemas(sql: string, options: SchemaCheckOptions): SchemaCheckResult;
|
|
23
|
+
/**
|
|
24
|
+
* True when schema is in the allowlist. Comparison is case-insensitive.
|
|
25
|
+
*/
|
|
26
|
+
export declare function isSchemaAllowed(schema: string, allowed: readonly string[]): boolean;
|
|
27
|
+
//# sourceMappingURL=schemaAllowlist.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schemaAllowlist.d.ts","sourceRoot":"","sources":["../../../src/utils/security/schemaAllowlist.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAQH,MAAM,WAAW,kBAAkB;IACjC,iDAAiD;IACjD,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,2EAA2E;IAC3E,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,OAAO,CAAC;IACZ,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AA4HD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,kBAAkB,GAAG,iBAAiB,CA+C7F;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAMnF"}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema allowlist for execute_query and the SQL service tools.
|
|
3
|
+
*
|
|
4
|
+
* When QUERY_ALLOWED_SCHEMAS is set, every table reference must resolve to
|
|
5
|
+
* one of those libraries. Queries that cannot be parsed are rejected, so a
|
|
6
|
+
* dialect the parser does not understand cannot skip the check.
|
|
7
|
+
*/
|
|
8
|
+
import nodeSqlParser from 'node-sql-parser';
|
|
9
|
+
import { stripTrailingRowLimit } from '../../tools/sqlLimit.js';
|
|
10
|
+
const { Parser } = nodeSqlParser;
|
|
11
|
+
const PARSE_DIALECTS = ['db2', 'mysql'];
|
|
12
|
+
const UNPARSEABLE_MESSAGE = 'Query could not be parsed, so its libraries could not be checked. ' +
|
|
13
|
+
'While QUERY_ALLOWED_SCHEMAS is set, system naming (LIB/FILE) and TABLE(...) functions are not accepted.';
|
|
14
|
+
/**
|
|
15
|
+
* Replace `?` parameter markers with NULL, leaving markers inside quotes alone.
|
|
16
|
+
* The DB2 dialect rejects `?`, and real queries use it for prepared statements.
|
|
17
|
+
*/
|
|
18
|
+
function replaceParameterMarkers(sql) {
|
|
19
|
+
let out = '';
|
|
20
|
+
let quote = null;
|
|
21
|
+
for (let i = 0; i < sql.length; i++) {
|
|
22
|
+
const ch = sql[i];
|
|
23
|
+
if (quote) {
|
|
24
|
+
out += ch;
|
|
25
|
+
if (ch === quote) {
|
|
26
|
+
if (sql[i + 1] === quote) {
|
|
27
|
+
out += sql[++i];
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
quote = null;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
if (ch === "'" || ch === '"') {
|
|
36
|
+
quote = ch;
|
|
37
|
+
out += ch;
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
if (ch === '?') {
|
|
41
|
+
out += 'NULL';
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
out += ch;
|
|
45
|
+
}
|
|
46
|
+
return out;
|
|
47
|
+
}
|
|
48
|
+
function normalizeForParsing(sql) {
|
|
49
|
+
return replaceParameterMarkers(stripTrailingRowLimit(sql));
|
|
50
|
+
}
|
|
51
|
+
function parseQuery(sql) {
|
|
52
|
+
const parser = new Parser();
|
|
53
|
+
for (const database of PARSE_DIALECTS) {
|
|
54
|
+
try {
|
|
55
|
+
const ast = parser.astify(sql, { database });
|
|
56
|
+
const tables = parser.tableList(sql, { database });
|
|
57
|
+
return { ast, tables };
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
// The other dialect may accept what this one rejects.
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return undefined;
|
|
64
|
+
}
|
|
65
|
+
function collectCteNames(node, names) {
|
|
66
|
+
if (!node || typeof node !== 'object') {
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
if (Array.isArray(node)) {
|
|
70
|
+
for (const item of node) {
|
|
71
|
+
collectCteNames(item, names);
|
|
72
|
+
}
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
const record = node;
|
|
76
|
+
const withClause = record.with;
|
|
77
|
+
if (Array.isArray(withClause)) {
|
|
78
|
+
for (const cte of withClause) {
|
|
79
|
+
const name = cte?.name?.value;
|
|
80
|
+
if (typeof name === 'string' && name.length > 0) {
|
|
81
|
+
names.add(name.toUpperCase());
|
|
82
|
+
}
|
|
83
|
+
collectCteNames(cte, names);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
for (const [key, value] of Object.entries(record)) {
|
|
87
|
+
if (key === 'with') {
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
collectCteNames(value, names);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
function schemaOf(entry) {
|
|
94
|
+
const parts = entry.split('::');
|
|
95
|
+
if (parts.length < 3) {
|
|
96
|
+
return undefined;
|
|
97
|
+
}
|
|
98
|
+
const schema = parts[1];
|
|
99
|
+
const table = parts.slice(2).join('::').replace(/^"|"$/g, '');
|
|
100
|
+
if (!table || table === '*') {
|
|
101
|
+
return undefined;
|
|
102
|
+
}
|
|
103
|
+
if (!schema || schema.toLowerCase() === 'null') {
|
|
104
|
+
return { schema: undefined, table };
|
|
105
|
+
}
|
|
106
|
+
return { schema: schema.replace(/^"|"$/g, '').toUpperCase(), table };
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Check that every table reference stays inside the allowlist.
|
|
110
|
+
* Callers should skip this when the allowlist is unset.
|
|
111
|
+
*/
|
|
112
|
+
export function checkQuerySchemas(sql, options) {
|
|
113
|
+
const parsed = parseQuery(normalizeForParsing(sql));
|
|
114
|
+
if (!parsed) {
|
|
115
|
+
return { ok: false, violations: [UNPARSEABLE_MESSAGE] };
|
|
116
|
+
}
|
|
117
|
+
const cteNames = new Set();
|
|
118
|
+
collectCteNames(parsed.ast, cteNames);
|
|
119
|
+
const allowed = new Set(options.allowed.map((name) => name.toUpperCase()));
|
|
120
|
+
const defaultSchema = options.defaultSchema?.trim().toUpperCase() || undefined;
|
|
121
|
+
const violations = [];
|
|
122
|
+
for (const entry of parsed.tables) {
|
|
123
|
+
const ref = schemaOf(entry);
|
|
124
|
+
if (!ref) {
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
if (!ref.schema) {
|
|
128
|
+
if (cteNames.has(ref.table.toUpperCase())) {
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
if (!defaultSchema) {
|
|
132
|
+
violations.push(`Unqualified table ${ref.table} has no default schema. Set DB2I_SCHEMA or qualify the table with a library.`);
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
135
|
+
if (!allowed.has(defaultSchema)) {
|
|
136
|
+
violations.push(`Unqualified table ${ref.table} resolves to ${defaultSchema}, which is not in QUERY_ALLOWED_SCHEMAS.`);
|
|
137
|
+
}
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
if (!allowed.has(ref.schema)) {
|
|
141
|
+
violations.push(`Table ${ref.schema}.${ref.table} is not in QUERY_ALLOWED_SCHEMAS (${[...allowed].join(', ')}).`);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
return { ok: violations.length === 0, violations };
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* True when schema is in the allowlist. Comparison is case-insensitive.
|
|
148
|
+
*/
|
|
149
|
+
export function isSchemaAllowed(schema, allowed) {
|
|
150
|
+
const name = schema.trim().toUpperCase();
|
|
151
|
+
if (!name) {
|
|
152
|
+
return false;
|
|
153
|
+
}
|
|
154
|
+
return allowed.some((entry) => entry.toUpperCase() === name);
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=schemaAllowlist.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schemaAllowlist.js","sourceRoot":"","sources":["../../../src/utils/security/schemaAllowlist.ts"],"names":[],"mappings":"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"}
|
|
@@ -62,10 +62,6 @@ export declare class SqlSecurityValidator {
|
|
|
62
62
|
* Validate SQL query using regex patterns (fallback)
|
|
63
63
|
*/
|
|
64
64
|
private static validateQueryRegex;
|
|
65
|
-
/**
|
|
66
|
-
* Check if a keyword is inside a string literal
|
|
67
|
-
*/
|
|
68
|
-
private static isInsideStringLiteral;
|
|
69
65
|
/**
|
|
70
66
|
* Check if an operation is dangerous
|
|
71
67
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqlSecurityValidator.d.ts","sourceRoot":"","sources":["../../../src/utils/security/sqlSecurityValidator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,oCAAoC;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,wCAAwC;IACxC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,6BAA6B;IAC7B,gBAAgB,EAAE,KAAK,GAAG,OAAO,GAAG,UAAU,CAAC;CAChD;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,wDAAwD;IACxD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,0DAA0D;IAC1D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oCAAoC;IACpC,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC9B;AAED;;GAEG;AACH,eAAO,MAAM,oBAAoB,4VA6CvB,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,0BAA0B,+CAG7B,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,mBAAmB,0HAStB,CAAC;
|
|
1
|
+
{"version":3,"file":"sqlSecurityValidator.d.ts","sourceRoot":"","sources":["../../../src/utils/security/sqlSecurityValidator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,oCAAoC;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,wCAAwC;IACxC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,6BAA6B;IAC7B,gBAAgB,EAAE,KAAK,GAAG,OAAO,GAAG,UAAU,CAAC;CAChD;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,wDAAwD;IACxD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,0DAA0D;IAC1D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oCAAoC;IACpC,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC9B;AAED;;GAEG;AACH,eAAO,MAAM,oBAAoB,4VA6CvB,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,0BAA0B,+CAG7B,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,mBAAmB,0HAStB,CAAC;AA4BX;;;;;GAKG;AACH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,MAAM,CAAC,MAAM,CAAgB;IAErC;;;;;;OAMG;IACH,MAAM,CAAC,aAAa,CAClB,KAAK,EAAE,MAAM,EACb,MAAM,GAAE,cAAmB,GAC1B,wBAAwB;IA0C3B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAiD/B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,kBAAkB;IA2CjC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,oBAAoB;IAMnC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,2BAA2B;IA+B1C;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,sBAAsB;IAarC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,WAAW;CAG3B;AAsGD;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAGpD;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAC3B,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,cAAc,GACtB,wBAAwB,CAE1B"}
|
|
@@ -75,6 +75,23 @@ export const DANGEROUS_FUNCTIONS = [
|
|
|
75
75
|
'EXECUTE_IMMEDIATE',
|
|
76
76
|
'EVAL',
|
|
77
77
|
];
|
|
78
|
+
/**
|
|
79
|
+
* Prefixes of IBM i services that send data off the system or write outside the database.
|
|
80
|
+
* Matched against the unqualified function name, so QSYS2.HTTP_GET and SYSTOOLS.HTTPGETCLOB both hit.
|
|
81
|
+
*/
|
|
82
|
+
const SIDE_EFFECT_FUNCTION_PREFIXES = [
|
|
83
|
+
'HTTP_',
|
|
84
|
+
'HTTPGET',
|
|
85
|
+
'HTTPPOST',
|
|
86
|
+
'HTTPPUT',
|
|
87
|
+
'HTTPDELETE',
|
|
88
|
+
'HTTPHEAD',
|
|
89
|
+
'HTTPBLOB',
|
|
90
|
+
'HTTPCLOB',
|
|
91
|
+
'IFS_WRITE',
|
|
92
|
+
'GENERATE_SPREADSHEET',
|
|
93
|
+
'SEND_EMAIL',
|
|
94
|
+
];
|
|
78
95
|
/**
|
|
79
96
|
* All dangerous operations combined
|
|
80
97
|
*/
|
|
@@ -105,12 +122,12 @@ export class SqlSecurityValidator {
|
|
|
105
122
|
violations.push(`Query exceeds maximum length of ${maxQueryLength} characters`);
|
|
106
123
|
return { isValid: false, violations, validationMethod: 'regex' };
|
|
107
124
|
}
|
|
108
|
-
// 2. If read-only mode, validate for write operations
|
|
125
|
+
// 2. If read-only mode, validate for write operations.
|
|
126
|
+
// Regex runs on text with literals, comments, and delimited-identifier quotes removed,
|
|
127
|
+
// so a string or a quoted name earlier in the statement cannot hide a later call.
|
|
109
128
|
if (readOnly) {
|
|
110
|
-
// Try AST-based validation first
|
|
111
129
|
const astResult = this.validateQueryAST(query);
|
|
112
|
-
|
|
113
|
-
const regexResult = this.validateQueryRegex(query);
|
|
130
|
+
const regexResult = this.validateQueryRegex(normalizeForScan(query));
|
|
114
131
|
// Combine violations from both methods
|
|
115
132
|
violations.push(...astResult.violations);
|
|
116
133
|
// Add regex violations that weren't caught by AST
|
|
@@ -120,9 +137,9 @@ export class SqlSecurityValidator {
|
|
|
120
137
|
}
|
|
121
138
|
}
|
|
122
139
|
}
|
|
123
|
-
// 3. Check for custom forbidden keywords
|
|
140
|
+
// 3. Check for custom forbidden keywords on the same normalized text
|
|
124
141
|
if (forbiddenKeywords.length > 0) {
|
|
125
|
-
const keywordViolations = this.checkForbiddenKeywords(query, forbiddenKeywords);
|
|
142
|
+
const keywordViolations = this.checkForbiddenKeywords(normalizeForScan(query), forbiddenKeywords);
|
|
126
143
|
violations.push(...keywordViolations);
|
|
127
144
|
}
|
|
128
145
|
return {
|
|
@@ -181,29 +198,24 @@ export class SqlSecurityValidator {
|
|
|
181
198
|
*/
|
|
182
199
|
static validateQueryRegex(query) {
|
|
183
200
|
const violations = [];
|
|
184
|
-
//
|
|
201
|
+
// query is already normalized: literals and comments are gone, delimited names are unquoted
|
|
185
202
|
for (const operation of ALL_DANGEROUS_OPERATIONS) {
|
|
186
203
|
const pattern = new RegExp(`\\b${operation}\\b`, 'i');
|
|
187
204
|
if (pattern.test(query)) {
|
|
188
|
-
|
|
189
|
-
if (!this.isInsideStringLiteral(query, operation)) {
|
|
190
|
-
violations.push(`Dangerous operation detected: ${operation}`);
|
|
191
|
-
}
|
|
205
|
+
violations.push(`Dangerous operation detected: ${operation}`);
|
|
192
206
|
}
|
|
193
207
|
}
|
|
194
|
-
// Check for dangerous function calls
|
|
195
208
|
for (const func of DANGEROUS_FUNCTIONS) {
|
|
196
209
|
const pattern = new RegExp(`\\b${func}\\s*\\(`, 'i');
|
|
197
210
|
if (pattern.test(query)) {
|
|
198
|
-
|
|
199
|
-
if (!this.isInsideStringLiteral(query, func)) {
|
|
200
|
-
violations.push(`Dangerous function call detected: ${func}`);
|
|
201
|
-
}
|
|
211
|
+
violations.push(`Dangerous function call detected: ${func}`);
|
|
202
212
|
}
|
|
203
213
|
}
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
214
|
+
for (const prefix of SIDE_EFFECT_FUNCTION_PREFIXES) {
|
|
215
|
+
const pattern = new RegExp(`\\b(?:\\w+\\.)?${prefix}\\w*\\s*\\(`, 'i');
|
|
216
|
+
if (pattern.test(query)) {
|
|
217
|
+
violations.push(`Dangerous function call detected: ${prefix}`);
|
|
218
|
+
}
|
|
207
219
|
}
|
|
208
220
|
// Check for semicolon followed by dangerous operation (multi-statement)
|
|
209
221
|
if (/;\s*(DROP|DELETE|INSERT|UPDATE|CREATE|ALTER|TRUNCATE)/i.test(query)) {
|
|
@@ -220,20 +232,6 @@ export class SqlSecurityValidator {
|
|
|
220
232
|
validationMethod: 'regex',
|
|
221
233
|
};
|
|
222
234
|
}
|
|
223
|
-
/**
|
|
224
|
-
* Check if a keyword is inside a string literal
|
|
225
|
-
*/
|
|
226
|
-
static isInsideStringLiteral(query, keyword) {
|
|
227
|
-
// Simple heuristic: check if the keyword appears after an odd number of quotes
|
|
228
|
-
const keywordIndex = query.toUpperCase().indexOf(keyword.toUpperCase());
|
|
229
|
-
if (keywordIndex === -1)
|
|
230
|
-
return false;
|
|
231
|
-
const beforeKeyword = query.substring(0, keywordIndex);
|
|
232
|
-
const singleQuotes = (beforeKeyword.match(/'/g) || []).length;
|
|
233
|
-
const doubleQuotes = (beforeKeyword.match(/"/g) || []).length;
|
|
234
|
-
// If odd number of quotes, we're inside a string
|
|
235
|
-
return singleQuotes % 2 !== 0 || doubleQuotes % 2 !== 0;
|
|
236
|
-
}
|
|
237
235
|
/**
|
|
238
236
|
* Check if an operation is dangerous
|
|
239
237
|
*/
|
|
@@ -248,11 +246,12 @@ export class SqlSecurityValidator {
|
|
|
248
246
|
if (!node || typeof node !== 'object')
|
|
249
247
|
return found;
|
|
250
248
|
const nodeObj = node;
|
|
251
|
-
// Check if this node is a function call
|
|
249
|
+
// Check if this node is a function call. Match the unqualified name so
|
|
250
|
+
// QSYS2.QCMDEXC is compared as QCMDEXC, not as the whole schema-qualified form.
|
|
252
251
|
if (nodeObj.type === 'function' && nodeObj.name) {
|
|
253
|
-
const funcName =
|
|
254
|
-
if (
|
|
255
|
-
found.push(funcName);
|
|
252
|
+
const funcName = unqualifiedFunctionName(nodeObj.name);
|
|
253
|
+
if (funcName && isBlockedFunction(funcName)) {
|
|
254
|
+
found.push(funcName.toUpperCase());
|
|
256
255
|
}
|
|
257
256
|
}
|
|
258
257
|
// Recursively check all properties
|
|
@@ -276,7 +275,7 @@ export class SqlSecurityValidator {
|
|
|
276
275
|
const violations = [];
|
|
277
276
|
for (const keyword of keywords) {
|
|
278
277
|
const pattern = new RegExp(`\\b${this.escapeRegex(keyword)}\\b`, 'i');
|
|
279
|
-
if (pattern.test(query)
|
|
278
|
+
if (pattern.test(query)) {
|
|
280
279
|
violations.push(`Forbidden keyword detected: ${keyword}`);
|
|
281
280
|
}
|
|
282
281
|
}
|
|
@@ -289,6 +288,103 @@ export class SqlSecurityValidator {
|
|
|
289
288
|
return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
290
289
|
}
|
|
291
290
|
}
|
|
291
|
+
/**
|
|
292
|
+
* Remove text that must not affect keyword detection:
|
|
293
|
+
* string literals (including '' escapes), -- and block comments, and the quotes
|
|
294
|
+
* around delimited identifiers. "QCMDEXC" becomes QCMDEXC. Replaced regions become
|
|
295
|
+
* a space so adjacent tokens are not glued together.
|
|
296
|
+
*/
|
|
297
|
+
function normalizeForScan(query) {
|
|
298
|
+
let out = '';
|
|
299
|
+
let i = 0;
|
|
300
|
+
while (i < query.length) {
|
|
301
|
+
const current = query[i];
|
|
302
|
+
const next = query[i + 1];
|
|
303
|
+
if (current === '-' && next === '-') {
|
|
304
|
+
i += 2;
|
|
305
|
+
while (i < query.length && query[i] !== '\n')
|
|
306
|
+
i++;
|
|
307
|
+
out += ' ';
|
|
308
|
+
continue;
|
|
309
|
+
}
|
|
310
|
+
if (current === '/' && next === '*') {
|
|
311
|
+
i += 2;
|
|
312
|
+
while (i < query.length && !(query[i] === '*' && query[i + 1] === '/'))
|
|
313
|
+
i++;
|
|
314
|
+
if (i < query.length)
|
|
315
|
+
i += 2;
|
|
316
|
+
out += ' ';
|
|
317
|
+
continue;
|
|
318
|
+
}
|
|
319
|
+
if (current === "'") {
|
|
320
|
+
i++;
|
|
321
|
+
while (i < query.length) {
|
|
322
|
+
if (query[i] === "'" && query[i + 1] === "'") {
|
|
323
|
+
i += 2;
|
|
324
|
+
continue;
|
|
325
|
+
}
|
|
326
|
+
if (query[i] === "'") {
|
|
327
|
+
i++;
|
|
328
|
+
break;
|
|
329
|
+
}
|
|
330
|
+
i++;
|
|
331
|
+
}
|
|
332
|
+
out += ' ';
|
|
333
|
+
continue;
|
|
334
|
+
}
|
|
335
|
+
if (current === '"') {
|
|
336
|
+
i++;
|
|
337
|
+
let ident = '';
|
|
338
|
+
while (i < query.length) {
|
|
339
|
+
if (query[i] === '"' && query[i + 1] === '"') {
|
|
340
|
+
ident += '"';
|
|
341
|
+
i += 2;
|
|
342
|
+
continue;
|
|
343
|
+
}
|
|
344
|
+
if (query[i] === '"') {
|
|
345
|
+
i++;
|
|
346
|
+
break;
|
|
347
|
+
}
|
|
348
|
+
ident += query[i];
|
|
349
|
+
i++;
|
|
350
|
+
}
|
|
351
|
+
out += ident;
|
|
352
|
+
continue;
|
|
353
|
+
}
|
|
354
|
+
out += current;
|
|
355
|
+
i++;
|
|
356
|
+
}
|
|
357
|
+
return out;
|
|
358
|
+
}
|
|
359
|
+
/**
|
|
360
|
+
* Unqualified function name from a node-sql-parser name node.
|
|
361
|
+
* The name may be a string, "schema.name", or { name: [{ value }] }.
|
|
362
|
+
*/
|
|
363
|
+
function unqualifiedFunctionName(name) {
|
|
364
|
+
if (typeof name === 'string') {
|
|
365
|
+
const parts = name.split('.');
|
|
366
|
+
return parts[parts.length - 1];
|
|
367
|
+
}
|
|
368
|
+
if (!name || typeof name !== 'object')
|
|
369
|
+
return undefined;
|
|
370
|
+
const obj = name;
|
|
371
|
+
if (Array.isArray(obj.name) && obj.name.length > 0) {
|
|
372
|
+
const last = obj.name[obj.name.length - 1];
|
|
373
|
+
if (last && typeof last.value === 'string')
|
|
374
|
+
return last.value;
|
|
375
|
+
}
|
|
376
|
+
if (typeof obj.name === 'string')
|
|
377
|
+
return obj.name;
|
|
378
|
+
if (typeof obj.value === 'string')
|
|
379
|
+
return obj.value;
|
|
380
|
+
return undefined;
|
|
381
|
+
}
|
|
382
|
+
function isBlockedFunction(name) {
|
|
383
|
+
const upper = name.toUpperCase();
|
|
384
|
+
if (DANGEROUS_FUNCTIONS.some((func) => func.toUpperCase() === upper))
|
|
385
|
+
return true;
|
|
386
|
+
return SIDE_EFFECT_FUNCTION_PREFIXES.some((prefix) => upper.startsWith(prefix));
|
|
387
|
+
}
|
|
292
388
|
/**
|
|
293
389
|
* Convenience function for simple validation
|
|
294
390
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqlSecurityValidator.js","sourceRoot":"","sources":["../../../src/utils/security/sqlSecurityValidator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,aAAa,MAAM,iBAAiB,CAAC;AAC5C,MAAM,EAAE,MAAM,EAAE,GAAG,aAAa,CAAC;AA0BjC;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,oBAAoB;IACpB,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,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,sBAAsB;IACtB,QAAQ;IACR,UAAU;IACV,WAAW;CACH,CAAC;AAEX;;GAEG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG;IACxC,SAAS;IACT,uBAAuB;CACf,CAAC;AAEX;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,QAAQ;IACR,SAAS;IACT,uBAAuB;IACvB,QAAQ;IACR,gBAAgB;IAChB,MAAM;IACN,mBAAmB;IACnB,MAAM;CACE,CAAC;AAEX;;GAEG;AACH,MAAM,wBAAwB,GAAG;IAC/B,GAAG,oBAAoB;IACvB,GAAG,0BAA0B;CACrB,CAAC;AAEX;;;;;GAKG;AACH,MAAM,OAAO,oBAAoB;IACvB,MAAM,CAAC,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;IAErC;;;;;;OAMG;IACH,MAAM,CAAC,aAAa,CAClB,KAAa,EACb,SAAyB,EAAE;QAE3B,MAAM,EAAE,QAAQ,GAAG,IAAI,EAAE,cAAc,GAAG,KAAK,EAAE,iBAAiB,GAAG,EAAE,EAAE,GAAG,MAAM,CAAC;QAEnF,MAAM,UAAU,GAAa,EAAE,CAAC;QAEhC,wBAAwB;QACxB,IAAI,KAAK,CAAC,MAAM,GAAG,cAAc,EAAE,CAAC;YAClC,UAAU,CAAC,IAAI,CAAC,mCAAmC,cAAc,aAAa,CAAC,CAAC;YAChF,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,OAAO,EAAE,CAAC;QACnE,CAAC;QAED,
|
|
1
|
+
{"version":3,"file":"sqlSecurityValidator.js","sourceRoot":"","sources":["../../../src/utils/security/sqlSecurityValidator.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mcp-server-db2i",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.2.0",
|
|
4
4
|
"description": "MCP server for IBM DB2 for i (DB2i) database queries and metadata inspection",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -50,6 +50,7 @@
|
|
|
50
50
|
"node-sql-parser": "^5.4.0",
|
|
51
51
|
"pino": "^10.3.1",
|
|
52
52
|
"pino-pretty": "^13.1.3",
|
|
53
|
+
"yaml": "^2.9.1",
|
|
53
54
|
"zod": "^4.6.5"
|
|
54
55
|
},
|
|
55
56
|
"devDependencies": {
|