test-security.php 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. <?php
  2. /**
  3. * Script de test pour la sécurisation des sessions et CSRF
  4. *
  5. * Ce script permet de vérifier que toutes les fonctionnalités de sécurité
  6. * sont correctement implémentées.
  7. *
  8. * ⚠️ À SUPPRIMER EN PRODUCTION
  9. */
  10. require_once "../env.inc.php";
  11. // Test 1 : Démarrage de session sécurisée
  12. echo "=== TEST 1 : Démarrage session sécurisée ===\n";
  13. try {
  14. $started = secureSession::start();
  15. echo $started ? "✅ Session démarrée avec succès\n" : "❌ Échec démarrage session\n";
  16. } catch (Exception $e) {
  17. echo "❌ Erreur : " . $e->getMessage() . "\n";
  18. }
  19. // Test 2 : Informations de sécurité de la session
  20. echo "\n=== TEST 2 : Informations de sécurité ===\n";
  21. try {
  22. $info = secureSession::getSecurityInfo();
  23. echo "✅ Session ID : " . substr($info['session_id'], 0, 10) . "...\n";
  24. echo "✅ Session Name : " . $info['session_name'] . "\n";
  25. echo "✅ HTTPS : " . ($info['is_https'] ? 'Oui' : 'Non') . "\n";
  26. echo "✅ HttpOnly : " . ($info['cookie_params']['httponly'] ? 'Oui' : 'Non') . "\n";
  27. echo "✅ Secure : " . ($info['cookie_params']['secure'] ? 'Oui' : 'Non') . "\n";
  28. echo "✅ SameSite : " . $info['cookie_params']['samesite'] . "\n";
  29. } catch (Exception $e) {
  30. echo "❌ Erreur : " . $e->getMessage() . "\n";
  31. }
  32. // Test 3 : Génération de tokens CSRF
  33. echo "\n=== TEST 3 : Génération tokens CSRF ===\n";
  34. try {
  35. $token1 = csrf::generateToken('test-form-1');
  36. $token2 = csrf::generateToken('test-form-2');
  37. echo "✅ Token 1 généré : " . substr($token1, 0, 16) . "...\n";
  38. echo "✅ Token 2 généré : " . substr($token2, 0, 16) . "...\n";
  39. echo ($token1 !== $token2) ? "✅ Les tokens sont différents\n" : "❌ Les tokens sont identiques (problème)\n";
  40. } catch (Exception $e) {
  41. echo "❌ Erreur : " . $e->getMessage() . "\n";
  42. }
  43. // Test 4 : Validation de token CSRF
  44. echo "\n=== TEST 4 : Validation token CSRF ===\n";
  45. try {
  46. $testToken = csrf::generateToken('validation-test');
  47. $isValid = csrf::validateToken($testToken, 'validation-test');
  48. echo $isValid ? "✅ Validation token réussie\n" : "❌ Validation token échouée\n";
  49. // Le token devrait être supprimé après validation
  50. $isValidAgain = csrf::validateToken($testToken, 'validation-test');
  51. echo !$isValidAgain ? "✅ Token correctement supprimé après validation\n" : "❌ Token pas supprimé (problème)\n";
  52. } catch (Exception $e) {
  53. echo "❌ Erreur : " . $e->getMessage() . "\n";
  54. }
  55. // Test 5 : Génération HTML pour formulaires
  56. echo "\n=== TEST 5 : Génération HTML ===\n";
  57. try {
  58. $inputField = csrf::inputField('html-test');
  59. echo "✅ Input field généré : " . htmlspecialchars($inputField) . "\n";
  60. $metaTag = csrf::metaTag('ajax-test');
  61. echo "✅ Meta tag généré : " . htmlspecialchars($metaTag) . "\n";
  62. } catch (Exception $e) {
  63. echo "❌ Erreur : " . $e->getMessage() . "\n";
  64. }
  65. // Test 6 : Statistiques CSRF
  66. echo "\n=== TEST 6 : Statistiques CSRF ===\n";
  67. try {
  68. // Générer quelques tokens
  69. csrf::generateToken('form-a');
  70. csrf::generateToken('form-b');
  71. csrf::generateToken('form-c');
  72. $stats = csrf::getStats();
  73. echo "✅ Nombre de tokens actifs : " . $stats['count'] . "\n";
  74. foreach ($stats['forms'] as $formName => $info) {
  75. echo " - $formName : âge = {$info['age']}s, créé le {$info['created_at']}\n";
  76. }
  77. } catch (Exception $e) {
  78. echo "❌ Erreur : " . $e->getMessage() . "\n";
  79. }
  80. // Test 7 : Nettoyage des tokens expirés
  81. echo "\n=== TEST 7 : Nettoyage tokens expirés ===\n";
  82. try {
  83. // Tous les tokens ont été créés il y a moins d'1 seconde
  84. $removed = csrf::cleanExpiredTokens(1); // Expiration après 1 seconde
  85. sleep(2); // Attendre 2 secondes
  86. $removed = csrf::cleanExpiredTokens(1);
  87. echo "✅ Tokens expirés supprimés : $removed\n";
  88. } catch (Exception $e) {
  89. echo "❌ Erreur : " . $e->getMessage() . "\n";
  90. }
  91. // Test 8 : Régénération ID de session
  92. echo "\n=== TEST 8 : Régénération ID de session ===\n";
  93. try {
  94. $oldId = session_id();
  95. $regenerated = secureSession::regenerateId();
  96. $newId = session_id();
  97. echo $regenerated ? "✅ Régénération réussie\n" : "❌ Échec régénération\n";
  98. echo ($oldId !== $newId) ? "✅ L'ID a bien changé\n" : "❌ L'ID n'a pas changé (problème)\n";
  99. echo " Ancien : " . substr($oldId, 0, 10) . "...\n";
  100. echo " Nouveau : " . substr($newId, 0, 10) . "...\n";
  101. } catch (Exception $e) {
  102. echo "❌ Erreur : " . $e->getMessage() . "\n";
  103. }
  104. // Test 9 : Timeout d'inactivité
  105. echo "\n=== TEST 9 : Timeout d'inactivité ===\n";
  106. try {
  107. $isValid = secureSession::setInactivityTimeout(30); // 30 minutes
  108. echo $isValid ? "✅ Timeout configuré (30 minutes)\n" : "❌ Échec configuration timeout\n";
  109. // Vérifier via la méthode session
  110. $checkTimeout = session::checkTimeout(30);
  111. echo $checkTimeout ? "✅ Session active (dans le timeout)\n" : "❌ Session expirée\n";
  112. } catch (Exception $e) {
  113. echo "❌ Erreur : " . $e->getMessage() . "\n";
  114. }
  115. // Test 10 : Variables de session
  116. echo "\n=== TEST 10 : Variables de session ===\n";
  117. try {
  118. echo "Variables de sécurité présentes :\n";
  119. echo isset($_SESSION['_session_created']) ? "✅ _session_created\n" : "❌ _session_created manquante\n";
  120. echo isset($_SESSION['_session_ip']) ? "✅ _session_ip : {$_SESSION['_session_ip']}\n" : "❌ _session_ip manquante\n";
  121. echo isset($_SESSION['_session_user_agent']) ? "✅ _session_user_agent\n" : "❌ _session_user_agent manquante\n";
  122. echo isset($_SESSION['_session_last_activity']) ? "✅ _session_last_activity\n" : "❌ _session_last_activity manquante\n";
  123. } catch (Exception $e) {
  124. echo "❌ Erreur : " . $e->getMessage() . "\n";
  125. }
  126. // Résumé final
  127. echo "\n" . str_repeat("=", 50) . "\n";
  128. echo "✅ Tests terminés avec succès !\n";
  129. echo "Les fonctionnalités de sécurité sont opérationnelles.\n";
  130. echo str_repeat("=", 50) . "\n";
  131. echo "\n⚠️ N'OUBLIEZ PAS DE SUPPRIMER CE FICHIER EN PRODUCTION !\n";