@memberjunction/global 6.1.0-edge.2 → 6.1.0-edge.3
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/LICENSE +180 -4
- package/README.md +2 -2
- package/dist/SQLExpressionValidator.d.ts +28 -1
- package/dist/SQLExpressionValidator.d.ts.map +1 -1
- package/dist/SQLExpressionValidator.js +42 -4
- package/dist/SQLExpressionValidator.js.map +1 -1
- package/dist/SafeExpressionEvaluator.d.ts +131 -6
- package/dist/SafeExpressionEvaluator.d.ts.map +1 -1
- package/dist/SafeExpressionEvaluator.js +344 -41
- package/dist/SafeExpressionEvaluator.js.map +1 -1
- package/dist/__tests__/DeepDiff.test.d.ts +2 -0
- package/dist/__tests__/DeepDiff.test.d.ts.map +1 -0
- package/dist/__tests__/DeepDiff.test.js +229 -0
- package/dist/__tests__/DeepDiff.test.js.map +1 -0
- package/dist/__tests__/JSONValidator.test.d.ts +2 -0
- package/dist/__tests__/JSONValidator.test.d.ts.map +1 -0
- package/dist/__tests__/JSONValidator.test.js +221 -0
- package/dist/__tests__/JSONValidator.test.js.map +1 -0
- package/dist/__tests__/MJGlobal.test.js +8 -6
- package/dist/__tests__/MJGlobal.test.js.map +1 -1
- package/dist/__tests__/ResourcePatternUtils.test.d.ts +2 -0
- package/dist/__tests__/ResourcePatternUtils.test.d.ts.map +1 -0
- package/dist/__tests__/ResourcePatternUtils.test.js +50 -0
- package/dist/__tests__/ResourcePatternUtils.test.js.map +1 -0
- package/dist/__tests__/SQLExpressionValidator.security.test.js +62 -1
- package/dist/__tests__/SQLExpressionValidator.security.test.js.map +1 -1
- package/dist/__tests__/SafeExpressionEvaluator.security.test.d.ts +2 -0
- package/dist/__tests__/SafeExpressionEvaluator.security.test.d.ts.map +1 -0
- package/dist/__tests__/SafeExpressionEvaluator.security.test.js +284 -0
- package/dist/__tests__/SafeExpressionEvaluator.security.test.js.map +1 -0
- package/dist/__tests__/SafeExpressionEvaluator.test.d.ts +2 -0
- package/dist/__tests__/SafeExpressionEvaluator.test.d.ts.map +1 -0
- package/dist/__tests__/SafeExpressionEvaluator.test.js +355 -0
- package/dist/__tests__/SafeExpressionEvaluator.test.js.map +1 -0
- package/dist/__tests__/SafeExpressionEvaluator.validateSyntax.test.d.ts +2 -0
- package/dist/__tests__/SafeExpressionEvaluator.validateSyntax.test.d.ts.map +1 -0
- package/dist/__tests__/SafeExpressionEvaluator.validateSyntax.test.js +62 -0
- package/dist/__tests__/SafeExpressionEvaluator.validateSyntax.test.js.map +1 -0
- package/dist/__tests__/util.toEpochMs.test.d.ts +2 -0
- package/dist/__tests__/util.toEpochMs.test.d.ts.map +1 -0
- package/dist/__tests__/util.toEpochMs.test.js +57 -0
- package/dist/__tests__/util.toEpochMs.test.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/util/ResourcePatternUtils.d.ts +35 -0
- package/dist/util/ResourcePatternUtils.d.ts.map +1 -0
- package/dist/util/ResourcePatternUtils.js +56 -0
- package/dist/util/ResourcePatternUtils.js.map +1 -0
- package/dist/util.d.ts +11 -0
- package/dist/util.d.ts.map +1 -1
- package/dist/util.js +16 -0
- package/dist/util.js.map +1 -1
- package/package.json +3 -2
|
@@ -9,7 +9,50 @@
|
|
|
9
9
|
* @author MemberJunction.com
|
|
10
10
|
* @since 2.76.0
|
|
11
11
|
*/
|
|
12
|
+
import { parse } from 'acorn';
|
|
12
13
|
import { MJLruCache } from './MJLruCache.js';
|
|
14
|
+
/**
|
|
15
|
+
* Namespace globals whose listed methods a condition may CALL, keyed by namespace name.
|
|
16
|
+
*
|
|
17
|
+
* Both halves of `Math.abs(x)` are fixed identifiers in the AST, so admitting them adds no dynamic
|
|
18
|
+
* lookup: the four invariants that close the sandbox escape — literal-only computed keys, no
|
|
19
|
+
* `constructor`/`__proto__`/`prototype`, a closed non-computed call surface with no
|
|
20
|
+
* `call`/`apply`/`bind`, and screened free identifiers — are all untouched by this list.
|
|
21
|
+
*
|
|
22
|
+
* Every entry is a pure value function. `Math.random` is deliberately absent (a condition that
|
|
23
|
+
* evaluates differently on each run is not a guard), as are `Object.assign`,
|
|
24
|
+
* `Object.defineProperty` and `Object.setPrototypeOf`, which mutate.
|
|
25
|
+
*/
|
|
26
|
+
export const SAFE_GLOBAL_NAMESPACE_METHODS = new Map([
|
|
27
|
+
['Math', new Set([
|
|
28
|
+
'abs', 'ceil', 'floor', 'round', 'trunc', 'sign', 'min', 'max',
|
|
29
|
+
'pow', 'sqrt', 'cbrt', 'log', 'log2', 'log10', 'exp', 'hypot',
|
|
30
|
+
])],
|
|
31
|
+
['JSON', new Set(['parse', 'stringify'])],
|
|
32
|
+
['Object', new Set(['keys', 'values', 'entries'])],
|
|
33
|
+
['Array', new Set(['isArray'])],
|
|
34
|
+
['Number', new Set(['isInteger', 'isFinite', 'isNaN', 'isSafeInteger', 'parseInt', 'parseFloat'])],
|
|
35
|
+
['Date', new Set(['now'])],
|
|
36
|
+
]);
|
|
37
|
+
/**
|
|
38
|
+
* Global functions a condition may call by bare name — the coercions and numeric predicates that
|
|
39
|
+
* authored specs use (`Number(payload.count) > 3`, `isNaN(payload.count)`).
|
|
40
|
+
*/
|
|
41
|
+
export const SAFE_GLOBAL_CALLABLES = new Set([
|
|
42
|
+
'parseInt', 'parseFloat', 'isNaN', 'isFinite', 'Number', 'String', 'Boolean',
|
|
43
|
+
]);
|
|
44
|
+
/**
|
|
45
|
+
* Every global name a condition may reference, as a namespace or as a bare callable.
|
|
46
|
+
*
|
|
47
|
+
* **This is the single source of truth for the ambient globals of the condition dialect.** It lives
|
|
48
|
+
* beside the policy screen that enforces it so a caller validating conditions ahead of evaluation
|
|
49
|
+
* (`ai-core-plus`'s task-graph door) cannot bless a name the runtime would refuse — the failure mode
|
|
50
|
+
* that shipped once already, where the door's own list and the evaluator disagreed silently.
|
|
51
|
+
*/
|
|
52
|
+
export const SAFE_EXPRESSION_GLOBALS = new Set([
|
|
53
|
+
...SAFE_GLOBAL_NAMESPACE_METHODS.keys(),
|
|
54
|
+
...SAFE_GLOBAL_CALLABLES,
|
|
55
|
+
]);
|
|
13
56
|
/**
|
|
14
57
|
* Safe expression evaluator that prevents arbitrary code execution while
|
|
15
58
|
* supporting common boolean expressions and property access patterns.
|
|
@@ -17,11 +60,22 @@ import { MJLruCache } from './MJLruCache.js';
|
|
|
17
60
|
* Supported operations:
|
|
18
61
|
* - Comparison: ==, ===, !=, !==, <, >, <=, >=
|
|
19
62
|
* - Logical: &&, ||, !
|
|
20
|
-
* - Property access: dot notation (e.g., payload.customer.name)
|
|
21
|
-
* - Array access: bracket notation (e.g., items[0])
|
|
63
|
+
* - Property access: dot notation (e.g., payload.customer.name), including optional chaining (`?.`)
|
|
64
|
+
* - Array access: bracket notation with a literal index/key (e.g., items[0])
|
|
22
65
|
* - Safe methods: .length, .includes(), .startsWith(), .endsWith()
|
|
23
66
|
* - Array methods: .some(), .every(), .find(), .filter()
|
|
24
|
-
* -
|
|
67
|
+
* - Safe globals: the namespaces and bare callables in {@link SAFE_EXPRESSION_GLOBALS}
|
|
68
|
+
* (e.g. `Math.abs(output.delta) < 5`, `Number(payload.count) > 3`, `Object.keys(payload).length`)
|
|
69
|
+
* - Type checking: typeof
|
|
70
|
+
*
|
|
71
|
+
* Safety is enforced by parsing the expression to an AST and walking it against
|
|
72
|
+
* an ALLOWLIST of node types before it is compiled — an unlisted construct
|
|
73
|
+
* (computed member access with a non-literal key, `.constructor`/`__proto__`
|
|
74
|
+
* access, any call outside the safe-method and safe-global lists, host-global
|
|
75
|
+
* identifiers, etc.) is rejected at validation time and never reaches the compiler. A structural
|
|
76
|
+
* allowlist cannot be defeated by string concatenation the way a textual
|
|
77
|
+
* denylist can, and it does not over-reject data that merely mentions a reserved
|
|
78
|
+
* word (e.g. `name == 'constructor'` is a legal comparison).
|
|
25
79
|
*
|
|
26
80
|
* @class SafeExpressionEvaluator
|
|
27
81
|
*
|
|
@@ -57,38 +111,33 @@ export class SafeExpressionEvaluator {
|
|
|
57
111
|
this._compiledExpressionCache = new MJLruCache({ maxSize: 1000 });
|
|
58
112
|
}
|
|
59
113
|
/**
|
|
60
|
-
*
|
|
114
|
+
* Identifiers that must never resolve to a host global. Because the compiled
|
|
115
|
+
* function runs in global scope, a bare `process`/`Function`/`globalThis`/…
|
|
116
|
+
* would reach the real global object; identifiers are atomic AST tokens, so a
|
|
117
|
+
* name that is split with string concatenation parses as separate identifiers
|
|
118
|
+
* or an operator and is caught by the structural rules instead.
|
|
61
119
|
* @private
|
|
62
120
|
*/
|
|
63
|
-
static { this.
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
/\btry\b/i,
|
|
84
|
-
/\bcatch\b/i,
|
|
85
|
-
/\bfinally\b/i,
|
|
86
|
-
/;/, // No semicolons to prevent multiple statements
|
|
87
|
-
/{/, // No curly braces to prevent code blocks
|
|
88
|
-
/}/, // No curly braces
|
|
89
|
-
/`/, // No template literals
|
|
90
|
-
/\$\{/, // No template expressions
|
|
91
|
-
]; }
|
|
121
|
+
static { this.DANGEROUS_IDENTIFIERS = new Set([
|
|
122
|
+
'eval', 'Function', 'globalThis', 'global', 'window', 'document', 'process',
|
|
123
|
+
'require', 'module', 'exports', '__dirname', '__filename', 'self', 'top',
|
|
124
|
+
'parent', 'frames', 'Reflect', 'Proxy', 'WebAssembly', 'Atomics',
|
|
125
|
+
'SharedArrayBuffer', 'import', 'arguments', 'constructor', 'prototype', '__proto__',
|
|
126
|
+
]); }
|
|
127
|
+
/**
|
|
128
|
+
* Property names that open the prototype chain / constructor climb. Denied on
|
|
129
|
+
* both dotted (`x.constructor`) and literal-bracket (`x["constructor"]`) access.
|
|
130
|
+
* @private
|
|
131
|
+
*/
|
|
132
|
+
static { this.DANGEROUS_PROPERTY_NAMES = new Set([
|
|
133
|
+
'constructor', '__proto__', 'prototype',
|
|
134
|
+
]); }
|
|
135
|
+
/** Binary operators the evaluator permits. `instanceof`/`in`/bitwise are excluded. @private */
|
|
136
|
+
static { this.ALLOWED_BINARY_OPERATORS = new Set([
|
|
137
|
+
'==', '!=', '===', '!==', '<', '<=', '>', '>=', '+', '-', '*', '/', '%',
|
|
138
|
+
]); }
|
|
139
|
+
/** Unary operators the evaluator permits. `delete`/`void` are excluded. @private */
|
|
140
|
+
static { this.ALLOWED_UNARY_OPERATORS = new Set(['!', '-', '+', 'typeof']); }
|
|
92
141
|
/**
|
|
93
142
|
* Safe methods that can be called on objects
|
|
94
143
|
* @private
|
|
@@ -186,7 +235,8 @@ export class SafeExpressionEvaluator {
|
|
|
186
235
|
}
|
|
187
236
|
}
|
|
188
237
|
/**
|
|
189
|
-
* Validates an expression for safety
|
|
238
|
+
* Validates an expression for safety by parsing it and walking the AST against
|
|
239
|
+
* an allowlist. Returns an error message if any construct is not permitted.
|
|
190
240
|
*
|
|
191
241
|
* @param {string} expression - The expression to validate
|
|
192
242
|
*
|
|
@@ -201,13 +251,9 @@ export class SafeExpressionEvaluator {
|
|
|
201
251
|
if (expression.length > 1000) {
|
|
202
252
|
return 'Expression exceeds maximum length of 1000 characters';
|
|
203
253
|
}
|
|
204
|
-
//
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
return `Expression contains forbidden construct: ${pattern.source}`;
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
// Basic syntax validation - ensure balanced parentheses
|
|
254
|
+
// Basic syntax validation - ensure balanced parentheses (kept for a precise
|
|
255
|
+
// error message ahead of the parser, which would otherwise report a generic
|
|
256
|
+
// syntax error).
|
|
211
257
|
let parenCount = 0;
|
|
212
258
|
for (const char of expression) {
|
|
213
259
|
if (char === '(')
|
|
@@ -221,8 +267,216 @@ export class SafeExpressionEvaluator {
|
|
|
221
267
|
if (parenCount !== 0) {
|
|
222
268
|
return 'Unbalanced parentheses in expression';
|
|
223
269
|
}
|
|
270
|
+
// A whitespace-only expression compiles to `Boolean( )`, i.e. false — there
|
|
271
|
+
// is nothing to parse or validate.
|
|
272
|
+
if (expression.trim() === '') {
|
|
273
|
+
return null;
|
|
274
|
+
}
|
|
275
|
+
let program;
|
|
276
|
+
try {
|
|
277
|
+
program = parse(expression, { ecmaVersion: 2022 });
|
|
278
|
+
}
|
|
279
|
+
catch (e) {
|
|
280
|
+
return this.forbidden(`it is not a parseable single expression (${e instanceof Error ? e.message : String(e)})`);
|
|
281
|
+
}
|
|
282
|
+
if (program.body.length !== 1 || program.body[0].type !== 'ExpressionStatement') {
|
|
283
|
+
return this.forbidden('only a single expression is permitted — no statements, blocks, or semicolons');
|
|
284
|
+
}
|
|
285
|
+
return this.checkNode(program.body[0].expression);
|
|
286
|
+
}
|
|
287
|
+
/** Builds the standard rejection message. @private */
|
|
288
|
+
forbidden(detail) {
|
|
289
|
+
return `Expression contains a forbidden construct: ${detail}`;
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* Walks an AST node against the allowlist. Returns an error message on the first
|
|
293
|
+
* disallowed construct, or null if the entire subtree is permitted.
|
|
294
|
+
* @private
|
|
295
|
+
*/
|
|
296
|
+
checkNode(node) {
|
|
297
|
+
switch (node.type) {
|
|
298
|
+
case 'Literal': {
|
|
299
|
+
const lit = node;
|
|
300
|
+
// Regex literals can be crafted for catastrophic backtracking; permit strings/numbers/booleans/null only.
|
|
301
|
+
if (lit.value instanceof RegExp || 'regex' in lit) {
|
|
302
|
+
return this.forbidden('regular expression literals are not allowed');
|
|
303
|
+
}
|
|
304
|
+
return null;
|
|
305
|
+
}
|
|
306
|
+
case 'Identifier': {
|
|
307
|
+
const name = node.name;
|
|
308
|
+
if (SafeExpressionEvaluator.DANGEROUS_IDENTIFIERS.has(name)) {
|
|
309
|
+
return this.forbidden(`the identifier "${name}"`);
|
|
310
|
+
}
|
|
311
|
+
return null;
|
|
312
|
+
}
|
|
313
|
+
case 'ChainExpression':
|
|
314
|
+
// `a?.b`, `a?.[0]`, `a?.b()` — the optional marker changes only whether the member
|
|
315
|
+
// read short-circuits on null/undefined, so unwrapping lands the inner node back in
|
|
316
|
+
// the ordinary member/call rules and `a?.constructor` stays blocked.
|
|
317
|
+
return this.checkNode(node.expression);
|
|
318
|
+
case 'MemberExpression':
|
|
319
|
+
return this.checkMemberExpression(node);
|
|
320
|
+
case 'CallExpression':
|
|
321
|
+
return this.checkCallExpression(node);
|
|
322
|
+
case 'ArrowFunctionExpression':
|
|
323
|
+
return this.checkArrowFunction(node);
|
|
324
|
+
case 'BinaryExpression': {
|
|
325
|
+
const bin = node;
|
|
326
|
+
if (!SafeExpressionEvaluator.ALLOWED_BINARY_OPERATORS.has(bin.operator)) {
|
|
327
|
+
return this.forbidden(`the operator "${bin.operator}"`);
|
|
328
|
+
}
|
|
329
|
+
return this.checkNode(bin.left) ?? this.checkNode(bin.right);
|
|
330
|
+
}
|
|
331
|
+
case 'LogicalExpression': {
|
|
332
|
+
const log = node;
|
|
333
|
+
return this.checkNode(log.left) ?? this.checkNode(log.right);
|
|
334
|
+
}
|
|
335
|
+
case 'UnaryExpression': {
|
|
336
|
+
const un = node;
|
|
337
|
+
if (!SafeExpressionEvaluator.ALLOWED_UNARY_OPERATORS.has(un.operator)) {
|
|
338
|
+
return this.forbidden(`the unary operator "${un.operator}"`);
|
|
339
|
+
}
|
|
340
|
+
return this.checkNode(un.argument);
|
|
341
|
+
}
|
|
342
|
+
case 'ConditionalExpression': {
|
|
343
|
+
const cond = node;
|
|
344
|
+
return this.checkNode(cond.test) ?? this.checkNode(cond.consequent) ?? this.checkNode(cond.alternate);
|
|
345
|
+
}
|
|
346
|
+
case 'ArrayExpression': {
|
|
347
|
+
const arr = node;
|
|
348
|
+
for (const el of arr.elements) {
|
|
349
|
+
if (!el)
|
|
350
|
+
continue; // array hole
|
|
351
|
+
if (el.type === 'SpreadElement') {
|
|
352
|
+
return this.forbidden('spread elements are not allowed');
|
|
353
|
+
}
|
|
354
|
+
const err = this.checkNode(el);
|
|
355
|
+
if (err)
|
|
356
|
+
return err;
|
|
357
|
+
}
|
|
358
|
+
return null;
|
|
359
|
+
}
|
|
360
|
+
default:
|
|
361
|
+
return this.forbidden(`${node.type} is not allowed`);
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
* Member access is allowed for dotted property reads and literal-key bracket
|
|
366
|
+
* reads, but never for a computed key built at runtime (the string-concat
|
|
367
|
+
* escape route) or a prototype-chain property.
|
|
368
|
+
* @private
|
|
369
|
+
*/
|
|
370
|
+
checkMemberExpression(node) {
|
|
371
|
+
if (node.property.type === 'PrivateIdentifier') {
|
|
372
|
+
return this.forbidden('private fields are not allowed');
|
|
373
|
+
}
|
|
374
|
+
if (node.computed) {
|
|
375
|
+
// Bracket access must use a literal — a computed key (`x["con"+"structor"]`,
|
|
376
|
+
// `x[y]`) is exactly the route a textual denylist misses, so reject anything
|
|
377
|
+
// that is not a plain string/number literal.
|
|
378
|
+
if (node.property.type !== 'Literal') {
|
|
379
|
+
return this.forbidden('computed member access must use a literal index/key');
|
|
380
|
+
}
|
|
381
|
+
const value = node.property.value;
|
|
382
|
+
if (typeof value === 'string') {
|
|
383
|
+
if (SafeExpressionEvaluator.DANGEROUS_PROPERTY_NAMES.has(value)) {
|
|
384
|
+
return this.forbidden(`access to "${value}"`);
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
else if (typeof value !== 'number') {
|
|
388
|
+
return this.forbidden('computed member access must use a string or numeric literal');
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
else {
|
|
392
|
+
const name = node.property.name;
|
|
393
|
+
if (SafeExpressionEvaluator.DANGEROUS_PROPERTY_NAMES.has(name)) {
|
|
394
|
+
return this.forbidden(`access to "${name}"`);
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
return this.checkNode(node.object);
|
|
398
|
+
}
|
|
399
|
+
/**
|
|
400
|
+
* A call is admitted only when its callee is a FIXED name on one of two allowlists: a bare
|
|
401
|
+
* safe global (`parseInt(...)`) or a dotted method that is either a safe instance method or a
|
|
402
|
+
* method of a safe global namespace (`Math.abs(...)`). Everything else — a computed callee, an
|
|
403
|
+
* unlisted bare identifier (`eval(...)`, `Function(...)`), a call on a call's result that is
|
|
404
|
+
* not itself a safe method — is rejected.
|
|
405
|
+
* @private
|
|
406
|
+
*/
|
|
407
|
+
checkCallExpression(node) {
|
|
408
|
+
const callee = node.callee;
|
|
409
|
+
if (callee.type === 'Identifier') {
|
|
410
|
+
const name = callee.name;
|
|
411
|
+
if (!SAFE_GLOBAL_CALLABLES.has(name)) {
|
|
412
|
+
return this.forbidden(`calling "${name}" — only safe methods and safe global functions may be invoked`);
|
|
413
|
+
}
|
|
414
|
+
return this.checkCallArguments(node);
|
|
415
|
+
}
|
|
416
|
+
if (callee.type !== 'MemberExpression') {
|
|
417
|
+
return this.forbidden('only method calls on the safe-method allowlist may be invoked');
|
|
418
|
+
}
|
|
419
|
+
const member = callee;
|
|
420
|
+
if (member.computed || member.property.type !== 'Identifier') {
|
|
421
|
+
return this.forbidden('methods must be called by a dotted, non-computed name');
|
|
422
|
+
}
|
|
423
|
+
const method = member.property.name;
|
|
424
|
+
if (!this.isCallableMethod(member.object, method)) {
|
|
425
|
+
return this.forbidden(`the method "${method}" is not on the safe-method allowlist`);
|
|
426
|
+
}
|
|
427
|
+
const receiverError = this.checkNode(member.object);
|
|
428
|
+
if (receiverError)
|
|
429
|
+
return receiverError;
|
|
430
|
+
return this.checkCallArguments(node);
|
|
431
|
+
}
|
|
432
|
+
/**
|
|
433
|
+
* Whether `<receiver>.<method>()` names a permitted call: a safe instance method on any value,
|
|
434
|
+
* or a method of a safe global namespace when the receiver is that namespace by bare name.
|
|
435
|
+
* @private
|
|
436
|
+
*/
|
|
437
|
+
isCallableMethod(receiver, method) {
|
|
438
|
+
if (SafeExpressionEvaluator.SAFE_METHODS.includes(method)) {
|
|
439
|
+
return true;
|
|
440
|
+
}
|
|
441
|
+
if (receiver.type !== 'Identifier') {
|
|
442
|
+
return false;
|
|
443
|
+
}
|
|
444
|
+
return SAFE_GLOBAL_NAMESPACE_METHODS.get(receiver.name)?.has(method) === true;
|
|
445
|
+
}
|
|
446
|
+
/** Walks a call's arguments; spreads are rejected outright. @private */
|
|
447
|
+
checkCallArguments(node) {
|
|
448
|
+
for (const arg of node.arguments) {
|
|
449
|
+
if (arg.type === 'SpreadElement') {
|
|
450
|
+
return this.forbidden('spread arguments are not allowed');
|
|
451
|
+
}
|
|
452
|
+
const err = this.checkNode(arg);
|
|
453
|
+
if (err)
|
|
454
|
+
return err;
|
|
455
|
+
}
|
|
224
456
|
return null;
|
|
225
457
|
}
|
|
458
|
+
/**
|
|
459
|
+
* Arrow functions are permitted only as callback arguments to the safe array
|
|
460
|
+
* methods; parameters must be simple identifiers and the body an expression.
|
|
461
|
+
* @private
|
|
462
|
+
*/
|
|
463
|
+
checkArrowFunction(node) {
|
|
464
|
+
if (node.async) {
|
|
465
|
+
return this.forbidden('async functions are not allowed');
|
|
466
|
+
}
|
|
467
|
+
for (const param of node.params) {
|
|
468
|
+
if (param.type !== 'Identifier') {
|
|
469
|
+
return this.forbidden('arrow-function parameters must be simple identifiers');
|
|
470
|
+
}
|
|
471
|
+
if (SafeExpressionEvaluator.DANGEROUS_IDENTIFIERS.has(param.name)) {
|
|
472
|
+
return this.forbidden(`the parameter "${param.name}"`);
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
if (node.body.type === 'BlockStatement') {
|
|
476
|
+
return this.forbidden('arrow-function bodies must be an expression, not a block');
|
|
477
|
+
}
|
|
478
|
+
return this.checkNode(node.body);
|
|
479
|
+
}
|
|
226
480
|
/**
|
|
227
481
|
* Creates a safe context object with only allowed properties
|
|
228
482
|
*
|
|
@@ -322,6 +576,55 @@ export class SafeExpressionEvaluator {
|
|
|
322
576
|
return '[Object]';
|
|
323
577
|
}
|
|
324
578
|
}
|
|
579
|
+
/**
|
|
580
|
+
* Checks whether an expression *could* be evaluated, without evaluating it.
|
|
581
|
+
*
|
|
582
|
+
* The difference matters because `evaluate` reports two unrelated problems the same way. Given
|
|
583
|
+
* a condition authored against a runtime envelope, an empty context makes `payload.x > 1` fail
|
|
584
|
+
* with `payload is not defined` — indistinguishable, by result shape, from `payload.x >` failing
|
|
585
|
+
* with `Unexpected token`. One is a typo the author should be told about at the door; the other
|
|
586
|
+
* is a perfectly good condition that simply has no data yet. A submit-time check built on
|
|
587
|
+
* `evaluate` therefore refuses every legitimate condition.
|
|
588
|
+
*
|
|
589
|
+
* So this compiles and never runs. The expression goes through the same policy screen
|
|
590
|
+
* `evaluate` applies (the AST allowlist), then the same function body is BUILT and discarded —
|
|
591
|
+
* never invoked. Values are never consulted, which is precisely the property wanted: unknown
|
|
592
|
+
* identifiers, absent properties and undefined chains all PASS, because none of them is a syntax
|
|
593
|
+
* error and whether they resolve is a question about a run that has not happened yet.
|
|
594
|
+
*
|
|
595
|
+
* **Compilation is not evaluation**, and the distinction is load-bearing for safety: `Function`
|
|
596
|
+
* parses the body and returns; nothing in the expression executes. The policy screen still runs
|
|
597
|
+
* first, so the constructs `evaluate` refuses are refused here too — those produce a permanent
|
|
598
|
+
* runtime refusal, and an author is better told now.
|
|
599
|
+
*
|
|
600
|
+
* `Undecidable` is the honest third answer. A host that forbids dynamic compilation (a strict
|
|
601
|
+
* CSP without `unsafe-eval`) cannot answer the question at all, and a validator that read that
|
|
602
|
+
* as "invalid" would refuse every condition in the browser. Callers should treat it as a pass.
|
|
603
|
+
*
|
|
604
|
+
* @param expression the expression to check
|
|
605
|
+
* @returns `Valid: true` when it parses; `Valid: false` with `Error` when it definitely does
|
|
606
|
+
* not; `Valid: true` with `Undecidable: true` when this environment cannot compile
|
|
607
|
+
*/
|
|
608
|
+
validateSyntax(expression) {
|
|
609
|
+
const policyError = this.validateExpression(expression);
|
|
610
|
+
if (policyError) {
|
|
611
|
+
return { Valid: false, Error: policyError };
|
|
612
|
+
}
|
|
613
|
+
try {
|
|
614
|
+
// Same wrapper `evaluate` compiles, so anything that parses here parses there. Built and
|
|
615
|
+
// discarded — never invoked.
|
|
616
|
+
new Function(`"use strict"; return Boolean(${expression});`);
|
|
617
|
+
return { Valid: true };
|
|
618
|
+
}
|
|
619
|
+
catch (e) {
|
|
620
|
+
if (e instanceof SyntaxError) {
|
|
621
|
+
return { Valid: false, Error: e.message };
|
|
622
|
+
}
|
|
623
|
+
// Anything else — an EvalError from a CSP, a host without `Function` — means this
|
|
624
|
+
// environment cannot judge, not that the expression is wrong.
|
|
625
|
+
return { Valid: true, Undecidable: true };
|
|
626
|
+
}
|
|
627
|
+
}
|
|
325
628
|
/**
|
|
326
629
|
* Evaluates multiple expressions and returns all results
|
|
327
630
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SafeExpressionEvaluator.js","sourceRoot":"","sources":["../src/SafeExpressionEvaluator.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SafeExpressionEvaluator.js","sourceRoot":"","sources":["../src/SafeExpressionEvaluator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DeepDiff.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/DeepDiff.test.ts"],"names":[],"mappings":""}
|