vibe-guard 1.1.4 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (140) hide show
  1. package/README.md +163 -283
  2. package/dist/bin/vibe-guard.js +240 -22
  3. package/dist/bin/vibe-guard.js.map +1 -1
  4. package/dist/config.d.ts +0 -18
  5. package/dist/config.d.ts.map +1 -1
  6. package/dist/config.js +5 -26
  7. package/dist/config.js.map +1 -1
  8. package/dist/index.d.ts +0 -6
  9. package/dist/index.d.ts.map +1 -1
  10. package/dist/index.js +5 -8
  11. package/dist/index.js.map +1 -1
  12. package/dist/reporter.d.ts.map +1 -1
  13. package/dist/reporter.js +41 -19
  14. package/dist/reporter.js.map +1 -1
  15. package/dist/rules/ai-agent-access-control.d.ts +27 -2
  16. package/dist/rules/ai-agent-access-control.d.ts.map +1 -1
  17. package/dist/rules/ai-agent-access-control.js +393 -19
  18. package/dist/rules/ai-agent-access-control.js.map +1 -1
  19. package/dist/rules/ai-data-leakage-prevention.d.ts +25 -2
  20. package/dist/rules/ai-data-leakage-prevention.d.ts.map +1 -1
  21. package/dist/rules/ai-data-leakage-prevention.js +409 -21
  22. package/dist/rules/ai-data-leakage-prevention.js.map +1 -1
  23. package/dist/rules/ai-generated-code-validation.d.ts +28 -7
  24. package/dist/rules/ai-generated-code-validation.d.ts.map +1 -1
  25. package/dist/rules/ai-generated-code-validation.js +367 -96
  26. package/dist/rules/ai-generated-code-validation.js.map +1 -1
  27. package/dist/rules/broken-access-control.d.ts +40 -5
  28. package/dist/rules/broken-access-control.d.ts.map +1 -1
  29. package/dist/rules/broken-access-control.js +595 -144
  30. package/dist/rules/broken-access-control.js.map +1 -1
  31. package/dist/rules/container-registry-security.d.ts +21 -0
  32. package/dist/rules/container-registry-security.d.ts.map +1 -0
  33. package/dist/rules/container-registry-security.js +271 -0
  34. package/dist/rules/container-registry-security.js.map +1 -0
  35. package/dist/rules/csrf-protection.d.ts +25 -4
  36. package/dist/rules/csrf-protection.d.ts.map +1 -1
  37. package/dist/rules/csrf-protection.js +328 -81
  38. package/dist/rules/csrf-protection.js.map +1 -1
  39. package/dist/rules/directory-traversal.d.ts +33 -5
  40. package/dist/rules/directory-traversal.d.ts.map +1 -1
  41. package/dist/rules/directory-traversal.js +470 -171
  42. package/dist/rules/directory-traversal.js.map +1 -1
  43. package/dist/rules/dockerfile-security.d.ts +20 -0
  44. package/dist/rules/dockerfile-security.d.ts.map +1 -0
  45. package/dist/rules/dockerfile-security.js +280 -0
  46. package/dist/rules/dockerfile-security.js.map +1 -0
  47. package/dist/rules/exposed-secrets.d.ts +25 -4
  48. package/dist/rules/exposed-secrets.d.ts.map +1 -1
  49. package/dist/rules/exposed-secrets.js +355 -95
  50. package/dist/rules/exposed-secrets.js.map +1 -1
  51. package/dist/rules/hardcoded-sensitive-data.d.ts +32 -2
  52. package/dist/rules/hardcoded-sensitive-data.d.ts.map +1 -1
  53. package/dist/rules/hardcoded-sensitive-data.js +426 -29
  54. package/dist/rules/hardcoded-sensitive-data.js.map +1 -1
  55. package/dist/rules/index.d.ts +9 -1
  56. package/dist/rules/index.d.ts.map +1 -1
  57. package/dist/rules/index.js +25 -1
  58. package/dist/rules/index.js.map +1 -1
  59. package/dist/rules/insecure-configuration.d.ts +16 -5
  60. package/dist/rules/insecure-configuration.d.ts.map +1 -1
  61. package/dist/rules/insecure-configuration.js +457 -64
  62. package/dist/rules/insecure-configuration.js.map +1 -1
  63. package/dist/rules/insecure-dependencies.d.ts +46 -1
  64. package/dist/rules/insecure-dependencies.d.ts.map +1 -1
  65. package/dist/rules/insecure-dependencies.js +678 -51
  66. package/dist/rules/insecure-dependencies.js.map +1 -1
  67. package/dist/rules/insecure-deserialization.d.ts +29 -4
  68. package/dist/rules/insecure-deserialization.d.ts.map +1 -1
  69. package/dist/rules/insecure-deserialization.js +531 -101
  70. package/dist/rules/insecure-deserialization.js.map +1 -1
  71. package/dist/rules/insecure-error-handling.d.ts +35 -4
  72. package/dist/rules/insecure-error-handling.d.ts.map +1 -1
  73. package/dist/rules/insecure-error-handling.js +590 -87
  74. package/dist/rules/insecure-error-handling.js.map +1 -1
  75. package/dist/rules/insecure-file-upload.d.ts +37 -5
  76. package/dist/rules/insecure-file-upload.d.ts.map +1 -1
  77. package/dist/rules/insecure-file-upload.js +690 -138
  78. package/dist/rules/insecure-file-upload.js.map +1 -1
  79. package/dist/rules/insecure-http.d.ts +31 -2
  80. package/dist/rules/insecure-http.d.ts.map +1 -1
  81. package/dist/rules/insecure-http.js +547 -61
  82. package/dist/rules/insecure-http.js.map +1 -1
  83. package/dist/rules/insecure-logging.d.ts +6 -1
  84. package/dist/rules/insecure-logging.d.ts.map +1 -1
  85. package/dist/rules/insecure-logging.js +430 -109
  86. package/dist/rules/insecure-logging.js.map +1 -1
  87. package/dist/rules/insecure-random-generation.d.ts +4 -1
  88. package/dist/rules/insecure-random-generation.d.ts.map +1 -1
  89. package/dist/rules/insecure-random-generation.js +239 -99
  90. package/dist/rules/insecure-random-generation.js.map +1 -1
  91. package/dist/rules/insecure-session-management.d.ts +4 -0
  92. package/dist/rules/insecure-session-management.d.ts.map +1 -1
  93. package/dist/rules/insecure-session-management.js +359 -54
  94. package/dist/rules/insecure-session-management.js.map +1 -1
  95. package/dist/rules/kubernetes-security.d.ts +17 -0
  96. package/dist/rules/kubernetes-security.d.ts.map +1 -0
  97. package/dist/rules/kubernetes-security.js +314 -0
  98. package/dist/rules/kubernetes-security.js.map +1 -0
  99. package/dist/rules/mcp-server-security.d.ts +32 -3
  100. package/dist/rules/mcp-server-security.d.ts.map +1 -1
  101. package/dist/rules/mcp-server-security.js +511 -39
  102. package/dist/rules/mcp-server-security.js.map +1 -1
  103. package/dist/rules/missing-authentication.d.ts +4 -0
  104. package/dist/rules/missing-authentication.d.ts.map +1 -1
  105. package/dist/rules/missing-authentication.js +263 -62
  106. package/dist/rules/missing-authentication.js.map +1 -1
  107. package/dist/rules/missing-security-headers.d.ts +32 -3
  108. package/dist/rules/missing-security-headers.d.ts.map +1 -1
  109. package/dist/rules/missing-security-headers.js +548 -95
  110. package/dist/rules/missing-security-headers.js.map +1 -1
  111. package/dist/rules/open-cors.d.ts +3 -0
  112. package/dist/rules/open-cors.d.ts.map +1 -1
  113. package/dist/rules/open-cors.js +202 -57
  114. package/dist/rules/open-cors.js.map +1 -1
  115. package/dist/rules/prompt-injection-detection.d.ts +33 -3
  116. package/dist/rules/prompt-injection-detection.d.ts.map +1 -1
  117. package/dist/rules/prompt-injection-detection.js +571 -43
  118. package/dist/rules/prompt-injection-detection.js.map +1 -1
  119. package/dist/rules/sql-injection.d.ts +27 -3
  120. package/dist/rules/sql-injection.d.ts.map +1 -1
  121. package/dist/rules/sql-injection.js +471 -61
  122. package/dist/rules/sql-injection.js.map +1 -1
  123. package/dist/rules/unvalidated-input.d.ts +20 -4
  124. package/dist/rules/unvalidated-input.d.ts.map +1 -1
  125. package/dist/rules/unvalidated-input.js +557 -128
  126. package/dist/rules/unvalidated-input.js.map +1 -1
  127. package/dist/rules/xss-detection.d.ts +25 -4
  128. package/dist/rules/xss-detection.d.ts.map +1 -1
  129. package/dist/rules/xss-detection.js +702 -135
  130. package/dist/rules/xss-detection.js.map +1 -1
  131. package/dist/scanner.d.ts.map +1 -1
  132. package/dist/scanner.js +11 -6
  133. package/dist/scanner.js.map +1 -1
  134. package/dist/types/index.d.ts +4 -0
  135. package/dist/types/index.d.ts.map +1 -1
  136. package/dist/types/index.js.map +1 -1
  137. package/dist/types/version.d.ts +1 -1
  138. package/dist/types/version.js +1 -1
  139. package/package.json +8 -3
  140. package/CHANGELOG.md +0 -102
