feat(csp): add worker-src directive for ALTCHA proof-of-work in admin CSP

This commit is contained in:
hamed
2026-07-20 14:34:46 +03:30
parent a8d33ceeaf
commit 087683e877
3 changed files with 5 additions and 0 deletions
+1
View File
@@ -84,3 +84,4 @@ endpointهایی که وقتی `ALTCHA_ENABLED=true` است فیلد `altcha` ر
- انقضا (`ALTCHA_EXPIRE_SECONDS`) داخل salt امضاشده است.
- استفاده‌ی یک‌باره: signature هر challenge در pool اختصاصی Redis (`altcha.pool`) تا زمان انقضا نگه‌داری می‌شود → ضدِ replay.
- کپچا مکملِ rate-limit موجود است، نه جایگزین آن.
- **CSP:** widget حل proof-of-work را داخل Web Workerهای `blob:` انجام می‌دهد؛ CSP پنل ادمین (`AdminCspSubscriber`) باید `worker-src 'self' blob:` داشته باشد، وگرنه widget با `state=error` می‌ماند و کپچا هرگز حل نمی‌شود.
@@ -38,6 +38,7 @@ final class AdminCspSubscriber implements EventSubscriberInterface
'Content-Security-Policy',
"default-src 'self'; "
. "script-src 'self'; "
. "worker-src 'self' blob:; " // ALTCHA proof-of-work solver runs in blob: Web Workers
. "style-src 'self' 'unsafe-inline'; " // Tailwind / CKEditor inline styles
. "img-src 'self' data: blob:; "
. "font-src 'self' data:; "
+3
View File
@@ -20,6 +20,9 @@ class AdminCspSubscriberTest extends WebTestCase
self::assertStringContainsString("default-src 'self'", $csp);
self::assertStringContainsString("object-src 'none'", $csp);
self::assertStringContainsString("frame-ancestors 'none'", $csp);
// ALTCHA solves its proof-of-work inside blob: Web Workers; without this
// directive the login captcha errors out (worker-src falls back to script-src).
self::assertStringContainsString("worker-src 'self' blob:", $csp);
}
public function testNonAdminResponseDoesNotGetTheAdminCsp(): void