32 lines
1 KiB
PHP
32 lines
1 KiB
PHP
|
|
<?php
|
||
|
|
|
||
|
|
namespace App\Http\Controllers;
|
||
|
|
|
||
|
|
use Illuminate\Http\Request;
|
||
|
|
use Illuminate\Http\Response;
|
||
|
|
use Illuminate\Support\Facades\Log;
|
||
|
|
use Illuminate\Support\Str;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Reçoit les violations de CSP envoyées par les navigateurs : c'est le seul
|
||
|
|
* moyen de savoir qu'une page casse chez un élève. Seuls quelques champs
|
||
|
|
* sont gardés, tronqués, sans la chaîne de requête des URL.
|
||
|
|
*/
|
||
|
|
class RapportCspController extends Controller
|
||
|
|
{
|
||
|
|
public function __invoke(Request $request): Response
|
||
|
|
{
|
||
|
|
$rapport = json_decode($request->getContent(), true)['csp-report'] ?? null;
|
||
|
|
|
||
|
|
if (is_array($rapport)) {
|
||
|
|
Log::warning('Violation CSP', [
|
||
|
|
'page' => Str::limit(strtok((string) ($rapport['document-uri'] ?? ''), '?'), 200),
|
||
|
|
'directive' => Str::limit((string) ($rapport['violated-directive'] ?? $rapport['effective-directive'] ?? ''), 100),
|
||
|
|
'bloque' => Str::limit(strtok((string) ($rapport['blocked-uri'] ?? ''), '?'), 200),
|
||
|
|
]);
|
||
|
|
}
|
||
|
|
|
||
|
|
return response()->noContent();
|
||
|
|
}
|
||
|
|
}
|