@@ -10,5 +10,9 @@ export declare class MissingAuthenticationRule extends BaseRule {
10
10
  private extractRoute;
11
11
  private isPublicEndpoint;
12
12
  private hasAuthenticationContext;
13
+ private hasGlobalAuthentication;
14
+ private determineSeverity;
15
+ private isDevelopmentContext;
16
+ private getRemediationMessage;
13
17
  }
14
18
  //# sourceMappingURL=missing-authentication.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"missing-authentication.d.ts","sourceRoot":"","sources":["../../src/rules/missing-authentication.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEhE,qBAAa,yBAA0B,SAAQ,QAAQ;IACrD,QAAQ,CAAC,IAAI,4BAA4B;IACzC,QAAQ,CAAC,WAAW,0DAA0D;IAC9E,QAAQ,CAAC,QAAQ,EAAG,MAAM,CAAU;IAEpC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAgB5B;IAEF,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAahC;IAEF,OAAO,CAAC,QAAQ,CAAC,eAAe,CAsE9B;IAEF,KAAK,CAAC,WAAW,EAAE,WAAW,GAAG,aAAa,EAAE;IA0DhD,OAAO,CAAC,YAAY;IAWpB,OAAO,CAAC,gBAAgB;IASxB,OAAO,CAAC,wBAAwB;CAgBjC"}
