couchloop-eq-mcp 1.0.4 → 1.1.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 (282) hide show
  1. package/README.md +24 -11
  2. package/dist/developer/analyzers/bloat-detector.d.ts +89 -0
  3. package/dist/developer/analyzers/bloat-detector.d.ts.map +1 -0
  4. package/dist/developer/analyzers/bloat-detector.js +483 -0
  5. package/dist/developer/analyzers/bloat-detector.js.map +1 -0
  6. package/dist/developer/backup/auto-backup.d.ts +96 -0
  7. package/dist/developer/backup/auto-backup.d.ts.map +1 -0
  8. package/dist/developer/backup/auto-backup.js +346 -0
  9. package/dist/developer/backup/auto-backup.js.map +1 -0
  10. package/dist/developer/blockers/package-blocker.d.ts +33 -0
  11. package/dist/developer/blockers/package-blocker.d.ts.map +1 -0
  12. package/dist/developer/blockers/package-blocker.js +224 -0
  13. package/dist/developer/blockers/package-blocker.js.map +1 -0
  14. package/dist/developer/evaluators/ai-error-preventer.d.ts +54 -0
  15. package/dist/developer/evaluators/ai-error-preventer.d.ts.map +1 -0
  16. package/dist/developer/evaluators/ai-error-preventer.js +270 -0
  17. package/dist/developer/evaluators/ai-error-preventer.js.map +1 -0
  18. package/dist/developer/evaluators/build-context-detector.d.ts +44 -0
  19. package/dist/developer/evaluators/build-context-detector.d.ts.map +1 -0
  20. package/dist/developer/evaluators/build-context-detector.js +258 -0
  21. package/dist/developer/evaluators/build-context-detector.js.map +1 -0
  22. package/dist/developer/evaluators/package-evaluator.d.ts +37 -0
  23. package/dist/developer/evaluators/package-evaluator.d.ts.map +1 -0
  24. package/dist/developer/evaluators/package-evaluator.js +278 -0
  25. package/dist/developer/evaluators/package-evaluator.js.map +1 -0
  26. package/dist/developer/guards/file-guardian.d.ts +79 -0
  27. package/dist/developer/guards/file-guardian.d.ts.map +1 -0
  28. package/dist/developer/guards/file-guardian.js +309 -0
  29. package/dist/developer/guards/file-guardian.js.map +1 -0
  30. package/dist/developer/managers/context-manager.d.ts +61 -0
  31. package/dist/developer/managers/context-manager.d.ts.map +1 -0
  32. package/dist/developer/managers/context-manager.js +302 -0
  33. package/dist/developer/managers/context-manager.js.map +1 -0
  34. package/dist/developer/metrics/complexity-calculator.d.ts +52 -0
  35. package/dist/developer/metrics/complexity-calculator.d.ts.map +1 -0
  36. package/dist/developer/metrics/complexity-calculator.js +259 -0
  37. package/dist/developer/metrics/complexity-calculator.js.map +1 -0
  38. package/dist/developer/reports/review-summary.d.ts +49 -0
  39. package/dist/developer/reports/review-summary.d.ts.map +1 -0
  40. package/dist/developer/reports/review-summary.js +249 -0
  41. package/dist/developer/reports/review-summary.js.map +1 -0
  42. package/dist/developer/scanners/review-assistant.d.ts +41 -0
  43. package/dist/developer/scanners/review-assistant.d.ts.map +1 -0
  44. package/dist/developer/scanners/review-assistant.js +374 -0
  45. package/dist/developer/scanners/review-assistant.js.map +1 -0
  46. package/dist/developer/scanners/secret-scanner.d.ts +66 -0
  47. package/dist/developer/scanners/secret-scanner.d.ts.map +1 -0
  48. package/dist/developer/scanners/secret-scanner.js +287 -0
  49. package/dist/developer/scanners/secret-scanner.js.map +1 -0
  50. package/dist/developer/scanners/sql-injection-detector.d.ts +54 -0
  51. package/dist/developer/scanners/sql-injection-detector.d.ts.map +1 -0
  52. package/dist/developer/scanners/sql-injection-detector.js +174 -0
  53. package/dist/developer/scanners/sql-injection-detector.js.map +1 -0
  54. package/dist/developer/scanners/xss-detector.d.ts +60 -0
  55. package/dist/developer/scanners/xss-detector.d.ts.map +1 -0
  56. package/dist/developer/scanners/xss-detector.js +229 -0
  57. package/dist/developer/scanners/xss-detector.js.map +1 -0
  58. package/dist/developer/types/ai-errors.d.ts +34 -0
  59. package/dist/developer/types/ai-errors.d.ts.map +1 -0
  60. package/dist/developer/types/ai-errors.js +271 -0
  61. package/dist/developer/types/ai-errors.js.map +1 -0
  62. package/dist/developer/types/package.d.ts +32 -0
  63. package/dist/developer/types/package.d.ts.map +1 -0
  64. package/dist/developer/types/package.js +5 -0
  65. package/dist/developer/types/package.js.map +1 -0
  66. package/dist/developer/updaters/dependency-updater.d.ts +102 -0
  67. package/dist/developer/updaters/dependency-updater.d.ts.map +1 -0
  68. package/dist/developer/updaters/dependency-updater.js +472 -0
  69. package/dist/developer/updaters/dependency-updater.js.map +1 -0
  70. package/dist/developer/validators/cargo.d.ts +14 -0
  71. package/dist/developer/validators/cargo.d.ts.map +1 -0
  72. package/dist/developer/validators/cargo.js +132 -0
  73. package/dist/developer/validators/cargo.js.map +1 -0
  74. package/dist/developer/validators/gem.d.ts +14 -0
  75. package/dist/developer/validators/gem.d.ts.map +1 -0
  76. package/dist/developer/validators/gem.js +85 -0
  77. package/dist/developer/validators/gem.js.map +1 -0
  78. package/dist/developer/validators/go.d.ts +14 -0
  79. package/dist/developer/validators/go.d.ts.map +1 -0
  80. package/dist/developer/validators/go.js +138 -0
  81. package/dist/developer/validators/go.js.map +1 -0
  82. package/dist/developer/validators/maven.d.ts +14 -0
  83. package/dist/developer/validators/maven.d.ts.map +1 -0
  84. package/dist/developer/validators/maven.js +99 -0
  85. package/dist/developer/validators/maven.js.map +1 -0
  86. package/dist/developer/validators/npm.d.ts +14 -0
  87. package/dist/developer/validators/npm.d.ts.map +1 -0
  88. package/dist/developer/validators/npm.js +96 -0
  89. package/dist/developer/validators/npm.js.map +1 -0
  90. package/dist/developer/validators/nuget.d.ts +15 -0
  91. package/dist/developer/validators/nuget.d.ts.map +1 -0
  92. package/dist/developer/validators/nuget.js +107 -0
  93. package/dist/developer/validators/nuget.js.map +1 -0
  94. package/dist/developer/validators/pypi.d.ts +14 -0
  95. package/dist/developer/validators/pypi.d.ts.map +1 -0
  96. package/dist/developer/validators/pypi.js +118 -0
  97. package/dist/developer/validators/pypi.js.map +1 -0
  98. package/dist/developer/validators/registry-manager.d.ts +37 -0
  99. package/dist/developer/validators/registry-manager.d.ts.map +1 -0
  100. package/dist/developer/validators/registry-manager.js +89 -0
  101. package/dist/developer/validators/registry-manager.js.map +1 -0
  102. package/dist/developer/validators/version-checker.d.ts +145 -0
  103. package/dist/developer/validators/version-checker.d.ts.map +1 -0
  104. package/dist/developer/validators/version-checker.js +529 -0
  105. package/dist/developer/validators/version-checker.js.map +1 -0
  106. package/dist/server/index.js.map +1 -1
  107. package/dist/server/middleware/auth.d.ts +7 -9
  108. package/dist/server/middleware/auth.d.ts.map +1 -1
  109. package/dist/server/middleware/auth.js.map +1 -1
  110. package/dist/tools/check-versions.d.ts +100 -0
  111. package/dist/tools/check-versions.d.ts.map +1 -0
  112. package/dist/tools/check-versions.js +328 -0
  113. package/dist/tools/check-versions.js.map +1 -0
  114. package/dist/tools/detect-code-smell.d.ts +9 -0
  115. package/dist/tools/detect-code-smell.d.ts.map +1 -0
  116. package/dist/tools/detect-code-smell.js +231 -0
  117. package/dist/tools/detect-code-smell.js.map +1 -0
  118. package/dist/tools/index.d.ts +471 -0
  119. package/dist/tools/index.d.ts.map +1 -1
  120. package/dist/tools/index.js +178 -0
  121. package/dist/tools/index.js.map +1 -1
  122. package/dist/tools/journey.js +1 -1
  123. package/dist/tools/journey.js.map +1 -1
  124. package/dist/tools/pre-review-code.d.ts +71 -0
  125. package/dist/tools/pre-review-code.d.ts.map +1 -0
  126. package/dist/tools/pre-review-code.js +159 -0
  127. package/dist/tools/pre-review-code.js.map +1 -0
  128. package/dist/tools/preserve-context.d.ts +27 -0
  129. package/dist/tools/preserve-context.d.ts.map +1 -0
  130. package/dist/tools/preserve-context.js +98 -0
  131. package/dist/tools/preserve-context.js.map +1 -0
  132. package/dist/tools/protect-files.d.ts +224 -0
  133. package/dist/tools/protect-files.d.ts.map +1 -0
  134. package/dist/tools/protect-files.js +286 -0
  135. package/dist/tools/protect-files.js.map +1 -0
  136. package/dist/tools/scan-security.d.ts +38 -0
  137. package/dist/tools/scan-security.d.ts.map +1 -0
  138. package/dist/tools/scan-security.js +237 -0
  139. package/dist/tools/scan-security.js.map +1 -0
  140. package/dist/tools/validate_packages.d.ts +8 -0
  141. package/dist/tools/validate_packages.d.ts.map +1 -0
  142. package/dist/tools/validate_packages.js +159 -0
  143. package/dist/tools/validate_packages.js.map +1 -0
  144. package/dist/types/auth.d.ts.map +1 -1
  145. package/dist/types/auth.js +1 -2
  146. package/dist/types/auth.js.map +1 -1
  147. package/dist/types/context.d.ts +46 -0
  148. package/dist/types/context.d.ts.map +1 -0
  149. package/dist/types/context.js +17 -0
  150. package/dist/types/context.js.map +1 -0
  151. package/dist/types/file-protection.d.ts +50 -0
  152. package/dist/types/file-protection.d.ts.map +1 -0
  153. package/dist/types/file-protection.js +9 -0
  154. package/dist/types/file-protection.js.map +1 -0
  155. package/dist/utils/errorHandler.d.ts.map +1 -1
  156. package/dist/utils/errorHandler.js +2 -1
  157. package/dist/utils/errorHandler.js.map +1 -1
  158. package/package.json +30 -4
  159. package/dist/db/migrate.d.ts +0 -4
  160. package/dist/db/migrate.d.ts.map +0 -1
  161. package/dist/db/migrate.js +0 -34
  162. package/dist/db/migrate.js.map +0 -1
  163. package/dist/db/migrations/schema.d.ts +0 -1074
  164. package/dist/db/migrations/schema.d.ts.map +0 -1
  165. package/dist/db/migrations/schema.js +0 -160
  166. package/dist/db/migrations/schema.js.map +0 -1
  167. package/dist/db/schema.d.ts +0 -1576
  168. package/dist/db/schema.d.ts.map +0 -1
  169. package/dist/db/schema.js +0 -204
  170. package/dist/db/schema.js.map +0 -1
  171. package/dist/db/seed.d.ts +0 -4
  172. package/dist/db/seed.d.ts.map +0 -1
  173. package/dist/db/seed.js +0 -57
  174. package/dist/db/seed.js.map +0 -1
  175. package/dist/db/seedOAuth.d.ts +0 -4
  176. package/dist/db/seedOAuth.d.ts.map +0 -1
  177. package/dist/db/seedOAuth.js +0 -76
  178. package/dist/db/seedOAuth.js.map +0 -1
  179. package/dist/governance/config.d.ts +0 -66
  180. package/dist/governance/config.d.ts.map +0 -1
  181. package/dist/governance/config.js +0 -238
  182. package/dist/governance/config.js.map +0 -1
  183. package/dist/governance/detectors/hallucination.d.ts +0 -61
  184. package/dist/governance/detectors/hallucination.d.ts.map +0 -1
  185. package/dist/governance/detectors/hallucination.js +0 -338
  186. package/dist/governance/detectors/hallucination.js.map +0 -1
  187. package/dist/governance/detectors/inconsistency.d.ts +0 -99
  188. package/dist/governance/detectors/inconsistency.d.ts.map +0 -1
  189. package/dist/governance/detectors/inconsistency.js +0 -548
  190. package/dist/governance/detectors/inconsistency.js.map +0 -1
  191. package/dist/governance/detectors/toneDrift.d.ts +0 -63
  192. package/dist/governance/detectors/toneDrift.d.ts.map +0 -1
  193. package/dist/governance/detectors/toneDrift.js +0 -421
  194. package/dist/governance/detectors/toneDrift.js.map +0 -1
  195. package/dist/governance/detectors/unsafeReasoning.d.ts +0 -54
  196. package/dist/governance/detectors/unsafeReasoning.d.ts.map +0 -1
  197. package/dist/governance/detectors/unsafeReasoning.js +0 -473
  198. package/dist/governance/detectors/unsafeReasoning.js.map +0 -1
  199. package/dist/governance/evaluationEngine.d.ts +0 -112
  200. package/dist/governance/evaluationEngine.d.ts.map +0 -1
  201. package/dist/governance/evaluationEngine.js +0 -265
  202. package/dist/governance/evaluationEngine.js.map +0 -1
  203. package/dist/governance/intervention.d.ts +0 -81
  204. package/dist/governance/intervention.d.ts.map +0 -1
  205. package/dist/governance/intervention.js +0 -405
  206. package/dist/governance/intervention.js.map +0 -1
  207. package/dist/server/oauth/anomalyDetection.d.ts +0 -146
  208. package/dist/server/oauth/anomalyDetection.d.ts.map +0 -1
  209. package/dist/server/oauth/anomalyDetection.js +0 -405
  210. package/dist/server/oauth/anomalyDetection.js.map +0 -1
  211. package/dist/server/oauth/authServer.d.ts +0 -61
  212. package/dist/server/oauth/authServer.d.ts.map +0 -1
  213. package/dist/server/oauth/authServer.js +0 -283
  214. package/dist/server/oauth/authServer.js.map +0 -1
  215. package/dist/server/oauth/dpop.d.ts +0 -135
  216. package/dist/server/oauth/dpop.d.ts.map +0 -1
  217. package/dist/server/oauth/dpop.js +0 -338
  218. package/dist/server/oauth/dpop.js.map +0 -1
  219. package/dist/server/oauth/gdpr/consent.d.ts +0 -173
  220. package/dist/server/oauth/gdpr/consent.d.ts.map +0 -1
  221. package/dist/server/oauth/gdpr/consent.js +0 -388
  222. package/dist/server/oauth/gdpr/consent.js.map +0 -1
  223. package/dist/server/oauth/gdpr/dataPortability.d.ts +0 -214
  224. package/dist/server/oauth/gdpr/dataPortability.d.ts.map +0 -1
  225. package/dist/server/oauth/gdpr/dataPortability.js +0 -486
  226. package/dist/server/oauth/gdpr/dataPortability.js.map +0 -1
  227. package/dist/server/oauth/gdpr/index.d.ts +0 -103
  228. package/dist/server/oauth/gdpr/index.d.ts.map +0 -1
  229. package/dist/server/oauth/gdpr/index.js +0 -273
  230. package/dist/server/oauth/gdpr/index.js.map +0 -1
  231. package/dist/server/oauth/gdpr/rightToErasure.d.ts +0 -184
  232. package/dist/server/oauth/gdpr/rightToErasure.d.ts.map +0 -1
  233. package/dist/server/oauth/gdpr/rightToErasure.js +0 -527
  234. package/dist/server/oauth/gdpr/rightToErasure.js.map +0 -1
  235. package/dist/server/oauth/monitoring/securityMonitor.d.ts +0 -218
  236. package/dist/server/oauth/monitoring/securityMonitor.d.ts.map +0 -1
  237. package/dist/server/oauth/monitoring/securityMonitor.js +0 -615
  238. package/dist/server/oauth/monitoring/securityMonitor.js.map +0 -1
  239. package/dist/server/oauth/pkce.d.ts +0 -61
  240. package/dist/server/oauth/pkce.d.ts.map +0 -1
  241. package/dist/server/oauth/pkce.js +0 -157
  242. package/dist/server/oauth/pkce.js.map +0 -1
  243. package/dist/server/oauth/providers/base.d.ts +0 -147
  244. package/dist/server/oauth/providers/base.d.ts.map +0 -1
  245. package/dist/server/oauth/providers/base.js +0 -312
  246. package/dist/server/oauth/providers/base.js.map +0 -1
  247. package/dist/server/oauth/providers/github.d.ts +0 -55
  248. package/dist/server/oauth/providers/github.d.ts.map +0 -1
  249. package/dist/server/oauth/providers/github.js +0 -225
  250. package/dist/server/oauth/providers/github.js.map +0 -1
  251. package/dist/server/oauth/providers/google.d.ts +0 -49
  252. package/dist/server/oauth/providers/google.d.ts.map +0 -1
  253. package/dist/server/oauth/providers/google.js +0 -153
  254. package/dist/server/oauth/providers/google.js.map +0 -1
  255. package/dist/server/oauth/providers/index.d.ts +0 -9
  256. package/dist/server/oauth/providers/index.d.ts.map +0 -1
  257. package/dist/server/oauth/providers/index.js +0 -24
  258. package/dist/server/oauth/providers/index.js.map +0 -1
  259. package/dist/server/oauth/refreshTokenRotation.d.ts +0 -114
  260. package/dist/server/oauth/refreshTokenRotation.d.ts.map +0 -1
  261. package/dist/server/oauth/refreshTokenRotation.js +0 -344
  262. package/dist/server/oauth/refreshTokenRotation.js.map +0 -1
  263. package/dist/server/oauth/security.d.ts +0 -101
  264. package/dist/server/oauth/security.d.ts.map +0 -1
  265. package/dist/server/oauth/security.js +0 -268
  266. package/dist/server/oauth/security.js.map +0 -1
  267. package/dist/server/oauth/tokenEncryption.d.ts +0 -80
  268. package/dist/server/oauth/tokenEncryption.d.ts.map +0 -1
  269. package/dist/server/oauth/tokenEncryption.js +0 -218
  270. package/dist/server/oauth/tokenEncryption.js.map +0 -1
  271. package/dist/tools/sendMessage-complex-backup.d.ts +0 -6
  272. package/dist/tools/sendMessage-complex-backup.d.ts.map +0 -1
  273. package/dist/tools/sendMessage-complex-backup.js +0 -545
  274. package/dist/tools/sendMessage-complex-backup.js.map +0 -1
  275. package/dist/tools/sendMessage-revised.d.ts +0 -11
  276. package/dist/tools/sendMessage-revised.d.ts.map +0 -1
  277. package/dist/tools/sendMessage-revised.js +0 -429
  278. package/dist/tools/sendMessage-revised.js.map +0 -1
  279. package/dist/tools/sendMessage-truly-simple.d.ts +0 -8
  280. package/dist/tools/sendMessage-truly-simple.d.ts.map +0 -1
  281. package/dist/tools/sendMessage-truly-simple.js +0 -299
  282. package/dist/tools/sendMessage-truly-simple.js.map +0 -1
