eslint-plugin-secure-coding 1.0.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.
Files changed (155) hide show
  1. package/AGENTS.md +196 -0
  2. package/CHANGELOG.md +105 -0
  3. package/LICENSE +23 -0
  4. package/README.md +377 -0
  5. package/package.json +80 -0
  6. package/src/index.d.ts +32 -0
  7. package/src/index.js +345 -0
  8. package/src/index.js.map +1 -0
  9. package/src/rules/security/database-injection.d.ts +13 -0
  10. package/src/rules/security/database-injection.js +407 -0
  11. package/src/rules/security/database-injection.js.map +1 -0
  12. package/src/rules/security/detect-child-process.d.ts +11 -0
  13. package/src/rules/security/detect-child-process.js +460 -0
  14. package/src/rules/security/detect-child-process.js.map +1 -0
  15. package/src/rules/security/detect-eval-with-expression.d.ts +9 -0
  16. package/src/rules/security/detect-eval-with-expression.js +393 -0
  17. package/src/rules/security/detect-eval-with-expression.js.map +1 -0
  18. package/src/rules/security/detect-non-literal-fs-filename.d.ts +7 -0
  19. package/src/rules/security/detect-non-literal-fs-filename.js +322 -0
  20. package/src/rules/security/detect-non-literal-fs-filename.js.map +1 -0
  21. package/src/rules/security/detect-non-literal-regexp.d.ts +9 -0
  22. package/src/rules/security/detect-non-literal-regexp.js +387 -0
  23. package/src/rules/security/detect-non-literal-regexp.js.map +1 -0
  24. package/src/rules/security/detect-object-injection.d.ts +11 -0
  25. package/src/rules/security/detect-object-injection.js +411 -0
  26. package/src/rules/security/detect-object-injection.js.map +1 -0
  27. package/src/rules/security/no-buffer-overread.d.ts +14 -0
  28. package/src/rules/security/no-buffer-overread.js +519 -0
  29. package/src/rules/security/no-buffer-overread.js.map +1 -0
  30. package/src/rules/security/no-clickjacking.d.ts +10 -0
  31. package/src/rules/security/no-clickjacking.js +381 -0
  32. package/src/rules/security/no-clickjacking.js.map +1 -0
  33. package/src/rules/security/no-directive-injection.d.ts +12 -0
  34. package/src/rules/security/no-directive-injection.js +446 -0
  35. package/src/rules/security/no-directive-injection.js.map +1 -0
  36. package/src/rules/security/no-document-cookie.d.ts +5 -0
  37. package/src/rules/security/no-document-cookie.js +90 -0
  38. package/src/rules/security/no-document-cookie.js.map +1 -0
  39. package/src/rules/security/no-electron-security-issues.d.ts +10 -0
  40. package/src/rules/security/no-electron-security-issues.js +421 -0
  41. package/src/rules/security/no-electron-security-issues.js.map +1 -0
  42. package/src/rules/security/no-exposed-sensitive-data.d.ts +11 -0
  43. package/src/rules/security/no-exposed-sensitive-data.js +341 -0
  44. package/src/rules/security/no-exposed-sensitive-data.js.map +1 -0
  45. package/src/rules/security/no-format-string-injection.d.ts +17 -0
  46. package/src/rules/security/no-format-string-injection.js +653 -0
  47. package/src/rules/security/no-format-string-injection.js.map +1 -0
  48. package/src/rules/security/no-graphql-injection.d.ts +12 -0
  49. package/src/rules/security/no-graphql-injection.js +410 -0
  50. package/src/rules/security/no-graphql-injection.js.map +1 -0
  51. package/src/rules/security/no-hardcoded-credentials.d.ts +26 -0
  52. package/src/rules/security/no-hardcoded-credentials.js +377 -0
  53. package/src/rules/security/no-hardcoded-credentials.js.map +1 -0
  54. package/src/rules/security/no-improper-sanitization.d.ts +12 -0
  55. package/src/rules/security/no-improper-sanitization.js +408 -0
  56. package/src/rules/security/no-improper-sanitization.js.map +1 -0
  57. package/src/rules/security/no-improper-type-validation.d.ts +10 -0
  58. package/src/rules/security/no-improper-type-validation.js +420 -0
  59. package/src/rules/security/no-improper-type-validation.js.map +1 -0
  60. package/src/rules/security/no-insecure-comparison.d.ts +7 -0
  61. package/src/rules/security/no-insecure-comparison.js +125 -0
  62. package/src/rules/security/no-insecure-comparison.js.map +1 -0
  63. package/src/rules/security/no-insecure-cookie-settings.d.ts +9 -0
  64. package/src/rules/security/no-insecure-cookie-settings.js +305 -0
  65. package/src/rules/security/no-insecure-cookie-settings.js.map +1 -0
  66. package/src/rules/security/no-insecure-jwt.d.ts +10 -0
  67. package/src/rules/security/no-insecure-jwt.js +338 -0
  68. package/src/rules/security/no-insecure-jwt.js.map +1 -0
  69. package/src/rules/security/no-insecure-redirects.d.ts +7 -0
  70. package/src/rules/security/no-insecure-redirects.js +215 -0
  71. package/src/rules/security/no-insecure-redirects.js.map +1 -0
  72. package/src/rules/security/no-insufficient-postmessage-validation.d.ts +14 -0
  73. package/src/rules/security/no-insufficient-postmessage-validation.js +390 -0
  74. package/src/rules/security/no-insufficient-postmessage-validation.js.map +1 -0
  75. package/src/rules/security/no-insufficient-random.d.ts +9 -0
  76. package/src/rules/security/no-insufficient-random.js +207 -0
  77. package/src/rules/security/no-insufficient-random.js.map +1 -0
  78. package/src/rules/security/no-ldap-injection.d.ts +10 -0
  79. package/src/rules/security/no-ldap-injection.js +449 -0
  80. package/src/rules/security/no-ldap-injection.js.map +1 -0
  81. package/src/rules/security/no-missing-authentication.d.ts +13 -0
  82. package/src/rules/security/no-missing-authentication.js +322 -0
  83. package/src/rules/security/no-missing-authentication.js.map +1 -0
  84. package/src/rules/security/no-missing-cors-check.d.ts +9 -0
  85. package/src/rules/security/no-missing-cors-check.js +449 -0
  86. package/src/rules/security/no-missing-cors-check.js.map +1 -0
  87. package/src/rules/security/no-missing-csrf-protection.d.ts +11 -0
  88. package/src/rules/security/no-missing-csrf-protection.js +183 -0
  89. package/src/rules/security/no-missing-csrf-protection.js.map +1 -0
  90. package/src/rules/security/no-missing-security-headers.d.ts +7 -0
  91. package/src/rules/security/no-missing-security-headers.js +217 -0
  92. package/src/rules/security/no-missing-security-headers.js.map +1 -0
  93. package/src/rules/security/no-privilege-escalation.d.ts +13 -0
  94. package/src/rules/security/no-privilege-escalation.js +321 -0
  95. package/src/rules/security/no-privilege-escalation.js.map +1 -0
  96. package/src/rules/security/no-redos-vulnerable-regex.d.ts +7 -0
  97. package/src/rules/security/no-redos-vulnerable-regex.js +307 -0
  98. package/src/rules/security/no-redos-vulnerable-regex.js.map +1 -0
  99. package/src/rules/security/no-sensitive-data-exposure.d.ts +11 -0
  100. package/src/rules/security/no-sensitive-data-exposure.js +251 -0
  101. package/src/rules/security/no-sensitive-data-exposure.js.map +1 -0
  102. package/src/rules/security/no-sql-injection.d.ts +10 -0
  103. package/src/rules/security/no-sql-injection.js +332 -0
  104. package/src/rules/security/no-sql-injection.js.map +1 -0
  105. package/src/rules/security/no-timing-attack.d.ts +10 -0
  106. package/src/rules/security/no-timing-attack.js +358 -0
  107. package/src/rules/security/no-timing-attack.js.map +1 -0
  108. package/src/rules/security/no-toctou-vulnerability.d.ts +7 -0
  109. package/src/rules/security/no-toctou-vulnerability.js +165 -0
  110. package/src/rules/security/no-toctou-vulnerability.js.map +1 -0
  111. package/src/rules/security/no-unchecked-loop-condition.d.ts +12 -0
  112. package/src/rules/security/no-unchecked-loop-condition.js +635 -0
  113. package/src/rules/security/no-unchecked-loop-condition.js.map +1 -0
  114. package/src/rules/security/no-unencrypted-transmission.d.ts +11 -0
  115. package/src/rules/security/no-unencrypted-transmission.js +237 -0
  116. package/src/rules/security/no-unencrypted-transmission.js.map +1 -0
  117. package/src/rules/security/no-unescaped-url-parameter.d.ts +9 -0
  118. package/src/rules/security/no-unescaped-url-parameter.js +266 -0
  119. package/src/rules/security/no-unescaped-url-parameter.js.map +1 -0
  120. package/src/rules/security/no-unlimited-resource-allocation.d.ts +12 -0
  121. package/src/rules/security/no-unlimited-resource-allocation.js +659 -0
  122. package/src/rules/security/no-unlimited-resource-allocation.js.map +1 -0
  123. package/src/rules/security/no-unsafe-deserialization.d.ts +10 -0
  124. package/src/rules/security/no-unsafe-deserialization.js +501 -0
  125. package/src/rules/security/no-unsafe-deserialization.js.map +1 -0
  126. package/src/rules/security/no-unsafe-dynamic-require.d.ts +5 -0
  127. package/src/rules/security/no-unsafe-dynamic-require.js +107 -0
  128. package/src/rules/security/no-unsafe-dynamic-require.js.map +1 -0
  129. package/src/rules/security/no-unsafe-regex-construction.d.ts +9 -0
  130. package/src/rules/security/no-unsafe-regex-construction.js +292 -0
  131. package/src/rules/security/no-unsafe-regex-construction.js.map +1 -0
  132. package/src/rules/security/no-unsanitized-html.d.ts +9 -0
  133. package/src/rules/security/no-unsanitized-html.js +347 -0
  134. package/src/rules/security/no-unsanitized-html.js.map +1 -0
  135. package/src/rules/security/no-unvalidated-user-input.d.ts +9 -0
  136. package/src/rules/security/no-unvalidated-user-input.js +418 -0
  137. package/src/rules/security/no-unvalidated-user-input.js.map +1 -0
  138. package/src/rules/security/no-weak-crypto.d.ts +11 -0
  139. package/src/rules/security/no-weak-crypto.js +350 -0
  140. package/src/rules/security/no-weak-crypto.js.map +1 -0
  141. package/src/rules/security/no-weak-password-recovery.d.ts +12 -0
  142. package/src/rules/security/no-weak-password-recovery.js +401 -0
  143. package/src/rules/security/no-weak-password-recovery.js.map +1 -0
  144. package/src/rules/security/no-xpath-injection.d.ts +10 -0
  145. package/src/rules/security/no-xpath-injection.js +487 -0
  146. package/src/rules/security/no-xpath-injection.js.map +1 -0
  147. package/src/rules/security/no-xxe-injection.d.ts +7 -0
  148. package/src/rules/security/no-xxe-injection.js +270 -0
  149. package/src/rules/security/no-xxe-injection.js.map +1 -0
  150. package/src/rules/security/no-zip-slip.d.ts +9 -0
  151. package/src/rules/security/no-zip-slip.js +446 -0
  152. package/src/rules/security/no-zip-slip.js.map +1 -0
  153. package/src/types/index.d.ts +131 -0
  154. package/src/types/index.js +18 -0
  155. package/src/types/index.js.map +1 -0