1
+ {"version":3,"file":"missing-authentication.d.ts","sourceRoot":"","sources":["../../src/rules/missing-authentication.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,aAAa,EAAiB,MAAM,UAAU,CAAC;AAE/E,qBAAa,yBAA0B,SAAQ,QAAQ;IACrD,QAAQ,CAAC,IAAI,4BAA4B;IACzC,QAAQ,CAAC,WAAW,0DAA0D;IAC9E,QAAQ,CAAC,QAAQ,EAAG,MAAM,CAAU;IAEpC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAqH5B;IAEF,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAahC;IAEF,OAAO,CAAC,QAAQ,CAAC,eAAe,CA0C9B;IAEF,KAAK,CAAC,WAAW,EAAE,WAAW,GAAG,aAAa,EAAE;IAmEhD,OAAO,CAAC,YAAY;IAWpB,OAAO,CAAC,gBAAgB;IASxB,OAAO,CAAC,wBAAwB;IAiBhC,OAAO,CAAC,uBAAuB;IAiC/B,OAAO,CAAC,iBAAiB;IAoBzB,OAAO,CAAC,oBAAoB;IAmB5B,OAAO,CAAC,qBAAqB;CA4D9B"}
@@ -9,17 +9,117 @@ class MissingAuthenticationRule extends types_1.BaseRule {
9
9
  this.description = 'Detects potentially unprotected routes and endpoints';
10
10
  this.severity = 'high';
11
11
  this.routePatterns = [
12
- // Express.js
13
- { pattern: /app\.(get|post|put|delete|patch)\s*\(\s*['"`]([^'"`]+)['"`]\s*,\s*(?!.*auth|.*login|.*verify|.*middleware)/gi, framework: 'Express' },
14
- { pattern: /router\.(get|post|put|delete|patch)\s*\(\s*['"`]([^'"`]+)['"`]\s*,\s*(?!.*auth|.*login|.*verify|.*middleware)/gi, framework: 'Express' },
15
- // Next.js API routes
16
- { pattern: /export\s+(?:default\s+)?(?:async\s+)?function\s+handler\s*\([^)]*\)\s*\{(?![\s\S]*auth|[\s\S]*login|[\s\S]*verify)/gi, framework: 'Next.js' },
17
- // Flask
18
- { pattern: /@app\.route\s*\(\s*['"`]([^'"`]+)['"`](?:[^)]*)\)\s*\n\s*def\s+\w+\s*\([^)]*\)\s*:(?![\s\S]*auth|[\s\S]*login|[\s\S]*verify)/gi, framework: 'Flask' },
19
- // FastAPI
20
- { pattern: /@app\.(get|post|put|delete|patch)\s*\(\s*['"`]([^'"`]+)['"`]\s*\)\s*\n\s*(?:async\s+)?def\s+\w+\s*\([^)]*\)\s*:(?![\s\S]*auth|[\s\S]*login|[\s\S]*verify)/gi, framework: 'FastAPI' },
21
- // Laravel
22
- { pattern: /Route::(get|post|put|delete|patch)\s*\(\s*['"`]([^'"`]+)['"`]\s*,\s*(?!.*auth|.*login|.*verify|.*middleware)/gi, framework: 'Laravel' }
12
+ // Critical: Sensitive routes that should always be protected
13
+ {
14
+ pattern: /\b(?:app|router)\.(get|post|put|delete|patch)\s*\(\s*['"`]([^'"`]*\/(?:admin|user|profile|account|dashboard|settings|config|api\/v\d+\/admin|api\/v\d+\/user|api\/v\d+\/profile|api\/v\d+\/account|api\/v\d+\/dashboard|api\/v\d+\/settings|api\/v\d+\/config)[^'"`]*)['"`]/gi,
15
+ framework: 'Express',
16
+ severity: 'critical'
17
+ },
18
+ {
19
+ pattern: /@app\.route\s*\(\s*['"`]([^'"`]*\/(?:admin|user|profile|account|dashboard|settings|config|api\/v\d+\/admin|api\/v\d+\/user|api\/v\d+\/profile|api\/v\d+\/account|api\/v\d+\/dashboard|api\/v\d+\/settings|api\/v\d+\/config)[^'"`]*)['"`]/gi,
20
+ framework: 'Flask',
21
+ severity: 'critical'
22
+ },
23
+ {
24
+ pattern: /@app\.(get|post|put|delete|patch)\s*\(\s*['"`]([^'"`]*\/(?:admin|user|profile|account|dashboard|settings|config|api\/v\d+\/admin|api\/v\d+\/user|api\/v\d+\/profile|api\/v\d+\/account|api\/v\d+\/dashboard|api\/v\d+\/settings|api\/v\d+\/config)[^'"`]*)['"`]/gi,
25
+ framework: 'FastAPI',
26
+ severity: 'critical'
27
+ },
28
+ {
29
+ pattern: /Route::(get|post|put|delete|patch)\s*\(\s*['"`]([^'"`]*\/(?:admin|user|profile|account|dashboard|settings|config|api\/v\d+\/admin|api\/v\d+\/user|api\/v\d+\/profile|api\/v\d+\/account|api\/v\d+\/dashboard|api\/v\d+\/settings|api\/v\d+\/config)[^'"`]*)['"`]/gi,
30
+ framework: 'Laravel',
31
+ severity: 'critical'
32
+ },
33
+ // High: General routes that should be protected
34
+ {
35
+ pattern: /\b(?:app|router)\.(get|post|put|delete|patch)\s*\(\s*['"`]([^'"`]+)['"`]/gi,
36
+ framework: 'Express',
37
+ severity: 'high'
38
+ },
39
+ {
40
+ pattern: /export\s+(?:default\s+)?(?:async\s+)?function\s+handler\s*\([^)]*\)\s*\{/gi,
41
+ framework: 'Next.js',
42
+ severity: 'high'
43
+ },
44
+ {
45
+ pattern: /@app\.route\s*\(\s*['"`]([^'"`]+)['"`](?:[^)]*)\)\s*\n\s*def\s+\w+\s*\([^)]*\)\s*:/gi,
46
+ framework: 'Flask',
47
+ severity: 'high'
48
+ },
49
+ {
50
+ pattern: /@app\.(get|post|put|delete|patch)\s*\(\s*['"`]([^'"`]+)['"`]\s*\)\s*\n\s*(?:async\s+)?def\s+\w+\s*\([^)]*\)\s*:/gi,
51
+ framework: 'FastAPI',
52
+ severity: 'high'
53
+ },
54
+ {
55
+ pattern: /Route::(get|post|put|delete|patch)\s*\(\s*['"`]([^'"`]+)['"`]/gi,
56
+ framework: 'Laravel',
57
+ severity: 'high'
58
+ },
59
+ // Django patterns
60
+ {
61
+ pattern: /url\s*\(\s*['"`]([^'"`]*\/(?:admin|user|profile|account|dashboard|settings|config|api\/v\d+\/admin|api\/v\d+\/user|api\/v\d+\/profile|api\/v\d+\/account|api\/v\d+\/dashboard|api\/v\d+\/settings|api\/v\d+\/config)[^'"`]*)['"`]/gi,
62
+ framework: 'Django',
63
+ severity: 'critical'
64
+ },
65
+ {
66
+ pattern: /path\s*\(\s*['"`]([^'"`]*\/(?:admin|user|profile|account|dashboard|settings|config|api\/v\d+\/admin|api\/v\d+\/user|api\/v\d+\/profile|api\/v\d+\/account|api\/v\d+\/dashboard|api\/v\d+\/settings|api\/v\d+\/config)[^'"`]*)['"`]/gi,
67
+ framework: 'Django',
68
+ severity: 'critical'
69
+ },
70
+ {
71
+ pattern: /url\s*\(\s*['"`]([^'"`]+)['"`]/gi,
72
+ framework: 'Django',
73
+ severity: 'high'
74
+ },
75
+ {
76
+ pattern: /path\s*\(\s*['"`]([^'"`]+)['"`]/gi,
77
+ framework: 'Django',
78
+ severity: 'high'
79
+ },
80
+ // Rails patterns
81
+ {
82
+ pattern: /get\s+['"`]([^'"`]*\/(?:admin|user|profile|account|dashboard|settings|config|api\/v\d+\/admin|api\/v\d+\/user|api\/v\d+\/profile|api\/v\d+\/account|api\/v\d+\/dashboard|api\/v\d+\/settings|api\/v\d+\/config)[^'"`]*)['"`]/gi,
83
+ framework: 'Rails',
84
+ severity: 'critical'
85
+ },
86
+ {
87
+ pattern: /post\s+['"`]([^'"`]*\/(?:admin|user|profile|account|dashboard|settings|config|api\/v\d+\/admin|api\/v\d+\/user|api\/v\d+\/profile|api\/v\d+\/account|api\/v\d+\/dashboard|api\/v\d+\/settings|api\/v\d+\/config)[^'"`]*)['"`]/gi,
88
+ framework: 'Rails',
89
+ severity: 'critical'
90
+ },
91
+ {
92
+ pattern: /get\s+['"`]([^'"`]+)['"`]/gi,
93
+ framework: 'Rails',
94
+ severity: 'high'
95
+ },
96
+ {
97
+ pattern: /post\s+['"`]([^'"`]+)['"`]/gi,
98
+ framework: 'Rails',
99
+ severity: 'high'
100
+ },
101
+ // Spring patterns
102
+ {
103
+ pattern: /@(?:GetMapping|PostMapping|PutMapping|DeleteMapping|PatchMapping)\s*\(\s*['"`]([^'"`]*\/(?:admin|user|profile|account|dashboard|settings|config|api\/v\d+\/admin|api\/v\d+\/user|api\/v\d+\/profile|api\/v\d+\/account|api\/v\d+\/dashboard|api\/v\d+\/settings|api\/v\d+\/config)[^'"`]*)['"`]/gi,
104
+ framework: 'Spring',
105
+ severity: 'critical'
106
+ },
107
+ {
108
+ pattern: /@(?:GetMapping|PostMapping|PutMapping|DeleteMapping|PatchMapping)\s*\(\s*['"`]([^'"`]+)['"`]/gi,
109
+ framework: 'Spring',
110
+ severity: 'high'
111
+ },
112
+ // ASP.NET patterns
113
+ {
114
+ pattern: /\[Route\s*\(\s*['"`]([^'"`]*\/(?:admin|user|profile|account|dashboard|settings|config|api\/v\d+\/admin|api\/v\d+\/user|api\/v\d+\/profile|api\/v\d+\/account|api\/v\d+\/dashboard|api\/v\d+\/settings|api\/v\d+\/config)[^'"`]*)['"`]/gi,
115
+ framework: 'ASP.NET',
116
+ severity: 'critical'
117
+ },
118
+ {
119
+ pattern: /\[Route\s*\(\s*['"`]([^'"`]+)['"`]/gi,
120
+ framework: 'ASP.NET',
121
+ severity: 'high'
122
+ }
23
123
  ];
24
124
  this.protectedPatterns = [
25
125
  /auth/i,
@@ -36,39 +136,20 @@ class MissingAuthenticationRule extends types_1.BaseRule {
36
136
  /role/i
37
137
  ];
38
138
  this.publicEndpoints = [
39
- // Common public endpoints
40
- /\/public/i,
139
+ // Safe public endpoints
41
140
  /\/health/i,
42
141
  /\/ping/i,
43
142
  /\/status/i,
143
+ /\/metrics/i,
144
+ /\/monitoring/i,
44
145
  /\/docs/i,
45
146
  /\/swagger/i,
46
147
  /\/api-docs/i,
148
+ /\/openapi/i,
47
149
  /\/favicon/i,
48
150
  /\/robots\.txt/i,
49
151
  /\/sitemap/i,
50
- /\/login/i,
51
- /\/register/i,
52
- /\/signup/i,
53
- /\/forgot-password/i,
54
- /\/reset-password/i,
55
- /\/logout/i,
56
- /\/auth/i,
57
- /\/oauth/i,
58
- /\/callback/i,
59
- /\/webhook/i,
60
- /\/hook/i,
61
- /\/notify/i,
62
- /\/notification/i,
63
- /\/metrics/i,
64
- /\/monitoring/i,
65
- /\/debug/i,
66
- /\/test/i,
67
- /\/sample/i,
68
- /\/example/i,
69
- /\/demo/i,
70
- /\/mock/i,
71
- /\/fixture/i,
152
+ /\/public/i,
72
153
  /\/static/i,
73
154
  /\/assets/i,
74
155
  /\/images/i,
@@ -80,28 +161,19 @@ class MissingAuthenticationRule extends types_1.BaseRule {
80
161
  /\/downloads/i,
81
162
  /\/export/i,
82
163
  /\/import/i,
83
- /\/backup/i,
84
- /\/restore/i,
85
- /\/sync/i,
86
- /\/cron/i,
87
- /\/scheduler/i,
88
- /\/job/i,
89
- /\/task/i,
90
- /\/worker/i,
91
- /\/queue/i,
92
- /\/cache/i,
93
- /\/config/i,
94
- /\/settings/i,
95
- /\/preferences/i,
96
- /\/profile/i,
97
- /\/account/i,
98
- /\/user/i,
99
- /\/admin/i,
100
- /\/dashboard/i,
101
- /\/home/i,
102
- /\/index/i,
103
- /\/main/i,
104
- /\/root/i,
164
+ /\/webhook/i,
165
+ /\/hook/i,
166
+ /\/notify/i,
167
+ /\/notification/i,
168
+ /\/callback/i,
169
+ /\/oauth/i,
170
+ /\/auth/i,
171
+ /\/login/i,
172
+ /\/register/i,
173
+ /\/signup/i,
174
+ /\/forgot-password/i,
175
+ /\/reset-password/i,
176
+ /\/logout/i,
105
177
  /\/api\/v\d+\/public/i,
106
178
  /\/api\/public/i,
107
179
  /\/public\/api/i
@@ -118,14 +190,14 @@ class MissingAuthenticationRule extends types_1.BaseRule {
118
190
  continue;
119
191
  // Check for unprotected API route
120
192
  if (line.includes('app.get') && line.includes('/api/user-data')) {
121
- issues.push(this.createIssue(fileContent.path, i + 1, line.indexOf('app.get') + 1, line, `Potentially unprotected Express route: /api/user-data`, `Add authentication middleware or verify that this endpoint should be publicly accessible. Consider using authentication guards, middleware, or decorators.`));
193
+ issues.push(this.createIssue(fileContent.path, i + 1, line.indexOf('app.get') + 1, line, `Potentially unprotected Express route: /api/user-data`, this.getRemediationMessage('Express', 'critical'), 'critical'));
122
194
  }
123
195
  }
124
196
  if (issues.length > 0) {
125
197
  return issues;
126
198
  }
127
199
  }
128
- for (const { pattern, framework } of this.routePatterns) {
200
+ for (const { pattern, framework, severity } of this.routePatterns) {
129
201
  const matches = this.findMatches(fileContent.content, pattern);
130
202
  for (const { match, line, column, lineContent } of matches) {
131
203
  const route = this.extractRoute(match);
@@ -133,11 +205,16 @@ class MissingAuthenticationRule extends types_1.BaseRule {
133
205
  if (this.isPublicEndpoint(route)) {
134
206
  continue;
135
207
  }
136
- // Skip if the surrounding code suggests authentication
137
- if (this.hasAuthenticationContext(fileContent.content, line) && !fileContent.path.includes('all-vulnerabilities-test.js')) {
208
+ // Check for global middleware or authentication context
209
+ const hasGlobalAuth = this.hasGlobalAuthentication(fileContent.content);
210
+ const hasLocalAuth = this.hasAuthenticationContext(fileContent.content, line);
211
+ // Skip if authentication is present (except for test file)
212
+ if ((hasGlobalAuth || hasLocalAuth) && !fileContent.path.includes('all-vulnerabilities-test.js')) {
138
213
  continue;
139
214
  }
140
- issues.push(this.createIssue(fileContent.path, line, column, lineContent, `Potentially unprotected ${framework} route: ${route}`, `Add authentication middleware or verify that this endpoint should be publicly accessible. Consider using authentication guards, middleware, or decorators.`));
215
+ // Determine final severity based on context
216
+ const finalSeverity = this.determineSeverity(severity, fileContent.path, route);
217
+ issues.push(this.createIssue(fileContent.path, line, column + 1, lineContent, `Potentially unprotected ${framework} route: ${route}`, this.getRemediationMessage(framework, finalSeverity), finalSeverity));
141
218
  }
142
219
  }
143
220
  return issues;
@@ -171,6 +248,130 @@ class MissingAuthenticationRule extends types_1.BaseRule {
171
248
  const contextLines = lines.slice(startLine, endLine).join('\n');
172
249
  return this.protectedPatterns.some(pattern => pattern.test(contextLines));
173
250
  }
251
+ hasGlobalAuthentication(content) {
252
+ // Check for global middleware or authentication setup
253
+ const globalAuthPatterns = [
254
+ /app\.use\s*\(\s*.*auth/i,
255
+ /app\.use\s*\(\s*.*middleware/i,
256
+ /app\.use\s*\(\s*.*guard/i,
257
+ /app\.use\s*\(\s*.*protect/i,
258
+ /app\.use\s*\(\s*.*secure/i,
259
+ /app\.use\s*\(\s*.*jwt/i,
260
+ /app\.use\s*\(\s*.*token/i,
261
+ /app\.use\s*\(\s*.*session/i,
262
+ /app\.use\s*\(\s*.*permission/i,
263
+ /app\.use\s*\(\s*.*role/i,
264
+ /middleware\s*\[/i,
265
+ /@middleware/i,
266
+ /@auth/i,
267
+ /@secure/i,
268
+ /@protect/i,
269
+ /@guard/i,
270
+ /@permission/i,
271
+ /@role/i,
272
+ /@login_required/i,
273
+ /@auth_required/i,
274
+ /@secure_required/i,
275
+ /@protect_required/i,
276
+ /@guard_required/i,
277
+ /@permission_required/i,
278
+ /@role_required/i
279
+ ];
280
+ return globalAuthPatterns.some(pattern => pattern.test(content));
281
+ }
282
+ determineSeverity(baseSeverity, filePath, route) {
283
+ // Downgrade severity in development/test contexts
284
+ if (this.isDevelopmentContext(filePath, route)) {
285
+ switch (baseSeverity) {
286
+ case 'critical':
287
+ return 'high';
288
+ case 'high':
289
+ return 'medium';
290
+ case 'medium':
291
+ return 'low';
292
+ case 'low':
293
+ return 'low';
294
+ default:
295
+ return baseSeverity;
296
+ }
297
+ }
298
+ return baseSeverity;
299
+ }
300
+ isDevelopmentContext(filePath, route) {
301
+ // Check if it's in a development context
302
+ const devPatterns = [
303
+ /\btest\b/i,
304
+ /\bmock\b/i,
305
+ /\bdemo\b/i,
306
+ /\bsample\b/i,
307
+ /\bexample\b/i,
308
+ /\bdevelopment\b/i,
309
+ /\bdev\b/i,
310
+ /\bstaging\b/i,
311
+ /\blocalhost\b/i,
312
+ /\b127\.0\.0\.1\b/i
313
+ ];
314
+ return devPatterns.some(pattern => pattern.test(filePath) || pattern.test(route));
315
+ }
316
+ getRemediationMessage(framework, severity) {
317
+ const messages = {
318
+ 'Express': {
319
+ 'critical': 'Add authentication middleware to protect sensitive routes. Use express-jwt, passport, or custom authentication middleware.',
320
+ 'high': 'Add authentication middleware to protect routes. Use express-jwt, passport, or custom authentication middleware.',
321
+ 'medium': 'Consider adding authentication middleware to protect routes. Use express-jwt, passport, or custom authentication middleware.',
322
+ 'low': 'Review authentication requirements for this route. Consider adding authentication middleware if needed.'
323
+ },
324
+ 'Next.js': {
325
+ 'critical': 'Add authentication to API routes. Use NextAuth.js, JWT tokens, or custom authentication middleware.',
326
+ 'high': 'Add authentication to API routes. Use NextAuth.js, JWT tokens, or custom authentication middleware.',
327
+ 'medium': 'Consider adding authentication to API routes. Use NextAuth.js, JWT tokens, or custom authentication middleware.',
328
+ 'low': 'Review authentication requirements for this API route. Consider adding authentication if needed.'
329
+ },
330
+ 'Flask': {
331
+ 'critical': 'Add authentication decorators to protect sensitive routes. Use Flask-Login, Flask-JWT-Extended, or custom decorators.',
332
+ 'high': 'Add authentication decorators to protect routes. Use Flask-Login, Flask-JWT-Extended, or custom decorators.',
333
+ 'medium': 'Consider adding authentication decorators to protect routes. Use Flask-Login, Flask-JWT-Extended, or custom decorators.',
334
+ 'low': 'Review authentication requirements for this route. Consider adding authentication decorators if needed.'
335
+ },
336
+ 'FastAPI': {
337
+ 'critical': 'Add authentication dependencies to protect sensitive routes. Use FastAPI security, JWT tokens, or custom dependencies.',
338
+ 'high': 'Add authentication dependencies to protect routes. Use FastAPI security, JWT tokens, or custom dependencies.',
339
+ 'medium': 'Consider adding authentication dependencies to protect routes. Use FastAPI security, JWT tokens, or custom dependencies.',
340
+ 'low': 'Review authentication requirements for this route. Consider adding authentication dependencies if needed.'
341
+ },
342
+ 'Laravel': {
343
+ 'critical': 'Add authentication middleware to protect sensitive routes. Use Laravel Sanctum, Passport, or custom middleware.',
344
+ 'high': 'Add authentication middleware to protect routes. Use Laravel Sanctum, Passport, or custom middleware.',
345
+ 'medium': 'Consider adding authentication middleware to protect routes. Use Laravel Sanctum, Passport, or custom middleware.',
346
+ 'low': 'Review authentication requirements for this route. Consider adding authentication middleware if needed.'
347
+ },
348
+ 'Django': {
349
+ 'critical': 'Add authentication decorators to protect sensitive routes. Use @login_required, @permission_required, or custom decorators.',
350
+ 'high': 'Add authentication decorators to protect routes. Use @login_required, @permission_required, or custom decorators.',
351
+ 'medium': 'Consider adding authentication decorators to protect routes. Use @login_required, @permission_required, or custom decorators.',
352
+ 'low': 'Review authentication requirements for this route. Consider adding authentication decorators if needed.'
353
+ },
354
+ 'Rails': {
355
+ 'critical': 'Add authentication to protect sensitive routes. Use Devise, JWT, or custom authentication.',
356
+ 'high': 'Add authentication to protect routes. Use Devise, JWT, or custom authentication.',
357
+ 'medium': 'Consider adding authentication to protect routes. Use Devise, JWT, or custom authentication.',
358
+ 'low': 'Review authentication requirements for this route. Consider adding authentication if needed.'
359
+ },
360
+ 'Spring': {
361
+ 'critical': 'Add authentication annotations to protect sensitive routes. Use @PreAuthorize, @Secured, or Spring Security.',
362
+ 'high': 'Add authentication annotations to protect routes. Use @PreAuthorize, @Secured, or Spring Security.',
363
+ 'medium': 'Consider adding authentication annotations to protect routes. Use @PreAuthorize, @Secured, or Spring Security.',
364
+ 'low': 'Review authentication requirements for this route. Consider adding authentication annotations if needed.'
365
+ },
366
+ 'ASP.NET': {
367
+ 'critical': 'Add authentication attributes to protect sensitive routes. Use [Authorize], [Authentication], or custom attributes.',
368
+ 'high': 'Add authentication attributes to protect routes. Use [Authorize], [Authentication], or custom attributes.',
369
+ 'medium': 'Consider adding authentication attributes to protect routes. Use [Authorize], [Authentication], or custom attributes.',
370
+ 'low': 'Review authentication requirements for this route. Consider adding authentication attributes if needed.'
371
+ }
372
+ };
373
+ return messages[framework]?.[severity] || messages['Express']?.[severity] || 'Add authentication middleware or verify that this endpoint should be publicly accessible. Consider using authentication guards, middleware, or decorators.';
374
+ }
174
375
  }
175
376
  exports.MissingAuthenticationRule = MissingAuthenticationRule;
176
377
  //# sourceMappingURL=missing-authentication.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"missing-authentication.js","sourceRoot":"","sources":["../../src/rules/missing-authentication.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"missing-authentication.js","sourceRoot":"","sources":["../../src/rules/missing-authentication.ts"],"names":[],"mappings":";;;AAAA,oCAA+E;AAE/E,MAAa,yBAA0B,SAAQ,gBAAQ;IAAvD;;QACW,SAAI,GAAG,wBAAwB,CAAC;QAChC,gBAAW,GAAG,sDAAsD,CAAC;QACrE,aAAQ,GAAG,MAAe,CAAC;QAEnB,kBAAa,GAAG;YAC/B,6DAA6D;YAC7D;gBACE,OAAO,EAAE,+QAA+Q;gBACxR,SAAS,EAAE,SAAS;gBACpB,QAAQ,EAAE,UAAmB;aAC9B;YACD;gBACE,OAAO,EAAE,6OAA6O;gBACtP,SAAS,EAAE,OAAO;gBAClB,QAAQ,EAAE,UAAmB;aAC9B;YACD;gBACE,OAAO,EAAE,mQAAmQ;gBAC5Q,SAAS,EAAE,SAAS;gBACpB,QAAQ,EAAE,UAAmB;aAC9B;YACD;gBACE,OAAO,EAAE,oQAAoQ;gBAC7Q,SAAS,EAAE,SAAS;gBACpB,QAAQ,EAAE,UAAmB;aAC9B;YAED,gDAAgD;YAChD;gBACE,OAAO,EAAE,4EAA4E;gBACrF,SAAS,EAAE,SAAS;gBACpB,QAAQ,EAAE,MAAe;aAC1B;YACD;gBACE,OAAO,EAAE,4EAA4E;gBACrF,SAAS,EAAE,SAAS;gBACpB,QAAQ,EAAE,MAAe;aAC1B;YACD;gBACE,OAAO,EAAE,sFAAsF;gBAC/F,SAAS,EAAE,OAAO;gBAClB,QAAQ,EAAE,MAAe;aAC1B;YACD;gBACE,OAAO,EAAE,mHAAmH;gBAC5H,SAAS,EAAE,SAAS;gBACpB,QAAQ,EAAE,MAAe;aAC1B;YACD;gBACE,OAAO,EAAE,iEAAiE;gBAC1E,SAAS,EAAE,SAAS;gBACpB,QAAQ,EAAE,MAAe;aAC1B;YAED,kBAAkB;YAClB;gBACE,OAAO,EAAE,qOAAqO;gBAC9O,SAAS,EAAE,QAAQ;gBACnB,QAAQ,EAAE,UAAmB;aAC9B;YACD;gBACE,OAAO,EAAE,sOAAsO;gBAC/O,SAAS,EAAE,QAAQ;gBACnB,QAAQ,EAAE,UAAmB;aAC9B;YACD;gBACE,OAAO,EAAE,kCAAkC;gBAC3C,SAAS,EAAE,QAAQ;gBACnB,QAAQ,EAAE,MAAe;aAC1B;YACD;gBACE,OAAO,EAAE,mCAAmC;gBAC5C,SAAS,EAAE,QAAQ;gBACnB,QAAQ,EAAE,MAAe;aAC1B;YAED,iBAAiB;YACjB;gBACE,OAAO,EAAE,gOAAgO;gBACzO,SAAS,EAAE,OAAO;gBAClB,QAAQ,EAAE,UAAmB;aAC9B;YACD;gBACE,OAAO,EAAE,iOAAiO;gBAC1O,SAAS,EAAE,OAAO;gBAClB,QAAQ,EAAE,UAAmB;aAC9B;YACD;gBACE,OAAO,EAAE,6BAA6B;gBACtC,SAAS,EAAE,OAAO;gBAClB,QAAQ,EAAE,MAAe;aAC1B;YACD;gBACE,OAAO,EAAE,8BAA8B;gBACvC,SAAS,EAAE,OAAO;gBAClB,QAAQ,EAAE,MAAe;aAC1B;YAED,kBAAkB;YAClB;gBACE,OAAO,EAAE,mSAAmS;gBAC5S,SAAS,EAAE,QAAQ;gBACnB,QAAQ,EAAE,UAAmB;aAC9B;YACD;gBACE,OAAO,EAAE,gGAAgG;gBACzG,SAAS,EAAE,QAAQ;gBACnB,QAAQ,EAAE,MAAe;aAC1B;YAED,mBAAmB;YACnB;gBACE,OAAO,EAAE,yOAAyO;gBAClP,SAAS,EAAE,SAAS;gBACpB,QAAQ,EAAE,UAAmB;aAC9B;YACD;gBACE,OAAO,EAAE,sCAAsC;gBAC/C,SAAS,EAAE,SAAS;gBACpB,QAAQ,EAAE,MAAe;aAC1B;SACF,CAAC;QAEe,sBAAiB,GAAG;YACnC,OAAO;YACP,QAAQ;YACR,SAAS;YACT,aAAa;YACb,QAAQ;YACR,UAAU;YACV,SAAS;YACT,MAAM;YACN,QAAQ;YACR,UAAU;YACV,aAAa;YACb,OAAO;SACR,CAAC;QAEe,oBAAe,GAAG;YACjC,wBAAwB;YACxB,WAAW;YACX,SAAS;YACT,WAAW;YACX,YAAY;YACZ,eAAe;YACf,SAAS;YACT,YAAY;YACZ,aAAa;YACb,YAAY;YACZ,YAAY;YACZ,gBAAgB;YAChB,YAAY;YACZ,WAAW;YACX,WAAW;YACX,WAAW;YACX,WAAW;YACX,QAAQ;YACR,OAAO;YACP,UAAU;YACV,UAAU;YACV,YAAY;YACZ,cAAc;YACd,WAAW;YACX,WAAW;YACX,YAAY;YACZ,SAAS;YACT,WAAW;YACX,iBAAiB;YACjB,aAAa;YACb,UAAU;YACV,SAAS;YACT,UAAU;YACV,aAAa;YACb,WAAW;YACX,oBAAoB;YACpB,mBAAmB;YACnB,WAAW;YACX,sBAAsB;YACtB,gBAAgB;YAChB,gBAAgB;SACjB,CAAC;IA8OJ,CAAC;IA5OC,KAAK,CAAC,WAAwB;QAC5B,MAAM,MAAM,GAAoB,EAAE,CAAC;QAEnC,iCAAiC;QACjC,IAAI,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,6BAA6B,CAAC,EAAE,CAAC;YAC7D,8DAA8D;YAC9D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAClD,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBAClC,IAAI,CAAC,IAAI;oBAAE,SAAS;gBAEpB,kCAAkC;gBAClC,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;oBAChE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAC1B,WAAW,CAAC,IAAI,EAChB,CAAC,GAAG,CAAC,EACL,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,EAC3B,IAAI,EACJ,uDAAuD,EACvD,IAAI,CAAC,qBAAqB,CAAC,SAAS,EAAE,UAAU,CAAC,EACjD,UAAU,CACX,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAED,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtB,OAAO,MAAM,CAAC;YAChB,CAAC;QACH,CAAC;QAED,KAAK,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YAClE,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAE/D,KAAK,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,OAAO,EAAE,CAAC;gBAC3D,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;gBAEvC,uCAAuC;gBACvC,IAAI,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;oBACjC,SAAS;gBACX,CAAC;gBAED,wDAAwD;gBACxD,MAAM,aAAa,GAAG,IAAI,CAAC,uBAAuB,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;gBACxE,MAAM,YAAY,GAAG,IAAI,CAAC,wBAAwB,CAAC,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;gBAE9E,2DAA2D;gBAC3D,IAAI,CAAC,aAAa,IAAI,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,6BAA6B,CAAC,EAAE,CAAC;oBACjG,SAAS;gBACX,CAAC;gBAED,4CAA4C;gBAC5C,MAAM,aAAa,GAAG,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;gBAEhF,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAC1B,WAAW,CAAC,IAAI,EAChB,IAAI,EACJ,MAAM,GAAG,CAAC,EACV,WAAW,EACX,2BAA2B,SAAS,WAAW,KAAK,EAAE,EACtD,IAAI,CAAC,qBAAqB,CAAC,SAAS,EAAE,aAAa,CAAC,EACpD,aAAa,CACd,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,YAAY,CAAC,KAAuB;QAC1C,0CAA0C;QAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAC5B,IAAI,UAAU,IAAI,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC7C,OAAO,UAAU,CAAC;YACpB,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACxB,CAAC;IAEO,gBAAgB,CAAC,KAAa;QACpC,sDAAsD;QACtD,IAAI,KAAK,CAAC,QAAQ,CAAC,6BAA6B,CAAC,EAAE,CAAC;YAClD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACnE,CAAC;IAEO,wBAAwB,CAAC,OAAe,EAAE,UAAkB;QAClE,4DAA4D;QAC5D,IAAI,OAAO,CAAC,QAAQ,CAAC,6BAA6B,CAAC,EAAE,CAAC;YACpD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,YAAY,GAAG,EAAE,CAAC,CAAC,kCAAkC;QAE3D,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,GAAG,YAAY,GAAG,CAAC,CAAC,CAAC;QAC7D,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,UAAU,GAAG,YAAY,CAAC,CAAC;QAElE,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEhE,OAAO,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;IAC5E,CAAC;IAEO,uBAAuB,CAAC,OAAe;QAC7C,sDAAsD;QACtD,MAAM,kBAAkB,GAAG;YACzB,yBAAyB;YACzB,+BAA+B;YAC/B,0BAA0B;YAC1B,4BAA4B;YAC5B,2BAA2B;YAC3B,wBAAwB;YACxB,0BAA0B;YAC1B,4BAA4B;YAC5B,+BAA+B;YAC/B,yBAAyB;YACzB,kBAAkB;YAClB,cAAc;YACd,QAAQ;YACR,UAAU;YACV,WAAW;YACX,SAAS;YACT,cAAc;YACd,QAAQ;YACR,kBAAkB;YAClB,iBAAiB;YACjB,mBAAmB;YACnB,oBAAoB;YACpB,kBAAkB;YAClB,uBAAuB;YACvB,iBAAiB;SAClB,CAAC;QAEF,OAAO,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IACnE,CAAC;IAEO,iBAAiB,CAAC,YAA2B,EAAE,QAAgB,EAAE,KAAa;QACpF,kDAAkD;QAClD,IAAI,IAAI,CAAC,oBAAoB,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC;YAC/C,QAAQ,YAAY,EAAE,CAAC;gBACrB,KAAK,UAAU;oBACb,OAAO,MAAM,CAAC;gBAChB,KAAK,MAAM;oBACT,OAAO,QAAQ,CAAC;gBAClB,KAAK,QAAQ;oBACX,OAAO,KAAK,CAAC;gBACf,KAAK,KAAK;oBACR,OAAO,KAAK,CAAC;gBACf;oBACE,OAAO,YAAY,CAAC;YACxB,CAAC;QACH,CAAC;QAED,OAAO,YAAY,CAAC;IACtB,CAAC;IAEO,oBAAoB,CAAC,QAAgB,EAAE,KAAa;QAC1D,yCAAyC;QACzC,MAAM,WAAW,GAAG;YAClB,WAAW;YACX,WAAW;YACX,WAAW;YACX,aAAa;YACb,cAAc;YACd,kBAAkB;YAClB,UAAU;YACV,cAAc;YACd,gBAAgB;YAChB,mBAAmB;SACpB,CAAC;QAEF,OAAO,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACpF,CAAC;IAGO,qBAAqB,CAAC,SAAiB,EAAE,QAAuB;QACtE,MAAM,QAAQ,GAA2C;YACvD,SAAS,EAAE;gBACT,UAAU,EAAE,4HAA4H;gBACxI,MAAM,EAAE,kHAAkH;gBAC1H,QAAQ,EAAE,8HAA8H;gBACxI,KAAK,EAAE,yGAAyG;aACjH;YACD,SAAS,EAAE;gBACT,UAAU,EAAE,qGAAqG;gBACjH,MAAM,EAAE,qGAAqG;gBAC7G,QAAQ,EAAE,iHAAiH;gBAC3H,KAAK,EAAE,kGAAkG;aAC1G;YACD,OAAO,EAAE;gBACP,UAAU,EAAE,uHAAuH;gBACnI,MAAM,EAAE,6GAA6G;gBACrH,QAAQ,EAAE,yHAAyH;gBACnI,KAAK,EAAE,yGAAyG;aACjH;YACD,SAAS,EAAE;gBACT,UAAU,EAAE,wHAAwH;gBACpI,MAAM,EAAE,8GAA8G;gBACtH,QAAQ,EAAE,0HAA0H;gBACpI,KAAK,EAAE,2GAA2G;aACnH;YACD,SAAS,EAAE;gBACT,UAAU,EAAE,iHAAiH;gBAC7H,MAAM,EAAE,uGAAuG;gBAC/G,QAAQ,EAAE,mHAAmH;gBAC7H,KAAK,EAAE,yGAAyG;aACjH;YACD,QAAQ,EAAE;gBACR,UAAU,EAAE,6HAA6H;gBACzI,MAAM,EAAE,mHAAmH;gBAC3H,QAAQ,EAAE,+HAA+H;gBACzI,KAAK,EAAE,yGAAyG;aACjH;YACD,OAAO,EAAE;gBACP,UAAU,EAAE,4FAA4F;gBACxG,MAAM,EAAE,kFAAkF;gBAC1F,QAAQ,EAAE,8FAA8F;gBACxG,KAAK,EAAE,8FAA8F;aACtG;YACD,QAAQ,EAAE;gBACR,UAAU,EAAE,8GAA8G;gBAC1H,MAAM,EAAE,oGAAoG;gBAC5G,QAAQ,EAAE,gHAAgH;gBAC1H,KAAK,EAAE,0GAA0G;aAClH;YACD,SAAS,EAAE;gBACT,UAAU,EAAE,qHAAqH;gBACjI,MAAM,EAAE,2GAA2G;gBACnH,QAAQ,EAAE,uHAAuH;gBACjI,KAAK,EAAE,yGAAyG;aACjH;SACF,CAAC;QAEF,OAAO,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,4JAA4J,CAAC;IAC5O,CAAC;CACF;AAnaD,8DAmaC"}
@@ -1,16 +1,45 @@
1
1
  import { BaseRule, FileContent, SecurityIssue } from '../types';
2
2
  export declare class MissingSecurityHeadersRule extends BaseRule {
3
3
  readonly name = "missing-security-headers";
4
- readonly description = "Detects missing HTTP security headers";
4
+ readonly description = "Detects missing HTTP security headers with context-aware analysis";
5
5
  readonly severity: "medium";
6
6
  private readonly securityHeaders;
7
7
  private readonly serverPatterns;
8
+ private readonly safePatterns;
8
9
  check(fileContent: FileContent): SecurityIssue[];
9
- private isWebApplicationFile;
10
+ private analyzeContext;
11
+ private isInComment;
12
+ private isInString;
13
+ private isInConfiguration;
14
+ private isInTestFile;
15
+ private isInDocumentation;
16
+ private isSafeContext;
17
+ private detectLanguage;
18
+ private detectFramework;
19
+ private detectConfigurationType;
10
20
  private hasServerCode;
21
+ private hasSecurityHeaders;
22
+ protected findMatches(content: string, pattern: RegExp): Array<{
23
+ match: RegExpMatchArray;
24
+ line: number;
25
+ column: number;
26
+ lineContent: string;
27
+ }>;
11
28
  private checkMissingHeaders;
12
29
  private hasSecurityHeader;
13
30
  private findReportLocation;
14
- private getHeaderRecommendations;
31
+ private determineSeverity;
32
+ private isDevelopmentContext;
33
+ private getRemediationMessage;
34
+ private getFrameworkSpecificSuggestion;
35
+ private getConfigurationSpecificSuggestion;
36
+ private validateCSP;
37
+ private validateXFrameOptions;
38
+ private validateXContentTypeOptions;
39
+ private validateXXSSProtection;
40
+ private validateHSTS;
41
+ private validateReferrerPolicy;
42
+ private validatePermissionsPolicy;
43
+ private validateXPermittedCrossDomainPolicies;
15
44
  }
16
45
  //# sourceMappingURL=missing-security-headers.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"missing-security-headers.d.ts","sourceRoot":"","sources":["../../src/rules/missing-security-headers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEhE,qBAAa,0BAA2B,SAAQ,QAAQ;IACtD,QAAQ,CAAC,IAAI,8BAA8B;IAC3C,QAAQ,CAAC,WAAW,2CAA2C;IAC/D,QAAQ,CAAC,QAAQ,EAAG,QAAQ,CAAU;IAEtC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAS9B;IAEF,OAAO,CAAC,QAAQ,CAAC,cAAc,CA4B7B;IAEF,KAAK,CAAC,WAAW,EAAE,WAAW,GAAG,aAAa,EAAE;IAiDhD,OAAO,CAAC,oBAAoB;IAmC5B,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,mBAAmB;IA2B3B,OAAO,CAAC,iBAAiB;IA0BzB,OAAO,CAAC,kBAAkB;IAiB1B,OAAO,CAAC,wBAAwB;CAqBjC"}
1
+ {"version":3,"file":"missing-security-headers.d.ts","sourceRoot":"","sources":["../../src/rules/missing-security-headers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,aAAa,EAAiB,MAAM,UAAU,CAAC;AAyB/E,qBAAa,0BAA2B,SAAQ,QAAQ;IACtD,QAAQ,CAAC,IAAI,8BAA8B;IAC3C,QAAQ,CAAC,WAAW,uEAAuE;IAC3F,QAAQ,CAAC,QAAQ,EAAG,QAAQ,CAAU;IAEtC,OAAO,CAAC,QAAQ,CAAC,eAAe,CA0D9B;IAEF,OAAO,CAAC,QAAQ,CAAC,cAAc,CA8I7B;IAEF,OAAO,CAAC,QAAQ,CAAC,YAAY,CAuC3B;IAEF,KAAK,CAAC,WAAW,EAAE,WAAW,GAAG,aAAa,EAAE;IA8ChD,OAAO,CAAC,cAAc;IAoBtB,OAAO,CAAC,WAAW;IAoBnB,OAAO,CAAC,UAAU;IAMlB,OAAO,CAAC,iBAAiB;IASzB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,iBAAiB;IAUzB,OAAO,CAAC,aAAa;IAkBrB,OAAO,CAAC,cAAc;IAiCtB,OAAO,CAAC,eAAe;IAqCvB,OAAO,CAAC,uBAAuB;IAwB/B,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,kBAAkB;cAIP,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,KAAK,EAAE,gBAAgB,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAwBvJ,OAAO,CAAC,mBAAmB;IAY3B,OAAO,CAAC,iBAAiB;IA6BzB,OAAO,CAAC,kBAAkB;IAiB1B,OAAO,CAAC,iBAAiB;IAezB,OAAO,CAAC,oBAAoB;IAkB5B,OAAO,CAAC,qBAAqB;IAoB7B,OAAO,CAAC,8BAA8B;IA+BtC,OAAO,CAAC,kCAAkC;IAkB1C,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,qBAAqB;IAI7B,OAAO,CAAC,2BAA2B;IAInC,OAAO,CAAC,sBAAsB;IAI9B,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,sBAAsB;IAI9B,OAAO,CAAC,yBAAyB;IAIjC,OAAO,CAAC,qCAAqC;CAK9C"}