@@ -0,0 +1,287 @@
1
+ /**
2
+ * Secret Scanner
3
+ * Detects hardcoded secrets in code including:
4
+ * - API keys (AWS, OpenAI, Stripe, etc.)
5
+ * - Passwords
6
+ * - Private keys
7
+ * - Connection strings with credentials
8
+ * - Tokens and tokens
9
+ */
10
+ export class SecretScanner {
11
+ vulnerabilities = [];
12
+ // Regex patterns for detecting different types of secrets
13
+ patterns = {
14
+ // AWS
15
+ awsAccessKey: /(?:aws_access_key_id|AKIA)[A-Z0-9]{16,}/gi,
16
+ awsSecretKey: /(?:aws_secret_access_key|aws_key)['\s=]*[A-Za-z0-9/+=]{40,}/gi,
17
+ // API Keys
18
+ openaiKey: /sk-[A-Za-z0-9\-_]{20,}/g,
19
+ stripeKey: /(?:sk_live|pk_live)_[A-Za-z0-9]{20,}/gi,
20
+ googleApiKey: /AIza[0-9A-Za-z\-_]{35}/g,
21
+ githubToken: /ghp_[A-Za-z0-9_]{36,255}/g,
22
+ digitalOceanToken: /dop_v1_[A-Za-z0-9_]{40,}/g,
23
+ // Connection Strings
24
+ mongodbUri: /mongodb\+?srv?:\/\/.+?:.+?@/gi,
25
+ postgresUri: /postgres(ql)?:\/\/.+?:.+?@/gi,
26
+ mysqlUri: /mysql:\/\/.+?:.+?@/gi,
27
+ // Private Keys
28
+ rsaPrivateKey: /-----BEGIN\s+(?:RSA\s+)?PRIVATE\s+KEY-----/gi,
29
+ opensshPrivateKey: /-----BEGIN\s+OPENSSH\s+PRIVATE\s+KEY-----/gi,
30
+ pgpPrivateKey: /-----BEGIN\s+PGP\s+PRIVATE\s+KEY-----/gi,
31
+ // JWT
32
+ jwtToken: /eyJ[A-Za-z0-9_\-]+\.eyJ[A-Za-z0-9_\-]+\.[A-Za-z0-9_\-]+/g,
33
+ // Basic Passwords
34
+ passwordAssignment: /(?:password|passwd|pwd|secret)\s*[:=]\s*['\"`]([^'\"`;]+)['\"`]/gi,
35
+ hardcodedAdmin: /(?:password|passwd)\s*=\s*['\"](?:admin|Admin123|password|123456|password123)['\"]|\b(?:admin|root|sa|user)\s*=\s*['\"](?:admin|password|123456)['\"]|\b(?:password|secret)\s*=\s*['\"][^'\"]*(?:test|temp|demo|pass|secret)[^'\"]*['\"]/gi,
36
+ };
37
+ /**
38
+ * Scan code for hardcoded secrets
39
+ */
40
+ scan(code) {
41
+ this.vulnerabilities = [];
42
+ const lines = code.split('\n');
43
+ lines.forEach((line, idx) => {
44
+ const lineNum = idx + 1;
45
+ // Skip common safe patterns
46
+ if (this.isSafeIgnore(line))
47
+ return;
48
+ this.checkAwsKeys(line, lineNum);
49
+ this.checkApiKeys(line, lineNum);
50
+ this.checkConnectionStrings(line, lineNum);
51
+ this.checkPrivateKeys(line, lineNum);
52
+ this.checkPasswords(line, lineNum);
53
+ this.checkJwtTokens(line, lineNum);
54
+ });
55
+ return this.vulnerabilities;
56
+ }
57
+ /**
58
+ * Check if line should be ignored (comments, examples, etc.)
59
+ */
60
+ isSafeIgnore(line) {
61
+ const trimmed = line.trim();
62
+ // Skip comments
63
+ if (trimmed.startsWith('//') || trimmed.startsWith('#') || trimmed.startsWith('*')) {
64
+ return true;
65
+ }
66
+ // Skip test/example files with common patterns
67
+ if (line.includes('example') || line.includes('test') || line.includes('mock') || line.includes('fixture')) {
68
+ // Unless they're clearly real assignments
69
+ if (!line.includes('=') && !line.includes(':')) {
70
+ return true;
71
+ }
72
+ }
73
+ // Skip environment variable examples with placeholder values
74
+ if ((line.includes('process.env') || line.includes('process.getenv') || line.includes('os.getenv')) &&
75
+ (line.includes('YOUR_') || line.includes('your_') || line.includes('YOUR-') || line.includes('xxxx'))) {
76
+ return true;
77
+ }
78
+ return false;
79
+ }
80
+ /**
81
+ * Check for AWS keys
82
+ */
83
+ checkAwsKeys(line, lineNum) {
84
+ // AWS Access Key
85
+ const accessMatches = Array.from(line.matchAll(this.patterns.awsAccessKey));
86
+ for (const match of accessMatches) {
87
+ const code = match[0];
88
+ if (this.isCommentOrString(line, line.indexOf(code)))
89
+ continue;
90
+ const column = line.indexOf(code) + 1;
91
+ this.vulnerabilities.push({
92
+ type: 'HARDCODED_API_KEY',
93
+ severity: 'CRITICAL',
94
+ line: lineNum,
95
+ column: column,
96
+ code: code,
97
+ secretType: 'AWS Access Key ID',
98
+ secretPreview: code.substring(0, 8) + '...' + code.substring(code.length - 4),
99
+ issue: `Hardcoded AWS Access Key ID found: ${this.redact(code)}. This grants access to AWS resources.`,
100
+ cwe: 'CWE-798: Use of Hard-Coded Credentials',
101
+ fix: `Use AWS IAM roles or credentials from environment:\n import { AWS_SDK } from 'aws-sdk';\n // Let AWS SDK load from env: AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY\n // Or use IAM role in Lambda/EC2\n const credentials = new AWS_SDK.Credentials(process.env.AWS_ACCESS_KEY_ID, process.env.AWS_SECRET_ACCESS_KEY);\n\nOr use AWS CLI config file:\n ~/.aws/credentials or ~/.aws/config`
102
+ });
103
+ }
104
+ // AWS Secret Key
105
+ const secretMatches = Array.from(line.matchAll(this.patterns.awsSecretKey));
106
+ for (const match of secretMatches) {
107
+ const code = match[0];
108
+ if (this.isCommentOrString(line, line.indexOf(code)))
109
+ continue;
110
+ const column = line.indexOf(code) + 1;
111
+ this.vulnerabilities.push({
112
+ type: 'HARDCODED_API_KEY',
113
+ severity: 'CRITICAL',
114
+ line: lineNum,
115
+ column: column,
116
+ code: code,
117
+ secretType: 'AWS Secret Access Key',
118
+ secretPreview: code.substring(0, 8) + '...' + code.substring(code.length - 4),
119
+ issue: `Hardcoded AWS Secret Access Key found: ${this.redact(code)}. This grants full access to AWS resources.`,
120
+ cwe: 'CWE-798: Use of Hard-Coded Credentials',
121
+ fix: `Use environment variables:\n const awsSecret = process.env.AWS_SECRET_ACCESS_KEY;\n if (!awsSecret) throw new Error('Missing AWS_SECRET_ACCESS_KEY');\n\nStore in .env (add .env to .gitignore):\n AWS_ACCESS_KEY_ID=...\n AWS_SECRET_ACCESS_KEY=...\n\nOr use AWS IAM roles (recommended for production).`
122
+ });
123
+ }
124
+ }
125
+ /**
126
+ * Check for API keys (OpenAI, Stripe, GitHub, etc.)
127
+ */
128
+ checkApiKeys(line, lineNum) {
129
+ const keyPatterns = [
130
+ { pattern: this.patterns.openaiKey, type: 'OpenAI API Key', name: 'OpenAI' },
131
+ { pattern: this.patterns.stripeKey, type: 'Stripe API Key', name: 'Stripe' },
132
+ { pattern: this.patterns.googleApiKey, type: 'Google API Key', name: 'Google' },
133
+ { pattern: this.patterns.githubToken, type: 'GitHub Personal Access Token', name: 'GitHub' },
134
+ { pattern: this.patterns.digitalOceanToken, type: 'DigitalOcean Token', name: 'DigitalOcean' },
135
+ ];
136
+ for (const { pattern, type, name } of keyPatterns) {
137
+ const matches = Array.from(line.matchAll(pattern));
138
+ for (const match of matches) {
139
+ const code = match[0];
140
+ if (this.isCommentOrString(line, line.indexOf(code)))
141
+ continue;
142
+ const column = line.indexOf(code) + 1;
143
+ this.vulnerabilities.push({
144
+ type: 'HARDCODED_API_KEY',
145
+ severity: 'CRITICAL',
146
+ line: lineNum,
147
+ column: column,
148
+ code: code,
149
+ secretType: type,
150
+ secretPreview: code.substring(0, 8) + '...' + code.substring(code.length - 4),
151
+ issue: `Hardcoded ${type} found: ${this.redact(code)}. This allows unauthorized API access.`,
152
+ cwe: 'CWE-798: Use of Hard-Coded Credentials',
153
+ fix: `Use environment variables:\n const apiKey = process.env.${name.toUpperCase()}_API_KEY;\n if (!apiKey) throw new Error('Missing ${name.toUpperCase()}_API_KEY');\n const client = new ${name}Client({ apiKey });\n\nStore in .env file (add to .gitignore):\n ${name.toUpperCase()}_API_KEY=sk-...\n\nFor deployment, use secrets management:\n - GitHub Secrets (for CI/CD)\n - AWS Secrets Manager\n - Vercel Environment Variables\n - HashiCorp Vault`
154
+ });
155
+ }
156
+ }
157
+ }
158
+ /**
159
+ * Check for connection strings with embedded credentials
160
+ */
161
+ checkConnectionStrings(line, lineNum) {
162
+ const connPatterns = [
163
+ { pattern: this.patterns.mongodbUri, type: 'MongoDB Connection String', name: 'MongoDB' },
164
+ { pattern: this.patterns.postgresUri, type: 'PostgreSQL Connection String', name: 'PostgreSQL' },
165
+ { pattern: this.patterns.mysqlUri, type: 'MySQL Connection String', name: 'MySQL' },
166
+ ];
167
+ for (const { pattern, type, name } of connPatterns) {
168
+ const matches = Array.from(line.matchAll(pattern));
169
+ for (const match of matches) {
170
+ const code = match[0];
171
+ if (this.isCommentOrString(line, line.indexOf(code)))
172
+ continue;
173
+ const column = line.indexOf(code) + 1;
174
+ this.vulnerabilities.push({
175
+ type: 'CONNECTION_STRING',
176
+ severity: 'CRITICAL',
177
+ line: lineNum,
178
+ column: column,
179
+ code: code,
180
+ secretType: type,
181
+ secretPreview: this.redact(code),
182
+ issue: `Hardcoded ${type} with credentials: ${this.redact(code)}. Database credentials should never be in code.`,
183
+ cwe: 'CWE-798: Use of Hard-Coded Credentials',
184
+ fix: `Use environment variables:\n const dbUrl = process.env.DATABASE_URL;\n if (!dbUrl) throw new Error('Missing DATABASE_URL');\n const client = await new ${name}Client({ url: dbUrl });\n\nFormat for .env:\n DATABASE_URL=${name.toLowerCase()}://user:password@host:port/database\n\nFor production, use:\n - Vercel Environment Variables\n - AWS RDS proxy with IAM auth\n - Cloud provider secret managers`
185
+ });
186
+ }
187
+ }
188
+ }
189
+ /**
190
+ * Check for private keys in code
191
+ */
192
+ checkPrivateKeys(line, lineNum) {
193
+ if (line.includes('BEGIN PRIVATE KEY') || line.includes('BEGIN RSA PRIVATE KEY') ||
194
+ line.includes('BEGIN OPENSSH PRIVATE KEY') || line.includes('BEGIN PGP PRIVATE KEY')) {
195
+ const column = line.indexOf('BEGIN') + 1;
196
+ this.vulnerabilities.push({
197
+ type: 'PRIVATE_KEY',
198
+ severity: 'CRITICAL',
199
+ line: lineNum,
200
+ column: column,
201
+ code: line.substring(0, Math.min(line.length, 80)),
202
+ secretType: 'Private Key',
203
+ issue: `Private key found in code: ${line.substring(0, 40)}... This is a critical security issue.`,
204
+ cwe: 'CWE-798: Use of Hard-Coded Credentials',
205
+ fix: `Never commit private keys. Instead:\n 1. Generate key pair\n 2. Store private key in secure location (e.g., ~/.ssh/id_rsa with 600 permissions)\n 3. Store public key or certificate in code\n 4. Load private key at runtime from secure location\n 5. Use key management services:\n - AWS Secrets Manager\n - HashiCorp Vault\n - Azure Key Vault\n - GitHub encrypted secrets\n 6. Use SSH agent for authentication\n\nIf accidentally committed:\n 1. Revoke the key immediately\n 2. git filter-branch or BFG to remove from history\n 3. Generate new key`
206
+ });
207
+ }
208
+ }
209
+ /**
210
+ * Check for hardcoded passwords
211
+ */
212
+ checkPasswords(line, lineNum) {
213
+ // Skip if it's a password field definition or validation
214
+ if (line.includes('password') && !line.includes('=') && !line.includes(':')) {
215
+ return;
216
+ }
217
+ const matches = Array.from(line.matchAll(this.patterns.passwordAssignment));
218
+ for (const match of matches) {
219
+ const code = match[0];
220
+ if (this.isCommentOrString(line, line.indexOf(code)))
221
+ continue;
222
+ const column = line.indexOf(code) + 1;
223
+ const passwordValue = match[1];
224
+ this.vulnerabilities.push({
225
+ type: 'HARDCODED_PASSWORD',
226
+ severity: 'CRITICAL',
227
+ line: lineNum,
228
+ column: column,
229
+ code: code,
230
+ secretType: 'Hardcoded Password',
231
+ secretPreview: this.redact(passwordValue || ''),
232
+ issue: `Hardcoded password found: ${code}. Passwords should never be in source code.`,
233
+ cwe: 'CWE-798: Use of Hard-Coded Credentials',
234
+ fix: `Use environment variables:\n const password = process.env.DB_PASSWORD;\n if (!password) throw new Error('Missing DB_PASSWORD');\n await db.connect({ username: 'user', password });\n\nFor authentication, use bcrypt for hashing:\n import bcrypt from 'bcrypt';\n const hashedPassword = await bcrypt.hash(password, 10);\n await db.saveUser({ username, passwordHash: hashedPassword });\n\nFor verification:\n const isValid = await bcrypt.compare(inputPassword, storedHash);`
235
+ });
236
+ }
237
+ }
238
+ /**
239
+ * Check for JWT tokens
240
+ */
241
+ checkJwtTokens(line, lineNum) {
242
+ // Skip if it's in a comment explaining JWT format
243
+ if (line.includes('//') && line.indexOf('//') < line.indexOf('eyJ')) {
244
+ return;
245
+ }
246
+ const matches = Array.from(line.matchAll(this.patterns.jwtToken));
247
+ for (const match of matches) {
248
+ const code = match[0];
249
+ if (this.isCommentOrString(line, line.indexOf(code)))
250
+ continue;
251
+ const column = line.indexOf(code) + 1;
252
+ this.vulnerabilities.push({
253
+ type: 'JWT_TOKEN',
254
+ severity: 'HIGH',
255
+ line: lineNum,
256
+ column: column,
257
+ code: code,
258
+ secretType: 'JWT Token',
259
+ secretPreview: code.substring(0, 20) + '...',
260
+ issue: `JWT token found in code: ${code.substring(0, 30)}... Token may contain sensitive information.`,
261
+ cwe: 'CWE-798: Use of Hard-Coded Credentials',
262
+ fix: `Never hardcode JWT tokens. Instead:\n 1. Generate tokens at runtime:\n import jwt from 'jsonwebtoken';\n const token = jwt.sign({ userId: user.id }, process.env.JWT_SECRET, { expiresIn: '1h' });\n 2. Store JWT_SECRET in environment variable (never in code):\n const secret = process.env.JWT_SECRET;\n 3. Return token to client (not in code)\n 4. Client stores token (usually in secure httpOnly cookie)\n 5. Token expires and requires refresh`
263
+ });
264
+ }
265
+ }
266
+ /**
267
+ * Redact secret for safe display
268
+ */
269
+ redact(secret) {
270
+ if (secret.length <= 8)
271
+ return '***';
272
+ return secret.substring(0, 4) + '...' + secret.substring(secret.length - 4);
273
+ }
274
+ /**
275
+ * Check if position is inside a comment
276
+ */
277
+ isCommentOrString(line, position) {
278
+ const beforePos = line.substring(0, position);
279
+ // Simple heuristic: if there's a // before this position and no quotes after //, it's a comment
280
+ const commentIdx = beforePos.lastIndexOf('//');
281
+ if (commentIdx !== -1) {
282
+ return true;
283
+ }
284
+ return false;
285
+ }
286
+ }
287
+ //# sourceMappingURL=secret-scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secret-scanner.js","sourceRoot":"","sources":["../../../src/developer/scanners/secret-scanner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * SQL Injection Detector
3
+ * Scans code for SQL injection vulnerabilities including:
4
+ * - String concatenation in queries
5
+ * - Unparameterized queries
6
+ * - Dynamic table/column names
7
+ * - Direct user input in SQL
8
+ */
9
+ export interface SqlVulnerability {
10
+ type: 'SQL_INJECTION' | 'UNPARAMETERIZED_QUERY' | 'DYNAMIC_TABLE_NAME' | 'DYNAMIC_COLUMN_NAME';
11
+ severity: 'CRITICAL' | 'HIGH' | 'MEDIUM';
12
+ line: number;
13
+ column: number;
14
+ code: string;
15
+ issue: string;
16
+ cwe: string;
17
+ fix: string;
18
+ }
19
+ export declare class SqlInjectionDetector {
20
+ private vulnerabilities;
21
+ /**
22
+ * Scan code for SQL injection vulnerabilities
23
+ */
24
+ scan(code: string): SqlVulnerability[];
25
+ /**
26
+ * Detect template literals with variables in SQL strings
27
+ * Pattern: `SELECT * FROM users WHERE id = ${variable}`
28
+ */
29
+ private checkStringConcatenation;
30
+ /**
31
+ * Detect unparameterized queries with + or concat()
32
+ * Pattern: "SELECT * FROM users WHERE id = " + id
33
+ */
34
+ private checkUnparameterizedQueries;
35
+ /**
36
+ * Detect dynamic table names
37
+ * Pattern: `SELECT * FROM ${tableName}`
38
+ */
39
+ private checkDynamicTableNames;
40
+ /**
41
+ * Detect dynamic column names
42
+ * Pattern: `SELECT ${columnName} FROM users`
43
+ */
44
+ private checkDynamicColumnNames;
45
+ /**
46
+ * Check if code looks like SQL
47
+ */
48
+ private isSqlLike;
49
+ /**
50
+ * Check if position is inside a comment or string
51
+ */
52
+ private isCommentOrString;
53
+ }
54
+ //# sourceMappingURL=sql-injection-detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql-injection-detector.d.ts","sourceRoot":"","sources":["../../../src/developer/scanners/sql-injection-detector.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,eAAe,GAAG,uBAAuB,GAAG,oBAAoB,GAAG,qBAAqB,CAAC;IAC/F,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,CAAC;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;CACb;AAED,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,eAAe,CAA0B;IAEjD;;OAEG;IACH,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,EAAE;IAetC;;;OAGG;IACH,OAAO,CAAC,wBAAwB;IA6BhC;;;OAGG;IACH,OAAO,CAAC,2BAA2B;IAoCnC;;;OAGG;IACH,OAAO,CAAC,sBAAsB;IA8B9B;;;OAGG;IACH,OAAO,CAAC,uBAAuB;IAqC/B;;OAEG;IACH,OAAO,CAAC,SAAS;IAMjB;;OAEG;IACH,OAAO,CAAC,iBAAiB;CAK1B"}
@@ -0,0 +1,174 @@
1
+ /**
2
+ * SQL Injection Detector
3
+ * Scans code for SQL injection vulnerabilities including:
4
+ * - String concatenation in queries
5
+ * - Unparameterized queries
6
+ * - Dynamic table/column names
7
+ * - Direct user input in SQL
8
+ */
9
+ export class SqlInjectionDetector {
10
+ vulnerabilities = [];
11
+ /**
12
+ * Scan code for SQL injection vulnerabilities
13
+ */
14
+ scan(code) {
15
+ this.vulnerabilities = [];
16
+ const lines = code.split('\n');
17
+ lines.forEach((line, idx) => {
18
+ const lineNum = idx + 1;
19
+ this.checkStringConcatenation(line, lineNum);
20
+ this.checkUnparameterizedQueries(line, lineNum);
21
+ this.checkDynamicTableNames(line, lineNum);
22
+ this.checkDynamicColumnNames(line, lineNum);
23
+ });
24
+ return this.vulnerabilities;
25
+ }
26
+ /**
27
+ * Detect template literals with variables in SQL strings
28
+ * Pattern: `SELECT * FROM users WHERE id = ${variable}`
29
+ */
30
+ checkStringConcatenation(line, lineNum) {
31
+ // Template literal with SQL - check for variable interpolation
32
+ const templatePattern = /`[^`]*\$\{[^}]+\}[^`]*`/g;
33
+ const matches = Array.from(line.matchAll(templatePattern));
34
+ for (const match of matches) {
35
+ const code = match[0];
36
+ // Check if it looks like SQL
37
+ if (this.isSqlLike(code)) {
38
+ const column = line.indexOf(code) + 1;
39
+ // Extract the variable name
40
+ const varMatch = code.match(/\$\{([^}]+)\}/);
41
+ const varName = varMatch ? varMatch[1] : 'variable';
42
+ this.vulnerabilities.push({
43
+ type: 'SQL_INJECTION',
44
+ severity: 'CRITICAL',
45
+ line: lineNum,
46
+ column: column,
47
+ code: code,
48
+ issue: `String interpolation in SQL query: ${code}. User input (${varName}) directly concatenated into SQL.`,
49
+ cwe: 'CWE-89: Improper Neutralization of Special Elements used in an SQL Command',
50
+ fix: `Use parameterized queries instead:\n db.query('SELECT * FROM users WHERE id = ?', [${varName}])\n Or with named parameters:\n db.query('SELECT * FROM users WHERE id = $1', [${varName}])`
51
+ });
52
+ }
53
+ }
54
+ }
55
+ /**
56
+ * Detect unparameterized queries with + or concat()
57
+ * Pattern: "SELECT * FROM users WHERE id = " + id
58
+ */
59
+ checkUnparameterizedQueries(line, lineNum) {
60
+ // String concatenation patterns
61
+ const concatenationPatterns = [
62
+ // Double quotes with +
63
+ /"[^"]*"\s*\+\s*[^;]+/g,
64
+ // Single quotes with +
65
+ /'[^']*'\s*\+\s*[^;]+/g,
66
+ // concat() function
67
+ /concat\s*\([^)]*\)/gi,
68
+ // String.concat()
69
+ /\.concat\s*\([^)]*\)/g,
70
+ ];
71
+ for (const pattern of concatenationPatterns) {
72
+ const matches = Array.from(line.matchAll(pattern));
73
+ for (const match of matches) {
74
+ const code = match[0];
75
+ if (this.isSqlLike(code) && !this.isCommentOrString(line, line.indexOf(code))) {
76
+ const column = line.indexOf(code) + 1;
77
+ this.vulnerabilities.push({
78
+ type: 'UNPARAMETERIZED_QUERY',
79
+ severity: 'CRITICAL',
80
+ line: lineNum,
81
+ column: column,
82
+ code: code,
83
+ issue: `Unparameterized SQL query with string concatenation: ${code}. Values should be passed as parameters, not concatenated.`,
84
+ cwe: 'CWE-89: Improper Neutralization of Special Elements used in an SQL Command',
85
+ fix: `Use parameterized query:\n db.query('SELECT * FROM users WHERE id = ? AND name = ?', [id, name])\n Instead of:\n db.query("SELECT * FROM users WHERE id = " + id + " AND name = " + name)`
86
+ });
87
+ }
88
+ }
89
+ }
90
+ }
91
+ /**
92
+ * Detect dynamic table names
93
+ * Pattern: `SELECT * FROM ${tableName}`
94
+ */
95
+ checkDynamicTableNames(line, lineNum) {
96
+ const patterns = [
97
+ /FROM\s+`?[^;]*\$\{[^}]+\}[^;]*`?/gi,
98
+ /FROM\s+\(?\s*[^;]*\$\{[^}]+\}[^;]*\)?/gi,
99
+ /FROM\s+\(\s*?["']?[^)]*\$\{[^}]+\}[^)]*["']?\s*\)/gi,
100
+ ];
101
+ for (const pattern of patterns) {
102
+ const matches = Array.from(line.matchAll(pattern));
103
+ for (const match of matches) {
104
+ const code = match[0];
105
+ const column = line.indexOf(code) + 1;
106
+ const varMatch = code.match(/\$\{([^}]+)\}/);
107
+ const varName = varMatch ? varMatch[1] : 'variable';
108
+ this.vulnerabilities.push({
109
+ type: 'DYNAMIC_TABLE_NAME',
110
+ severity: 'HIGH',
111
+ line: lineNum,
112
+ column: column,
113
+ code: code,
114
+ issue: `Dynamic table name in SQL: ${code}. Table name (${varName}) comes from user input, allowing table injection attacks.`,
115
+ cwe: 'CWE-89: Improper Neutralization of Special Elements used in an SQL Command',
116
+ fix: `Use identifier escaping or whitelist allowed tables:\n const allowedTables = ['users', 'orders', 'products'];\n if (!allowedTables.includes(tableName)) throw new Error('Invalid table');\n const query = \`SELECT * FROM \\\"\${tableName}\\\"\`; // Quoted identifier\n Or use an ORM that handles this safely.`
117
+ });
118
+ }
119
+ }
120
+ }
121
+ /**
122
+ * Detect dynamic column names
123
+ * Pattern: `SELECT ${columnName} FROM users`
124
+ */
125
+ checkDynamicColumnNames(line, lineNum) {
126
+ const patterns = [
127
+ /SELECT\s+[^;]*\$\{[^}]+\}[^;]*/gi,
128
+ /ORDER\s+BY\s+[^;]*\$\{[^}]+\}[^;]*/gi,
129
+ /WHERE\s+[^;]*\$\{[^}]+\}[^;]*/gi,
130
+ ];
131
+ for (const pattern of patterns) {
132
+ const matches = Array.from(line.matchAll(pattern));
133
+ for (const match of matches) {
134
+ const code = match[0];
135
+ // Skip if it's in VALUES clause (less critical)
136
+ if (code.includes('VALUES'))
137
+ continue;
138
+ // Skip if it looks like a parameter placeholder
139
+ if (code.includes('?') || code.includes('$1'))
140
+ continue;
141
+ const column = line.indexOf(code) + 1;
142
+ const varMatch = code.match(/\$\{([^}]+)\}/);
143
+ const varName = varMatch ? varMatch[1] : 'variable';
144
+ this.vulnerabilities.push({
145
+ type: 'DYNAMIC_COLUMN_NAME',
146
+ severity: 'MEDIUM',
147
+ line: lineNum,
148
+ column: column,
149
+ code: code,
150
+ issue: `Dynamic column name in SQL: ${code}. Column name (${varName}) from user input could allow column-based injection attacks.`,
151
+ cwe: 'CWE-89: Improper Neutralization of Special Elements used in an SQL Command',
152
+ fix: `Use identifier escaping or whitelist allowed columns:\n const allowedColumns = ['id', 'name', 'email'];\n if (!allowedColumns.includes(columnName)) throw new Error('Invalid column');\n const query = \`SELECT \\\"\${columnName}\\\", * FROM users\`; // Quoted identifier\n Or use an ORM's dynamic select methods.`
153
+ });
154
+ }
155
+ }
156
+ }
157
+ /**
158
+ * Check if code looks like SQL
159
+ */
160
+ isSqlLike(code) {
161
+ const sqlKeywords = ['SELECT', 'INSERT', 'UPDATE', 'DELETE', 'FROM', 'WHERE', 'JOIN', 'ORDER', 'GROUP', 'UNION'];
162
+ const upperCode = code.toUpperCase();
163
+ return sqlKeywords.some(keyword => upperCode.includes(keyword));
164
+ }
165
+ /**
166
+ * Check if position is inside a comment or string
167
+ */
168
+ isCommentOrString(line, position) {
169
+ // Simple check - look for comment markers before position
170
+ const beforePos = line.substring(0, position);
171
+ return beforePos.includes('//') || beforePos.includes('/*');
172
+ }
173
+ }
174
+ //# sourceMappingURL=sql-injection-detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql-injection-detector.js","sourceRoot":"","sources":["../../../src/developer/scanners/sql-injection-detector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * XSS (Cross-Site Scripting) Detector
3
+ * Scans code for XSS vulnerabilities including:
4
+ * - innerHTML usage with untrusted data
5
+ * - Unescaped user input in DOM
6
+ * - eval() and similar dangerous functions
7
+ * - Dangerous DOM manipulation patterns
8
+ */
9
+ export interface XssVulnerability {
10
+ type: 'INNERHTML_XSS' | 'EVAL_XSS' | 'UNESCAPED_DOM' | 'DANGEROUS_DOM_METHOD' | 'REACT_DANGEROUSHTML';
11
+ severity: 'CRITICAL' | 'HIGH' | 'MEDIUM';
12
+ line: number;
13
+ column: number;
14
+ code: string;
15
+ issue: string;
16
+ cwe: string;
17
+ fix: string;
18
+ }
19
+ export declare class XssDetector {
20
+ private vulnerabilities;
21
+ /**
22
+ * Scan code for XSS vulnerabilities
23
+ */
24
+ scan(code: string): XssVulnerability[];
25
+ /**
26
+ * Detect innerHTML usage with variables or user input
27
+ * Pattern: element.innerHTML = userInput
28
+ * Pattern: element.innerHTML = `content ${userVar}`
29
+ */
30
+ private checkInnerHtmlUsage;
31
+ /**
32
+ * Detect eval() and similar dangerous functions
33
+ * Pattern: eval(userInput)
34
+ * Pattern: Function(userInput)
35
+ * Pattern: setTimeout(userInput)
36
+ */
37
+ private checkEvalUsage;
38
+ /**
39
+ * Detect unescaped DOM manipulation
40
+ * Pattern: element.insertAdjacentHTML('beforeend', userInput)
41
+ * Pattern: document.write(userInput)
42
+ */
43
+ private checkUnescapedDomManipulation;
44
+ /**
45
+ * Detect dangerous DOM methods
46
+ * Pattern: element.click(userEvent)
47
+ * Pattern: element.setAttribute('onclick', userInput)
48
+ */
49
+ private checkDangerousDomMethods;
50
+ /**
51
+ * Detect React dangerouslySetInnerHTML usage
52
+ * Pattern: dangerouslySetInnerHTML={{ __html: userInput }}
53
+ */
54
+ private checkReactDangerousHtml;
55
+ /**
56
+ * Check if position is inside a comment or string
57
+ */
58
+ private isCommentOrString;
59
+ }
60
+ //# sourceMappingURL=xss-detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xss-detector.d.ts","sourceRoot":"","sources":["../../../src/developer/scanners/xss-detector.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,eAAe,GAAG,UAAU,GAAG,eAAe,GAAG,sBAAsB,GAAG,qBAAqB,CAAC;IACtG,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,CAAC;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;CACb;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,eAAe,CAA0B;IAEjD;;OAEG;IACH,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,EAAE;IAgBtC;;;;OAIG;IACH,OAAO,CAAC,mBAAmB;IAuC3B;;;;;OAKG;IACH,OAAO,CAAC,cAAc;IAgDtB;;;;OAIG;IACH,OAAO,CAAC,6BAA6B;IA6CrC;;;;OAIG;IACH,OAAO,CAAC,wBAAwB;IA8BhC;;;OAGG;IACH,OAAO,CAAC,uBAAuB;IA6B/B;;OAEG;IACH,OAAO,CAAC,iBAAiB;CAI1B"}