تكرار السؤال: …
الإجابة المختصرة
بتوليد رمز عشوائي (Nonce) فريد لكل طلب HTTP وتمريره في ترويسة CSP وإدراجه في وسوم <script nonce="..."> لحظر تنفيذ أي سكريبتات محقونة.
الشرح
تعد CSP أقوى دفاع ضد هجمات XSS المتقدمة. عند استخدام الـ Nonce، يرفض المتصفح تنفيذ أي سكريبت لا يحمل نفس الرمز العشوائي للترويسة، حتى لو نجح المهاجم في حقن وسم <script> في الصفحة. توفر مكتبات مثل spatie/laravel-csp دعماً متكاملاً لإدارة الترويسات وتوليد الـ Nonce ومشاركته تلقائياً مع قوالب Blade.
مثال بالكود
<?php
// composer require spatie/laravel-csp (csp_nonce() comes from this package; it is not built into Laravel)
// app/Support/CspPolicy.php
namespace App\Support;
use Spatie\Csp\Directive;
use Spatie\Csp\Keyword;
use Spatie\Csp\Policies\Basic;
class CspPolicy extends Basic
{
public function configure()
{
parent::configure(); // Basic adds a per-request nonce to script-src and style-src
$this->addDirective(Directive::SCRIPT, Keyword::STRICT_DYNAMIC);
}
}
// config/csp.php → 'policy' => App\Support\CspPolicy::class
// bootstrap/app.php → $middleware->web(append: [\Spatie\Csp\AddCspHeaders::class]);
// resources/views/layout.blade.php
// <script nonce="{{ csp_nonce() }}">console.log("Allowed script");</script>
// Resulting header:
// Content-Security-Policy: script-src 'self' 'nonce-Xy7...' 'strict-dynamic'أخطاء شائعة
- استخدام 'unsafe-inline' في ترويسة CSP مما يلغي الحماية ضد هجمات XSS تماماً.