@@ -0,0 +1,387 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.detectNonLiteralRegexp = void 0;
4
+ const eslint_devkit_1 = require("@interlace/eslint-devkit");
5
+ const eslint_devkit_2 = require("@interlace/eslint-devkit");
6
+ // Type guard for regex literal nodes
7
+ const isRegExpLiteral = (node) => {
8
+ return node.type === 'Literal' && Object.prototype.hasOwnProperty.call(node, 'regex');
9
+ };
10
+ const REGEXP_PATTERNS = [
11
+ {
12
+ pattern: 'new RegExp\\(.*\\)',
13
+ dangerous: true,
14
+ vulnerability: 'redos',
15
+ safeAlternative: 'Pre-defined RegExp constants',
16
+ example: {
17
+ bad: 'new RegExp(userInput)',
18
+ good: 'const PATTERNS = { email: /^[a-zA-Z0-9]+$/ }; PATTERNS[userChoice]'
19
+ },
20
+ effort: '10-15 minutes',
21
+ riskLevel: 'high'
22
+ },
23
+ {
24
+ pattern: 'RegExp\\(.*\\)',
25
+ dangerous: true,
26
+ vulnerability: 'redos',
27
+ safeAlternative: 'Static RegExp literals or validated patterns',
28
+ example: {
29
+ bad: 'RegExp(userPattern)',
30
+ good: 'const safePattern = userPattern.replace(/[.*+?^${}()|[\\]\\\\]/g, \'\\\\$&\'); new RegExp(`^${safePattern}$`)'
31
+ },
32
+ effort: '15-20 minutes',
33
+ riskLevel: 'high'
34
+ },
35
+ {
36
+ pattern: '/.*\\*\\*.*|.*\\+\\+.*|.*\\?\\?/',
37
+ dangerous: true,
38
+ vulnerability: 'redos',
39
+ safeAlternative: 'Avoid nested quantifiers, use atomic groups',
40
+ example: {
41
+ bad: '/(a+)+b/', // ReDoS vulnerable
42
+ good: '/(?>a+)b/', // Atomic group (if supported) or restructure
43
+ },
44
+ effort: '20-30 minutes',
45
+ riskLevel: 'critical'
46
+ }
47
+ ];
48
+ exports.detectNonLiteralRegexp = (0, eslint_devkit_2.createRule)({
49
+ name: 'detect-non-literal-regexp',
50
+ meta: {
51
+ type: 'problem',
52
+ docs: {
53
+ description: 'Detects RegExp(variable), which might allow an attacker to DOS your server with a long-running regular expression',
54
+ },
55
+ messages: {
56
+ // 🎯 Token optimization: 41% reduction (51→30 tokens) - compact template variables
57
+ regexpReDoS: (0, eslint_devkit_1.formatLLMMessage)({
58
+ icon: eslint_devkit_1.MessageIcons.WARNING,
59
+ issueName: 'ReDoS vulnerability',
60
+ cwe: 'CWE-400',
61
+ description: 'ReDoS vulnerability detected',
62
+ severity: '{{riskLevel}}',
63
+ fix: '{{safeAlternative}}',
64
+ documentationLink: 'https://owasp.org/www-community/attacks/Regular_expression_Denial_of_Service_-_ReDoS',
65
+ }),
66
+ useStaticRegex: (0, eslint_devkit_1.formatLLMMessage)({
67
+ icon: eslint_devkit_1.MessageIcons.INFO,
68
+ issueName: 'Use Static Regex',
69
+ description: 'Use pre-defined RegExp constants',
70
+ severity: 'LOW',
71
+ fix: 'const PATTERN = /^[a-z]+$/; // Define at module level',
72
+ documentationLink: 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp',
73
+ }),
74
+ validateInput: (0, eslint_devkit_1.formatLLMMessage)({
75
+ icon: eslint_devkit_1.MessageIcons.INFO,
76
+ issueName: 'Validate Input',
77
+ description: 'Validate and escape user input',
78
+ severity: 'LOW',
79
+ fix: 'Validate input length and characters before RegExp',
80
+ documentationLink: 'https://owasp.org/www-community/attacks/Regular_expression_Denial_of_Service_-_ReDoS',
81
+ }),
82
+ useRegexLibrary: (0, eslint_devkit_1.formatLLMMessage)({
83
+ icon: eslint_devkit_1.MessageIcons.INFO,
84
+ issueName: 'Use Safe Library',
85
+ description: 'Use safe-regex library or re2',
86
+ severity: 'LOW',
87
+ fix: 'import { isSafe } from "safe-regex"; if (isSafe(pattern)) ...',
88
+ documentationLink: 'https://github.com/substack/safe-regex',
89
+ }),
90
+ addTimeout: (0, eslint_devkit_1.formatLLMMessage)({
91
+ icon: eslint_devkit_1.MessageIcons.INFO,
92
+ issueName: 'Add Timeout',
93
+ description: 'Add timeout to regex operations',
94
+ severity: 'LOW',
95
+ fix: 'Use timeout wrapper for regex operations',
96
+ documentationLink: 'https://owasp.org/www-community/attacks/Regular_expression_Denial_of_Service_-_ReDoS',
97
+ }),
98
+ escapeUserInput: (0, eslint_devkit_1.formatLLMMessage)({
99
+ icon: eslint_devkit_1.MessageIcons.INFO,
100
+ issueName: 'Escape Input',
101
+ description: 'Escape special regex characters',
102
+ severity: 'LOW',
103
+ fix: 'input.replace(/[.*+?^${}()|[\\]\\\\]/g, "\\\\$&")',
104
+ documentationLink: 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping',
105
+ })
106
+ },
107
+ schema: [
108
+ {
109
+ type: 'object',
110
+ properties: {
111
+ allowLiterals: {
112
+ type: 'boolean',
113
+ default: false,
114
+ description: 'Allow literal string regex patterns'
115
+ },
116
+ additionalPatterns: {
117
+ type: 'array',
118
+ items: { type: 'string' },
119
+ default: [],
120
+ description: 'Additional RegExp creation patterns to check'
121
+ },
122
+ maxPatternLength: {
123
+ type: 'number',
124
+ default: 100,
125
+ minimum: 1,
126
+ description: 'Maximum allowed pattern length for dynamic regex'
127
+ }
128
+ },
129
+ additionalProperties: false,
130
+ },
131
+ ],
132
+ },
133
+ defaultOptions: [
134
+ {
135
+ allowLiterals: false,
136
+ additionalPatterns: [],
137
+ maxPatternLength: 100
138
+ },
139
+ ],
140
+ create(context) {
141
+ const options = context.options[0] || {};
142
+ const { allowLiterals = false, maxPatternLength = 100 } = options || {};
143
+ /**
144
+ * Check if a node is a literal string (potentially safe)
145
+ */
146
+ const isLiteralString = (node) => {
147
+ return node.type === 'Literal' && typeof node.value === 'string';
148
+ };
149
+ /**
150
+ * Check if a regex pattern contains dangerous ReDoS patterns
151
+ */
152
+ const hasReDoSPatterns = (pattern) => {
153
+ // Common ReDoS patterns
154
+ return /(?:\*\*|\+\+|\\?\\?|\\*\\*)/.test(pattern) || // Nested quantifiers
155
+ /(a+)+b|(x+)+y|(a*)*b/.test(pattern) || // Exponential backtracking
156
+ /([a-zA-Z]+)*[a-zA-Z]/.test(pattern); // Polynomial backtracking
157
+ };
158
+ /**
159
+ * Extract regex pattern from RegExp construction
160
+ */
161
+ const extractPattern = (node) => {
162
+ const sourceCode = context.sourceCode || context.sourceCode;
163
+ // Determine constructor type
164
+ let constructor = 'RegExp';
165
+ if (node.type === 'NewExpression' && node.callee.type === 'Identifier') {
166
+ constructor = `new ${node.callee.name}`;
167
+ }
168
+ // First argument is the pattern
169
+ const patternNode = node.arguments.length > 0 ? node.arguments[0] : null;
170
+ const pattern = patternNode ? sourceCode.getText(patternNode) : '';
171
+ const isDynamic = patternNode ? !isLiteralString(patternNode) : false;
172
+ const length = patternNode && isLiteralString(patternNode) ?
173
+ String(patternNode.value).length : pattern.length;
174
+ return { pattern, patternNode, constructor, isDynamic, length };
175
+ };
176
+ /**
177
+ * Detect the specific vulnerability pattern
178
+ */
179
+ const detectVulnerability = (pattern, isDynamic) => {
180
+ // Check for dynamic construction first (highest risk)
181
+ if (isDynamic) {
182
+ for (const vuln of REGEXP_PATTERNS) {
183
+ if (new RegExp(vuln.pattern, 'i').test(pattern)) {
184
+ return vuln;
185
+ }
186
+ }
187
+ // Generic dynamic RegExp construction
188
+ return {
189
+ pattern: 'dynamic',
190
+ dangerous: true,
191
+ vulnerability: 'redos',
192
+ safeAlternative: 'Pre-defined RegExp constants',
193
+ example: {
194
+ bad: pattern,
195
+ good: 'const PATTERNS = { email: /^[a-zA-Z0-9]+$/ }; PATTERNS[type]'
196
+ },
197
+ effort: '10-15 minutes',
198
+ riskLevel: 'high'
199
+ };
200
+ }
201
+ // Check for ReDoS patterns in literal regex
202
+ if (hasReDoSPatterns(pattern)) {
203
+ return {
204
+ pattern: 'redos-literal',
205
+ dangerous: true,
206
+ vulnerability: 'redos',
207
+ safeAlternative: 'Restructure regex to avoid nested quantifiers',
208
+ example: {
209
+ bad: pattern,
210
+ good: pattern.replace(/(a+)\+/g, '$1') // Simplified example
211
+ },
212
+ effort: '20-30 minutes',
213
+ riskLevel: 'high'
214
+ };
215
+ }
216
+ return null;
217
+ };
218
+ /**
219
+ * Generate refactoring steps based on the vulnerability
220
+ */
221
+ const generateRefactoringSteps = (vulnerability) => {
222
+ if (vulnerability.pattern === 'dynamic') {
223
+ return [
224
+ ' 1. Create a whitelist of allowed regex patterns',
225
+ ' 2. Use object lookup: PATTERNS[userChoice]',
226
+ ' 3. If dynamic needed: escape input with regex escaping function',
227
+ ' 4. Add pattern length validation',
228
+ ' 5. Consider using a safe regex library'
229
+ ].join('\n');
230
+ }
231
+ if (vulnerability.pattern === 'redos-literal') {
232
+ return [
233
+ ' 1. Identify nested quantifiers (*+, ++, ?+)',
234
+ ' 2. Restructure regex to avoid exponential backtracking',
235
+ ' 3. Use atomic groups if supported: (?>...)',
236
+ ' 4. Test regex performance with long inputs',
237
+ ' 5. Consider alternatives like string methods'
238
+ ].join('\n');
239
+ }
240
+ switch (vulnerability.vulnerability) {
241
+ case 'redos':
242
+ return [
243
+ ' 1. Avoid nested quantifiers and backreferences',
244
+ ' 2. Use possessive quantifiers: *+, ++, ?+',
245
+ ' 3. Restructure regex to be more specific',
246
+ ' 4. Test with potentially malicious inputs',
247
+ ' 5. Consider safe-regex library validation'
248
+ ].join('\n');
249
+ case 'injection':
250
+ return [
251
+ ' 1. Escape user input before RegExp construction',
252
+ ' 2. Use RegExp.escape() if available',
253
+ ' 3. Validate input against allowed character sets',
254
+ ' 4. Add length limits to prevent oversized patterns',
255
+ ' 5. Use static patterns when possible'
256
+ ].join('\n');
257
+ default:
258
+ return [
259
+ ' 1. Identify the specific regex use case',
260
+ ' 2. Choose appropriate safe alternative',
261
+ ' 3. Add input validation and escaping',
262
+ ' 4. Test thoroughly with edge cases',
263
+ ' 5. Monitor performance in production'
264
+ ].join('\n');
265
+ }
266
+ };
267
+ /**
268
+ * Determine overall risk level
269
+ */
270
+ const determineRiskLevel = (vulnerability, pattern) => {
271
+ if (vulnerability.riskLevel === 'critical' || hasReDoSPatterns(pattern)) {
272
+ return 'CRITICAL';
273
+ }
274
+ if (vulnerability.riskLevel === 'high') {
275
+ return 'HIGH';
276
+ }
277
+ return 'MEDIUM';
278
+ };
279
+ /**
280
+ * Check RegExp constructor calls for vulnerabilities
281
+ */
282
+ const checkRegExpCall = (node) => {
283
+ // Check for RegExp constructor calls
284
+ const isRegExpCall = node.callee.type === 'Identifier' && node.callee.name === 'RegExp';
285
+ const isNewRegExp = node.type === 'NewExpression' && node.callee.type === 'Identifier' && node.callee.name === 'RegExp';
286
+ if (!isRegExpCall && !isNewRegExp) {
287
+ return;
288
+ }
289
+ const { pattern, patternNode, isDynamic, length } = extractPattern(node);
290
+ // Allow literals if configured and pattern is reasonable length
291
+ if (allowLiterals && patternNode && isLiteralString(patternNode) && length <= maxPatternLength) {
292
+ // Still check for ReDoS patterns even in literals
293
+ if (!hasReDoSPatterns(pattern)) {
294
+ return;
295
+ }
296
+ }
297
+ const vulnerability = detectVulnerability(pattern, isDynamic);
298
+ // If no specific vulnerability detected but it's dynamic, still warn
299
+ const effectiveVulnerability = vulnerability || (isDynamic ? {
300
+ pattern: 'dynamic',
301
+ dangerous: true,
302
+ vulnerability: 'redos',
303
+ safeAlternative: 'Use static RegExp patterns',
304
+ example: {
305
+ bad: pattern,
306
+ good: '/^safe-pattern$/'
307
+ },
308
+ effort: '10-15 minutes',
309
+ riskLevel: 'medium'
310
+ } : null);
311
+ if (!effectiveVulnerability) {
312
+ return;
313
+ }
314
+ const riskLevel = determineRiskLevel(effectiveVulnerability, pattern);
315
+ const steps = generateRefactoringSteps(effectiveVulnerability);
316
+ context.report({
317
+ node,
318
+ messageId: 'regexpReDoS',
319
+ data: {
320
+ pattern: pattern.substring(0, 30) + (pattern.length > 30 ? '...' : ''),
321
+ riskLevel,
322
+ vulnerability: effectiveVulnerability.vulnerability,
323
+ safeAlternative: effectiveVulnerability.safeAlternative,
324
+ steps,
325
+ effort: effectiveVulnerability.effort
326
+ },
327
+ suggest: [
328
+ {
329
+ messageId: 'useStaticRegex',
330
+ fix: () => null
331
+ },
332
+ {
333
+ messageId: 'validateInput',
334
+ fix: () => null
335
+ },
336
+ {
337
+ messageId: 'useRegexLibrary',
338
+ fix: () => null
339
+ },
340
+ {
341
+ messageId: 'addTimeout',
342
+ fix: () => null
343
+ },
344
+ {
345
+ messageId: 'escapeUserInput',
346
+ fix: () => null
347
+ }
348
+ ]
349
+ });
350
+ };
351
+ /**
352
+ * Check literal regex patterns for ReDoS vulnerabilities
353
+ */
354
+ const checkLiteralRegExp = (node) => {
355
+ if (!isRegExpLiteral(node)) {
356
+ return;
357
+ }
358
+ const pattern = node.regex.pattern;
359
+ // Check for ReDoS patterns
360
+ if (hasReDoSPatterns(pattern)) {
361
+ const vulnerability = detectVulnerability(pattern, false);
362
+ if (vulnerability) {
363
+ const riskLevel = determineRiskLevel(vulnerability, pattern);
364
+ const steps = generateRefactoringSteps(vulnerability);
365
+ context.report({
366
+ node,
367
+ messageId: 'regexpReDoS',
368
+ data: {
369
+ pattern: pattern.substring(0, 30) + (pattern.length > 30 ? '...' : ''),
370
+ riskLevel,
371
+ vulnerability: vulnerability.vulnerability,
372
+ safeAlternative: vulnerability.safeAlternative,
373
+ steps,
374
+ effort: vulnerability.effort
375
+ }
376
+ });
377
+ }
378
+ }
379
+ };
380
+ return {
381
+ CallExpression: checkRegExpCall,
382
+ NewExpression: checkRegExpCall,
383
+ Literal: checkLiteralRegExp
384
+ };
385
+ },
386
+ });
387
+ //# sourceMappingURL=detect-non-literal-regexp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect-non-literal-regexp.js","sourceRoot":"","sources":["../../../../../../packages/eslint-plugin-secure-coding/src/rules/security/detect-non-literal-regexp.ts"],"names":[],"mappings":";;;AASA,4DAA0E;AAC1E,4DAAsD;AAuBtD,qCAAqC;AACrC,MAAM,eAAe,GAAG,CAAC,IAAmB,EAA4E,EAAE;IACxH,OAAO,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AACxF,CAAC,CAAC;AAeF,MAAM,eAAe,GAAoB;IACvC;QACE,OAAO,EAAE,oBAAoB;QAC7B,SAAS,EAAE,IAAI;QACf,aAAa,EAAE,OAAO;QACtB,eAAe,EAAE,8BAA8B;QAC/C,OAAO,EAAE;YACP,GAAG,EAAE,uBAAuB;YAC5B,IAAI,EAAE,oEAAoE;SAC3E;QACD,MAAM,EAAE,eAAe;QACvB,SAAS,EAAE,MAAM;KAClB;IACD;QACE,OAAO,EAAE,gBAAgB;QACzB,SAAS,EAAE,IAAI;QACf,aAAa,EAAE,OAAO;QACtB,eAAe,EAAE,8CAA8C;QAC/D,OAAO,EAAE;YACP,GAAG,EAAE,qBAAqB;YAC1B,IAAI,EAAE,+GAA+G;SACtH;QACD,MAAM,EAAE,eAAe;QACvB,SAAS,EAAE,MAAM;KAClB;IACD;QACE,OAAO,EAAE,kCAAkC;QAC3C,SAAS,EAAE,IAAI;QACf,aAAa,EAAE,OAAO;QACtB,eAAe,EAAE,6CAA6C;QAC9D,OAAO,EAAE;YACP,GAAG,EAAE,UAAU,EAAE,mBAAmB;YACpC,IAAI,EAAE,WAAW,EAAE,6CAA6C;SACjE;QACD,MAAM,EAAE,eAAe;QACvB,SAAS,EAAE,UAAU;KACtB;CACF,CAAC;AAEW,QAAA,sBAAsB,GAAG,IAAA,0BAAU,EAA0B;IACxE,IAAI,EAAE,2BAA2B;IACjC,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACJ,WAAW,EAAE,mHAAmH;SACjI;QACD,QAAQ,EAAE;YACR,mFAAmF;YACnF,WAAW,EAAE,IAAA,gCAAgB,EAAC;gBAC5B,IAAI,EAAE,4BAAY,CAAC,OAAO;gBAC1B,SAAS,EAAE,qBAAqB;gBAChC,GAAG,EAAE,SAAS;gBACd,WAAW,EAAE,8BAA8B;gBAC3C,QAAQ,EAAE,eAAe;gBACzB,GAAG,EAAE,qBAAqB;gBAC1B,iBAAiB,EAAE,sFAAsF;aAC1G,CAAC;YACF,cAAc,EAAE,IAAA,gCAAgB,EAAC;gBAC/B,IAAI,EAAE,4BAAY,CAAC,IAAI;gBACvB,SAAS,EAAE,kBAAkB;gBAC7B,WAAW,EAAE,kCAAkC;gBAC/C,QAAQ,EAAE,KAAK;gBACf,GAAG,EAAE,uDAAuD;gBAC5D,iBAAiB,EAAE,yFAAyF;aAC7G,CAAC;YACF,aAAa,EAAE,IAAA,gCAAgB,EAAC;gBAC9B,IAAI,EAAE,4BAAY,CAAC,IAAI;gBACvB,SAAS,EAAE,gBAAgB;gBAC3B,WAAW,EAAE,gCAAgC;gBAC7C,QAAQ,EAAE,KAAK;gBACf,GAAG,EAAE,oDAAoD;gBACzD,iBAAiB,EAAE,sFAAsF;aAC1G,CAAC;YACF,eAAe,EAAE,IAAA,gCAAgB,EAAC;gBAChC,IAAI,EAAE,4BAAY,CAAC,IAAI;gBACvB,SAAS,EAAE,kBAAkB;gBAC7B,WAAW,EAAE,+BAA+B;gBAC5C,QAAQ,EAAE,KAAK;gBACf,GAAG,EAAE,+DAA+D;gBACpE,iBAAiB,EAAE,wCAAwC;aAC5D,CAAC;YACF,UAAU,EAAE,IAAA,gCAAgB,EAAC;gBAC3B,IAAI,EAAE,4BAAY,CAAC,IAAI;gBACvB,SAAS,EAAE,aAAa;gBACxB,WAAW,EAAE,iCAAiC;gBAC9C,QAAQ,EAAE,KAAK;gBACf,GAAG,EAAE,0CAA0C;gBAC/C,iBAAiB,EAAE,sFAAsF;aAC1G,CAAC;YACF,eAAe,EAAE,IAAA,gCAAgB,EAAC;gBAChC,IAAI,EAAE,4BAAY,CAAC,IAAI;gBACvB,SAAS,EAAE,cAAc;gBACzB,WAAW,EAAE,iCAAiC;gBAC9C,QAAQ,EAAE,KAAK;gBACf,GAAG,EAAE,mDAAmD;gBACxD,iBAAiB,EAAE,4FAA4F;aAChH,CAAC;SACH;QACD,MAAM,EAAE;YACN;gBACE,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,aAAa,EAAE;wBACb,IAAI,EAAE,SAAS;wBACf,OAAO,EAAE,KAAK;wBACd,WAAW,EAAE,qCAAqC;qBACnD;oBACD,kBAAkB,EAAE;wBAClB,IAAI,EAAE,OAAO;wBACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wBACzB,OAAO,EAAE,EAAE;wBACX,WAAW,EAAE,8CAA8C;qBAC5D;oBACD,gBAAgB,EAAE;wBAChB,IAAI,EAAE,QAAQ;wBACd,OAAO,EAAE,GAAG;wBACZ,OAAO,EAAE,CAAC;wBACV,WAAW,EAAE,kDAAkD;qBAChE;iBACF;gBACD,oBAAoB,EAAE,KAAK;aAC5B;SACF;KACF;IACD,cAAc,EAAE;QACd;YACE,aAAa,EAAE,KAAK;YACpB,kBAAkB,EAAE,EAAE;YACtB,gBAAgB,EAAE,GAAG;SACtB;KACF;IACD,MAAM,CAAC,OAAsD;QAC3D,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACzC,MAAM,EACV,aAAa,GAAG,KAAK,EACf,gBAAgB,GAAG,GAAG,EAE3B,GAAY,OAAO,IAAI,EAAE,CAAC;QAEvB;;WAEG;QACH,MAAM,eAAe,GAAG,CAAC,IAAmB,EAAW,EAAE;YACvD,OAAO,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,CAAC;QACnE,CAAC,CAAC;QAEF;;WAEG;QACH,MAAM,gBAAgB,GAAG,CAAC,OAAe,EAAW,EAAE;YACpD,wBAAwB;YACxB,OAAO,6BAA6B,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,qBAAqB;gBACpE,sBAAsB,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,2BAA2B;gBACnE,sBAAsB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,0BAA0B;QACzE,CAAC,CAAC;QAEF;;WAEG;QACH,MAAM,cAAc,GAAG,CAAC,IAAsD,EAM5E,EAAE;YACF,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,UAAU,CAAC;YAE5D,6BAA6B;YAC7B,IAAI,WAAW,GAAG,QAAQ,CAAC;YAC3B,IAAI,IAAI,CAAC,IAAI,KAAK,eAAe,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBACvE,WAAW,GAAG,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YAC1C,CAAC;YAED,gCAAgC;YAChC,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YACzE,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACnE,MAAM,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;YACtE,MAAM,MAAM,GAAG,WAAW,IAAI,eAAe,CAAC,WAAW,CAAC,CAAC,CAAC;gBAC7C,MAAM,CAAE,WAAgC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;YAEvF,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;QAClE,CAAC,CAAC;QAEF;;WAEG;QACH,MAAM,mBAAmB,GAAG,CAAC,OAAe,EAAE,SAAkB,EAAwB,EAAE;YACxF,sDAAsD;YACtD,IAAI,SAAS,EAAE,CAAC;gBACd,KAAK,MAAM,IAAI,IAAI,eAAe,EAAE,CAAC;oBACnC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;wBAChD,OAAO,IAAI,CAAC;oBACd,CAAC;gBACH,CAAC;gBACD,sCAAsC;gBACtC,OAAO;oBACL,OAAO,EAAE,SAAS;oBAClB,SAAS,EAAE,IAAI;oBACf,aAAa,EAAE,OAAO;oBACtB,eAAe,EAAE,8BAA8B;oBAC/C,OAAO,EAAE;wBACP,GAAG,EAAE,OAAO;wBACZ,IAAI,EAAE,8DAA8D;qBACrE;oBACD,MAAM,EAAE,eAAe;oBACvB,SAAS,EAAE,MAAM;iBAClB,CAAC;YACJ,CAAC;YAED,4CAA4C;YAC5C,IAAI,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC9B,OAAO;oBACL,OAAO,EAAE,eAAe;oBACxB,SAAS,EAAE,IAAI;oBACf,aAAa,EAAE,OAAO;oBACtB,eAAe,EAAE,+CAA+C;oBAChE,OAAO,EAAE;wBACP,GAAG,EAAE,OAAO;wBACZ,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,qBAAqB;qBAC7D;oBACD,MAAM,EAAE,eAAe;oBACvB,SAAS,EAAE,MAAM;iBAClB,CAAC;YACJ,CAAC;YAED,OAAO,IAAI,CAAC;QACd,CAAC,CAAC;QAEF;;WAEG;QACH,MAAM,wBAAwB,GAAG,CAAC,aAA4B,EAAU,EAAE;YACxE,IAAI,aAAa,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;gBACxC,OAAO;oBACL,oDAAoD;oBACpD,+CAA+C;oBAC/C,oEAAoE;oBACpE,qCAAqC;oBACrC,2CAA2C;iBAC5C,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACf,CAAC;YAED,IAAI,aAAa,CAAC,OAAO,KAAK,eAAe,EAAE,CAAC;gBAC9C,OAAO;oBACL,gDAAgD;oBAChD,2DAA2D;oBAC3D,+CAA+C;oBAC/C,+CAA+C;oBAC/C,iDAAiD;iBAClD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACf,CAAC;YAED,QAAQ,aAAa,CAAC,aAAa,EAAE,CAAC;gBACpC,KAAK,OAAO;oBACV,OAAO;wBACL,mDAAmD;wBACnD,8CAA8C;wBAC9C,6CAA6C;wBAC7C,8CAA8C;wBAC9C,8CAA8C;qBAC/C,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAEf,KAAK,WAAW;oBACd,OAAO;wBACL,oDAAoD;wBACpD,wCAAwC;wBACxC,qDAAqD;wBACrD,uDAAuD;wBACvD,yCAAyC;qBAC1C,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAEf;oBACE,OAAO;wBACL,4CAA4C;wBAC5C,2CAA2C;wBAC3C,yCAAyC;wBACzC,uCAAuC;wBACvC,yCAAyC;qBAC1C,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjB,CAAC;QACH,CAAC,CAAC;QAEF;;WAEG;QACH,MAAM,kBAAkB,GAAG,CAAC,aAA4B,EAAE,OAAe,EAAU,EAAE;YACnF,IAAI,aAAa,CAAC,SAAS,KAAK,UAAU,IAAI,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC;gBACxE,OAAO,UAAU,CAAC;YACpB,CAAC;YAED,IAAI,aAAa,CAAC,SAAS,KAAK,MAAM,EAAE,CAAC;gBACvC,OAAO,MAAM,CAAC;YAChB,CAAC;YAED,OAAO,QAAQ,CAAC;QAClB,CAAC,CAAC;QAEF;;WAEG;QACH,MAAM,eAAe,GAAG,CAAC,IAAsD,EAAE,EAAE;YACjF,qCAAqC;YACrC,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,YAAY,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC;YACxF,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,KAAK,eAAe,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,YAAY,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC;YAExH,IAAI,CAAC,YAAY,IAAI,CAAC,WAAW,EAAE,CAAC;gBAClC,OAAO;YACT,CAAC;YAED,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;YAEzE,gEAAgE;YAChE,IAAI,aAAa,IAAI,WAAW,IAAI,eAAe,CAAC,WAAW,CAAC,IAAI,MAAM,IAAI,gBAAgB,EAAE,CAAC;gBAC/F,kDAAkD;gBAClD,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC;oBAC/B,OAAO;gBACT,CAAC;YACH,CAAC;YAED,MAAM,aAAa,GAAG,mBAAmB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;YAE9D,qEAAqE;YACrE,MAAM,sBAAsB,GAAG,aAAa,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;gBAC3D,OAAO,EAAE,SAAS;gBAClB,SAAS,EAAE,IAAI;gBACf,aAAa,EAAE,OAAgB;gBAC/B,eAAe,EAAE,4BAA4B;gBAC7C,OAAO,EAAE;oBACP,GAAG,EAAE,OAAO;oBACZ,IAAI,EAAE,kBAAkB;iBACzB;gBACD,MAAM,EAAE,eAAe;gBACvB,SAAS,EAAE,QAAiB;aAC7B,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAEV,IAAI,CAAC,sBAAsB,EAAE,CAAC;gBAC5B,OAAO;YACT,CAAC;YAED,MAAM,SAAS,GAAG,kBAAkB,CAAC,sBAAsB,EAAE,OAAO,CAAC,CAAC;YACtE,MAAM,KAAK,GAAG,wBAAwB,CAAC,sBAAsB,CAAC,CAAC;YAE/D,OAAO,CAAC,MAAM,CAAC;gBACb,IAAI;gBACJ,SAAS,EAAE,aAAa;gBACxB,IAAI,EAAE;oBACJ,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;oBACtE,SAAS;oBACT,aAAa,EAAE,sBAAsB,CAAC,aAAa;oBACnD,eAAe,EAAE,sBAAsB,CAAC,eAAe;oBACvD,KAAK;oBACL,MAAM,EAAE,sBAAsB,CAAC,MAAM;iBACtC;gBACD,OAAO,EAAE;oBACP;wBACE,SAAS,EAAE,gBAAgB;wBAC3B,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI;qBAChB;oBACD;wBACE,SAAS,EAAE,eAAe;wBAC1B,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI;qBAChB;oBACD;wBACE,SAAS,EAAE,iBAAiB;wBAC5B,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI;qBAChB;oBACD;wBACE,SAAS,EAAE,YAAY;wBACvB,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI;qBAChB;oBACD;wBACE,SAAS,EAAE,iBAAiB;wBAC5B,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI;qBAChB;iBACF;aACF,CAAC,CAAC;QACL,CAAC,CAAC;QAEF;;WAEG;QACH,MAAM,kBAAkB,GAAG,CAAC,IAAmB,EAAE,EAAE;YACjD,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC3B,OAAO;YACT,CAAC;YAED,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;YAEnC,2BAA2B;YAC3B,IAAI,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC9B,MAAM,aAAa,GAAG,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;gBAE1D,IAAI,aAAa,EAAE,CAAC;oBAClB,MAAM,SAAS,GAAG,kBAAkB,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;oBAC7D,MAAM,KAAK,GAAG,wBAAwB,CAAC,aAAa,CAAC,CAAC;oBAEtD,OAAO,CAAC,MAAM,CAAC;wBACb,IAAI;wBACJ,SAAS,EAAE,aAAa;wBACxB,IAAI,EAAE;4BACJ,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;4BACtE,SAAS;4BACT,aAAa,EAAE,aAAa,CAAC,aAAa;4BAC1C,eAAe,EAAE,aAAa,CAAC,eAAe;4BAC9C,KAAK;4BACL,MAAM,EAAE,aAAa,CAAC,MAAM;yBAC7B;qBACF,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC,CAAC;QAEF,OAAO;YACL,cAAc,EAAE,eAAe;YAC/B,aAAa,EAAE,eAAe;YAC9B,OAAO,EAAE,kBAAkB;SAC5B,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,11 @@
1
+ export interface Options {
2
+ /** Allow bracket notation with literal strings. Default: false (stricter) */
3
+ allowLiterals?: boolean;
4
+ /** Additional object methods to check for injection */
5
+ additionalMethods?: string[];
6
+ /** Properties to consider dangerous. Default: __proto__, prototype, constructor */
7
+ dangerousProperties?: string[];
8
+ /** Strategy for fixing object injection: 'validate', 'whitelist', 'freeze', or 'auto' */
9
+ strategy?: 'validate' | 'whitelist' | 'freeze' | 'auto';
10
+ }
11
+ export declare const detectObjectInjection: ESLintUtils.RuleModule<MessageIds, Options, unknown, ESLintUtils.RuleListener>;