security: SRI Font Awesome, CSP restrictions, remove X-XSS-Protection, rate limiting
This commit is contained in:
@@ -0,0 +1,64 @@
|
||||
<?php
|
||||
/**
|
||||
* Tests unitaires pour checkRateLimit() (includes/security.php)
|
||||
*/
|
||||
|
||||
$rlDir = sys_get_temp_dir() . '/annu-kute-rl-test-' . getmypid();
|
||||
|
||||
// Nettoyage d'une éventuelle exécution précédente
|
||||
foreach (glob($rlDir . '/rl_*.json') ?: [] as $oldFile) {
|
||||
unlink($oldFile);
|
||||
}
|
||||
|
||||
// --- Limite de base -----------------------------------------------------------
|
||||
|
||||
$ip = '203.0.113.10';
|
||||
assertTrue(checkRateLimit($ip, 3, 60, $rlDir), 'rate limit : la 1re requête est autorisée');
|
||||
assertTrue(checkRateLimit($ip, 3, 60, $rlDir), 'rate limit : la 2e requête est autorisée');
|
||||
assertTrue(checkRateLimit($ip, 3, 60, $rlDir), 'rate limit : la 3e requête est autorisée');
|
||||
assertFalse(checkRateLimit($ip, 3, 60, $rlDir), 'rate limit : la 4e requête est refusée (limite 3)');
|
||||
assertFalse(checkRateLimit($ip, 3, 60, $rlDir), 'rate limit : une 5e requête reste refusée');
|
||||
|
||||
// --- Indépendance des identifiants --------------------------------------------
|
||||
|
||||
assertTrue(
|
||||
checkRateLimit('203.0.113.99', 3, 60, $rlDir),
|
||||
'rate limit : un autre identifiant a son propre compteur'
|
||||
);
|
||||
assertTrue(
|
||||
checkRateLimit($ip, 3, 60, $rlDir . '/autre'),
|
||||
'rate limit : un autre répertoire de stockage a son propre compteur'
|
||||
);
|
||||
|
||||
// --- Réinitialisation de la fenêtre -------------------------------------------
|
||||
|
||||
// Forcer l'expiration de la fenêtre en réécrivant le fichier d'état
|
||||
$stateFile = $rlDir . '/rl_' . hash('sha256', $ip) . '.json';
|
||||
assertTrue(file_exists($stateFile), 'rate limit : le fichier d\'état existe');
|
||||
file_put_contents($stateFile, json_encode(['count' => 3, 'reset' => time() - 1]));
|
||||
assertTrue(
|
||||
checkRateLimit($ip, 3, 60, $rlDir),
|
||||
'rate limit : le compteur repart à zéro après expiration de la fenêtre'
|
||||
);
|
||||
|
||||
// --- Fail-open si le stockage est indisponible ---------------------------------
|
||||
|
||||
// Un chemin qui est un fichier (pas un répertoire) : mkdir doit échouer
|
||||
$notADir = $rlDir . '/fichier-bloquant';
|
||||
file_put_contents($notADir, 'x');
|
||||
assertTrue(
|
||||
@checkRateLimit('198.51.100.5', 1, 60, $notADir),
|
||||
'rate limit : fail-open si le répertoire de stockage est indisponible'
|
||||
);
|
||||
|
||||
// --- Nettoyage -----------------------------------------------------------------
|
||||
|
||||
foreach ([$rlDir, $rlDir . '/autre'] as $dir) {
|
||||
foreach (glob($dir . '/rl_*.json') ?: [] as $file) {
|
||||
unlink($file);
|
||||
}
|
||||
if (is_dir($dir)) {
|
||||
rmdir($dir);
|
||||
}
|
||||
}
|
||||
unlink($notADir);
|
||||
Reference in New Issue
Block a user