65 lines
2.4 KiB
PHP
65 lines
2.4 KiB
PHP
<?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);
|