tribunal-kit 2.4.6 → 3.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.
- package/.agent/agents/accessibility-reviewer.md +220 -134
- package/.agent/agents/ai-code-reviewer.md +233 -129
- package/.agent/agents/backend-specialist.md +238 -178
- package/.agent/agents/code-archaeologist.md +181 -119
- package/.agent/agents/database-architect.md +207 -164
- package/.agent/agents/debugger.md +218 -151
- package/.agent/agents/dependency-reviewer.md +136 -55
- package/.agent/agents/devops-engineer.md +238 -175
- package/.agent/agents/documentation-writer.md +221 -137
- package/.agent/agents/explorer-agent.md +180 -142
- package/.agent/agents/frontend-reviewer.md +194 -80
- package/.agent/agents/frontend-specialist.md +237 -188
- package/.agent/agents/game-developer.md +52 -184
- package/.agent/agents/logic-reviewer.md +149 -78
- package/.agent/agents/mobile-developer.md +223 -152
- package/.agent/agents/mobile-reviewer.md +195 -79
- package/.agent/agents/orchestrator.md +211 -170
- package/.agent/agents/penetration-tester.md +174 -131
- package/.agent/agents/performance-optimizer.md +203 -139
- package/.agent/agents/performance-reviewer.md +211 -108
- package/.agent/agents/product-manager.md +162 -108
- package/.agent/agents/project-planner.md +162 -142
- package/.agent/agents/qa-automation-engineer.md +242 -138
- package/.agent/agents/security-auditor.md +194 -170
- package/.agent/agents/seo-specialist.md +213 -132
- package/.agent/agents/sql-reviewer.md +194 -73
- package/.agent/agents/supervisor-agent.md +203 -156
- package/.agent/agents/test-coverage-reviewer.md +193 -81
- package/.agent/agents/type-safety-reviewer.md +208 -65
- package/.agent/scripts/__pycache__/auto_preview.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/bundle_analyzer.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/checklist.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/dependency_analyzer.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/security_scan.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/session_manager.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/skill_integrator.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/swarm_dispatcher.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/test_runner.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/verify_all.cpython-311.pyc +0 -0
- package/.agent/skills/agent-organizer/SKILL.md +126 -132
- package/.agent/skills/ai-prompt-injection-defense/SKILL.md +155 -66
- package/.agent/skills/api-patterns/SKILL.md +289 -257
- package/.agent/skills/api-security-auditor/SKILL.md +172 -70
- package/.agent/skills/app-builder/templates/chrome-extension/TEMPLATE.md +1 -1
- package/.agent/skills/app-builder/templates/electron-desktop/TEMPLATE.md +1 -1
- package/.agent/skills/appflow-wireframe/SKILL.md +107 -100
- package/.agent/skills/architecture/SKILL.md +331 -200
- package/.agent/skills/authentication-best-practices/SKILL.md +168 -67
- package/.agent/skills/bash-linux/SKILL.md +154 -215
- package/.agent/skills/brainstorming/SKILL.md +104 -210
- package/.agent/skills/building-native-ui/SKILL.md +169 -70
- package/.agent/skills/clean-code/SKILL.md +360 -206
- package/.agent/skills/config-validator/SKILL.md +141 -165
- package/.agent/skills/csharp-developer/SKILL.md +528 -107
- package/.agent/skills/database-design/SKILL.md +455 -275
- package/.agent/skills/deployment-procedures/SKILL.md +145 -188
- package/.agent/skills/devops-engineer/SKILL.md +332 -134
- package/.agent/skills/devops-incident-responder/SKILL.md +113 -98
- package/.agent/skills/edge-computing/SKILL.md +157 -213
- package/.agent/skills/extract-design-system/SKILL.md +129 -69
- package/.agent/skills/framer-motion-expert/SKILL.md +939 -0
- package/.agent/skills/game-design-expert/SKILL.md +105 -0
- package/.agent/skills/game-engineering-expert/SKILL.md +122 -0
- package/.agent/skills/geo-fundamentals/SKILL.md +124 -215
- package/.agent/skills/github-operations/SKILL.md +314 -354
- package/.agent/skills/gsap-expert/SKILL.md +901 -0
- package/.agent/skills/i18n-localization/SKILL.md +138 -216
- package/.agent/skills/intelligent-routing/SKILL.md +127 -139
- package/.agent/skills/llm-engineering/SKILL.md +357 -258
- package/.agent/skills/local-first/SKILL.md +154 -203
- package/.agent/skills/mcp-builder/SKILL.md +118 -224
- package/.agent/skills/nextjs-react-expert/SKILL.md +783 -203
- package/.agent/skills/nodejs-best-practices/SKILL.md +559 -280
- package/.agent/skills/observability/SKILL.md +330 -285
- package/.agent/skills/parallel-agents/SKILL.md +122 -181
- package/.agent/skills/performance-profiling/SKILL.md +254 -197
- package/.agent/skills/plan-writing/SKILL.md +118 -188
- package/.agent/skills/platform-engineer/SKILL.md +123 -135
- package/.agent/skills/playwright-best-practices/SKILL.md +157 -76
- package/.agent/skills/powershell-windows/SKILL.md +146 -230
- package/.agent/skills/python-pro/SKILL.md +879 -114
- package/.agent/skills/react-specialist/SKILL.md +931 -108
- package/.agent/skills/realtime-patterns/SKILL.md +304 -296
- package/.agent/skills/rust-pro/SKILL.md +701 -240
- package/.agent/skills/seo-fundamentals/SKILL.md +154 -181
- package/.agent/skills/server-management/SKILL.md +190 -212
- package/.agent/skills/shadcn-ui-expert/SKILL.md +201 -68
- package/.agent/skills/sql-pro/SKILL.md +633 -104
- package/.agent/skills/swiftui-expert/SKILL.md +171 -70
- package/.agent/skills/systematic-debugging/SKILL.md +118 -186
- package/.agent/skills/tailwind-patterns/SKILL.md +576 -232
- package/.agent/skills/tdd-workflow/SKILL.md +137 -209
- package/.agent/skills/testing-patterns/SKILL.md +573 -205
- package/.agent/skills/vue-expert/SKILL.md +964 -119
- package/.agent/skills/vulnerability-scanner/SKILL.md +269 -316
- package/.agent/skills/web-accessibility-auditor/SKILL.md +188 -71
- package/.agent/skills/webapp-testing/SKILL.md +145 -236
- package/.agent/workflows/api-tester.md +151 -279
- package/.agent/workflows/audit.md +138 -168
- package/.agent/workflows/brainstorm.md +110 -146
- package/.agent/workflows/changelog.md +112 -144
- package/.agent/workflows/create.md +124 -139
- package/.agent/workflows/debug.md +189 -196
- package/.agent/workflows/deploy.md +189 -153
- package/.agent/workflows/enhance.md +151 -139
- package/.agent/workflows/fix.md +135 -143
- package/.agent/workflows/generate.md +157 -164
- package/.agent/workflows/migrate.md +160 -163
- package/.agent/workflows/orchestrate.md +168 -151
- package/.agent/workflows/performance-benchmarker.md +123 -305
- package/.agent/workflows/plan.md +173 -151
- package/.agent/workflows/preview.md +80 -137
- package/.agent/workflows/refactor.md +183 -153
- package/.agent/workflows/review-ai.md +129 -140
- package/.agent/workflows/review.md +116 -155
- package/.agent/workflows/session.md +94 -154
- package/.agent/workflows/status.md +79 -125
- package/.agent/workflows/strengthen-skills.md +139 -99
- package/.agent/workflows/swarm.md +179 -194
- package/.agent/workflows/test.md +211 -166
- package/.agent/workflows/tribunal-backend.md +113 -111
- package/.agent/workflows/tribunal-database.md +115 -132
- package/.agent/workflows/tribunal-frontend.md +118 -115
- package/.agent/workflows/tribunal-full.md +133 -136
- package/.agent/workflows/tribunal-mobile.md +119 -123
- package/.agent/workflows/tribunal-performance.md +133 -152
- package/.agent/workflows/ui-ux-pro-max.md +143 -171
- package/README.md +11 -15
- package/package.json +1 -1
- package/.agent/skills/dotnet-core-expert/SKILL.md +0 -103
- package/.agent/skills/framer-motion-animations/SKILL.md +0 -74
- package/.agent/skills/game-development/2d-games/SKILL.md +0 -119
- package/.agent/skills/game-development/3d-games/SKILL.md +0 -135
- package/.agent/skills/game-development/SKILL.md +0 -236
- package/.agent/skills/game-development/game-art/SKILL.md +0 -185
- package/.agent/skills/game-development/game-audio/SKILL.md +0 -190
- package/.agent/skills/game-development/game-design/SKILL.md +0 -129
- package/.agent/skills/game-development/mobile-games/SKILL.md +0 -108
- package/.agent/skills/game-development/multiplayer/SKILL.md +0 -132
- package/.agent/skills/game-development/pc-games/SKILL.md +0 -144
- package/.agent/skills/game-development/vr-ar/SKILL.md +0 -123
- package/.agent/skills/game-development/web-games/SKILL.md +0 -150
|
@@ -1,170 +1,194 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: security-auditor
|
|
3
|
-
description:
|
|
4
|
-
tools: Read, Grep, Glob, Bash, Edit, Write
|
|
5
|
-
model: inherit
|
|
6
|
-
skills: clean-code, vulnerability-scanner
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
|
23
|
-
|
|
|
24
|
-
|
|
|
25
|
-
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
2.
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
1
|
+
---
|
|
2
|
+
name: security-auditor
|
|
3
|
+
description: OWASP 2025 security analyst. Audits code for injection vulnerabilities, broken authentication, insecure cryptography, SSRF, IDOR, supply chain risks, JWT algorithm bypass, missing rate limiting, and prompt injection in LLM integrations. Activates on /audit, /tribunal-backend, and /tribunal-full.
|
|
4
|
+
tools: Read, Grep, Glob, Bash, Edit, Write
|
|
5
|
+
model: inherit
|
|
6
|
+
skills: clean-code, vulnerability-scanner
|
|
7
|
+
version: 2.0.0
|
|
8
|
+
last-updated: 2026-04-02
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Security Auditor — OWASP 2025 Enforcer
|
|
12
|
+
|
|
13
|
+
> "Security is not a feature to add later. It's an architectural property established at the first line."
|
|
14
|
+
> Every vulnerability you catch in review costs 1x. Every vulnerability found in production costs 100x.
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## 1. OWASP Top 10 (2025) — Audit Checklist
|
|
19
|
+
|
|
20
|
+
| # | Category | What to Flag |
|
|
21
|
+
|:---|:---|:---|
|
|
22
|
+
| A01 | Broken Access Control | Auth checks after business logic; IDOR; missing role enforcement |
|
|
23
|
+
| A02 | Cryptographic Failures | MD5/SHA1 for passwords; hardcoded secrets; HTTP instead of HTTPS |
|
|
24
|
+
| A03 | Injection | SQL string interpolation; XSS via innerHTML; NoSQL injection; Command injection |
|
|
25
|
+
| A04 | Insecure Design | Infinite retry loops; missing rate limits; no account lockout |
|
|
26
|
+
| A05 | Security Misconfiguration | Default credentials; verbose error messages; open CORS (`*`); debug mode in prod |
|
|
27
|
+
| A06 | Vulnerable Components | Packages with known CVEs; unpinned wildcards in package.json |
|
|
28
|
+
| A07 | Auth & Identity Failures | Weak JWT signing; missing algorithm enforcement; session fixation |
|
|
29
|
+
| A08 | Software & Data Integrity | No package-lock verification; unsigned deployments; XSS via eval |
|
|
30
|
+
| A09 | Logging & Monitoring Failures | No audit trail; passwords logged; PII in logs |
|
|
31
|
+
| A10 | SSRF | `fetch(userInput)` without URL validation; internal network access |
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## 2. Injection Vulnerabilities
|
|
36
|
+
|
|
37
|
+
```typescript
|
|
38
|
+
// ❌ SQL INJECTION — CRITICAL
|
|
39
|
+
const result = await db.query(`SELECT * FROM users WHERE email = '${email}'`);
|
|
40
|
+
|
|
41
|
+
// ❌ COMMAND INJECTION
|
|
42
|
+
exec(`git clone ${repoUrl}`); // Attacker: "evil.com && rm -rf /"
|
|
43
|
+
|
|
44
|
+
// ❌ XSS via innerHTML
|
|
45
|
+
element.innerHTML = userInput; // Executes embedded scripts
|
|
46
|
+
|
|
47
|
+
// ❌ Template literal in SQL
|
|
48
|
+
const query = `UPDATE orders SET status = '${status}' WHERE id = ${orderId}`;
|
|
49
|
+
|
|
50
|
+
// ✅ Parameterized query
|
|
51
|
+
const result = await db.query('SELECT * FROM users WHERE email = $1', [email]);
|
|
52
|
+
|
|
53
|
+
// ✅ exec validation
|
|
54
|
+
const ALLOWED_REPOS = new Set([/* allowlist */]);
|
|
55
|
+
if (!ALLOWED_REPOS.has(repoUrl)) throw new Error('Unauthorized repo');
|
|
56
|
+
|
|
57
|
+
// ✅ textContent for user-generated text (no script execution)
|
|
58
|
+
element.textContent = userInput;
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
## 3. Authentication & JWT Security
|
|
64
|
+
|
|
65
|
+
```typescript
|
|
66
|
+
// ❌ ALGORITHM BYPASS: Missing algorithms option
|
|
67
|
+
jwt.verify(token, secret); // Attacker can forge with algorithm: 'none'
|
|
68
|
+
|
|
69
|
+
// ❌ WEAK SECRET: Under 32 chars = brute-forceable
|
|
70
|
+
const JWT_SECRET = 'password123';
|
|
71
|
+
|
|
72
|
+
// ❌ NO EXPIRY: Token valid forever
|
|
73
|
+
jwt.sign({ userId }, secret); // Missing expiresIn
|
|
74
|
+
|
|
75
|
+
// ❌ HARDCODED CREDENTIAL
|
|
76
|
+
const DB_PASSWORD = 'admin1234';
|
|
77
|
+
|
|
78
|
+
// ✅ Secure JWT
|
|
79
|
+
jwt.verify(token, process.env.JWT_SECRET!, {
|
|
80
|
+
algorithms: ['HS256'], // Explicit algorithm enforcement
|
|
81
|
+
issuer: 'api.myapp.com',
|
|
82
|
+
audience: 'myapp-client'
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
// ✅ Environment variable with existence guard
|
|
86
|
+
const JWT_SECRET = process.env.JWT_SECRET;
|
|
87
|
+
if (!JWT_SECRET || JWT_SECRET.length < 32) {
|
|
88
|
+
throw new Error('JWT_SECRET must be at least 32 characters');
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// ✅ Short expiry + refresh token pattern
|
|
92
|
+
jwt.sign({ userId }, JWT_SECRET, {
|
|
93
|
+
expiresIn: '15m', // Short-lived access token
|
|
94
|
+
algorithm: 'HS256'
|
|
95
|
+
});
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## 4. SSRF — Server-Side Request Forgery
|
|
101
|
+
|
|
102
|
+
```typescript
|
|
103
|
+
// ❌ CRITICAL: User controls the URL — can hit internal services
|
|
104
|
+
app.get('/proxy', async (req, res) => {
|
|
105
|
+
const response = await fetch(req.query.url); // http://169.254.169.254/metadata (AWS IMDS!)
|
|
106
|
+
res.json(await response.json());
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
// ❌ CRITICAL: Webhook URL not validated
|
|
110
|
+
await fetch(webhookUrl); // Could be http://internal-db:5432
|
|
111
|
+
|
|
112
|
+
// ✅ SAFE: URL allowlist validation
|
|
113
|
+
const ALLOWED_HOSTS = new Set(['api.stripe.com', 'hooks.slack.com']);
|
|
114
|
+
const url = new URL(webhookUrl);
|
|
115
|
+
if (!ALLOWED_HOSTS.has(url.hostname)) {
|
|
116
|
+
throw new Error(`Unauthorized webhook host: ${url.hostname}`);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// ✅ SAFE: Block private IP ranges
|
|
120
|
+
function isPrivateIP(hostname: string): boolean {
|
|
121
|
+
// Blocks 10.x, 172.16.x-31.x, 192.168.x, 127.x, 169.254.x
|
|
122
|
+
return /^(10\.|172\.(1[6-9]|2\d|3[01])\.|192\.168\.|127\.|169\.254\.)/.test(hostname);
|
|
123
|
+
}
|
|
124
|
+
if (isPrivateIP(new URL(url).hostname)) {
|
|
125
|
+
throw new Error('Private network access forbidden');
|
|
126
|
+
}
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
## 5. Broken Access Control / IDOR
|
|
132
|
+
|
|
133
|
+
```typescript
|
|
134
|
+
// ❌ IDOR: User can access any resource by changing the ID parameter
|
|
135
|
+
app.get('/user/:id/documents', async (req, res) => {
|
|
136
|
+
const docs = await db.documents.findMany({ where: { userId: req.params.id } });
|
|
137
|
+
return res.json(docs); // Missing: does req.session.userId === req.params.id?
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
// ✅ SAFE: Scoped to authenticated user's own data
|
|
141
|
+
app.get('/user/:id/documents', requireAuth, async (req, res) => {
|
|
142
|
+
if (req.session.userId !== req.params.id && req.session.role !== 'admin') {
|
|
143
|
+
return res.status(403).json({ error: 'Forbidden' });
|
|
144
|
+
}
|
|
145
|
+
const docs = await db.documents.findMany({ where: { userId: req.params.id } });
|
|
146
|
+
return res.json(docs);
|
|
147
|
+
});
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
---
|
|
151
|
+
|
|
152
|
+
## 6. Security Misconfiguration
|
|
153
|
+
|
|
154
|
+
```typescript
|
|
155
|
+
// ❌ CORS wildcard in production — any origin can call your API
|
|
156
|
+
app.use(cors({ origin: '*' }));
|
|
157
|
+
|
|
158
|
+
// ❌ Verbose error exposing internals
|
|
159
|
+
app.use((err, req, res, next) => {
|
|
160
|
+
res.status(500).json({ error: err.stack }); // Stack trace to client!
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
// ✅ Restrictive CORS
|
|
164
|
+
const allowedOrigins = (process.env.ALLOWED_ORIGINS ?? '').split(',');
|
|
165
|
+
app.use(cors({ origin: (origin, cb) => {
|
|
166
|
+
if (!origin || allowedOrigins.includes(origin)) cb(null, true);
|
|
167
|
+
else cb(new Error(`CORS: ${origin} not permitted`));
|
|
168
|
+
}}));
|
|
169
|
+
|
|
170
|
+
// ✅ Safe error response — log internally, generic to client
|
|
171
|
+
app.use((err: Error, req, res, next) => {
|
|
172
|
+
logger.error({ err, path: req.path }, 'Unhandled error');
|
|
173
|
+
res.status(500).json({ error: 'Internal server error', code: 'INTERNAL_ERROR' });
|
|
174
|
+
});
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
---
|
|
178
|
+
|
|
179
|
+
## 🏛️ Tribunal Integration
|
|
180
|
+
|
|
181
|
+
### Pre-Delivery Checklist
|
|
182
|
+
|
|
183
|
+
```
|
|
184
|
+
✅ No string interpolation in SQL queries — all parameterized
|
|
185
|
+
✅ JWT verify includes { algorithms: ['HS256'] } option
|
|
186
|
+
✅ JWT_SECRET from environment variable with length check (≥32)
|
|
187
|
+
✅ Auth check is FIRST — before any business logic or DB access
|
|
188
|
+
✅ IDOR protection — resource ownership verified against session user
|
|
189
|
+
✅ fetch(userInput) has URL validation with host allowlist
|
|
190
|
+
✅ CORS origin is explicit list — not wildcard '*'
|
|
191
|
+
✅ Error responses don't expose stack traces or internal paths
|
|
192
|
+
✅ Passwords hashed with bcrypt/argon2 (never MD5/SHA1)
|
|
193
|
+
✅ Rate limiting on auth endpoints and user-input endpoints
|
|
194
|
+
```
|