login  Naam:   Wachtwoord: 
Registreer je!
 Scripts:

Scripts > PHP > Beveiliging > .htpasswd generator

.htpasswd generator

Auteur: Thomas - 28 april 2006 - 15:09 - Gekeurd door: nemesiskoen - Hits: 11907 - Aantal punten: 3.92 (6 stemmen)




Dit script bevat een functie waarmee je een .htpasswd bestand kunt aanmaken of kunt updaten. De enige vereisten zijn dat je host Apache ondersteunt (anders werkt .htaccess / .htpasswd sowieso niet) en dat je schrijfrechten hebt in de folder waar je het .htpasswd-bestand wilt plaatsen.

Deze laatste eis is niet echt een harde: Je zou een .htpasswd-bestand kunnen maken/updaten in directory B (waar je wel schrijfrechten hebt) en deze vervolgens via FTP op de (eind)locatie A zetten (waar je geen schrijfrechten hebt).

De functie spreekt verder redelijk voor zich (deze is uitgebreid voorzien van commentaar).

Uiteraard moet je zorgen dat de aanroep van deze functie zelf beveiligd wordt ;).

Code:
De functie:
  1. <?php
  2. //! functie voor het toevoegen of bijwerken van gebruikersnamen/wachtwoorden in een .htpasswd-bestand
  3. /*!
  4. @param $file (string) volledig pad+naam van het .htpasswd-bestand
  5. @param $user (string) naam van de gebruiker die middels .htaccess/.htpasswd toegang krijgt tot een directory
  6. @param $pass (string) (nieuw) wachtwoord van $user - deze dient nog steeds zorgvuldig gekozen te worden
  7. @param $mode (int) schrijfmodus, 0=passwords van bestaande gebruikers readonly, 1=password overschrijfbaar, 2=verwijderen user (default 1)
  8. @param $die (bool) debug-mode; geeft aan of de functie moet stoppen op het moment dat er een fout optreedt (default false)
  9. @post .htpasswd-bestand is bijgewerkt of functie retourneert false (of wanneer $die op true staat wordt er een foutmelding gegeven)
  10. @return (bool) Geeft aan of deze functie succesvol is uitgevoerd - zoniet, controleer met $die = true wat er mis ging
  11. */
  12. function write_htpasswd($file, $user, $pass, $mode = 1, $die = false)
  13. {
  14. $ret = true; // geeft aan of de functie succesvol is uitgevoerd
  15.  
  16. if(@file_exists($file))
  17. {
  18. // lezen - verwijder regeleinden
  19. $contents = array_map("trim", file($file));
  20.  
  21. // genereren
  22. $hash = crypt($pass, CRYPT_STD_DES);
  23.  
  24. // regelnummer waarop $user voorkomt, indien van toepassing
  25. $line = -1;
  26.  
  27. // kwam de gebruikersnaam al voor in het .htpasswd-bestand?
  28. foreach($contents as $k => $v)
  29. {
  30. list($u, $p) = explode(":", $v);
  31. // gebruikersnaam is case-sensitive
  32. if(!strcmp($u, $user))
  33. {
  34. // zijn bestaande users read-only?
  35. if($mode == 0)
  36. {
  37. $ret = false;
  38. if($die) die("Gebruiker '".$user."' al bekend.");
  39. }
  40. // onthoud de regel waarop $user voorkwam
  41. $line = $k;
  42. // we zijn klaar met zoeken
  43. break;
  44. }
  45. }
  46.  
  47. // wachtwoord van bestaande gebruiker wijzigen
  48. if($line > -1 && $mode == 1)
  49. {
  50. // bekende gebruiker - mogelijk nieuw wachtwoord
  51. $contents[$line] = $user.":".$hash;
  52. }
  53.  
  54. // nieuwe gebruiker toevoegen
  55. if($line == -1 && ($mode == 0 || $mode == 1))
  56. {
  57. // onbekende gebruiker - nieuwe regel
  58. $contents[] = $user.":".$hash;
  59. }
  60.  
  61. // gebruiker verwijderen - een niet-bestaande gebruiker proberen te verwijderen is in principe niet fout :)
  62. if($line > -1 && $mode == 2)
  63. {
  64. unset($contents[$line]);
  65. }
  66.  
  67. // debug - de inhoud die geschreven gaat worden
  68. // echo "<pre>".print_r($contents, 1)."</pre>";
  69.  
  70. // schrijven (alleen als er tot nu toe nog niets is fout gegaan)
  71. if($ret)
  72. {
  73. // controleer of je kunt schrijven
  74. if(is_writable($file))
  75. {
  76. // als dit blok wordt uitgevoerd, kan er in feite niets meer verkeerd gaan
  77. // je zou hier nog kunnen kijken of deze operaties fout gaan, maar dat zou
  78. // niet mogelijk moeten zijn
  79. $handle = fopen($file, "wt");
  80. fwrite($handle, implode("\n", $contents));
  81. fclose($handle);
  82. }
  83. else
  84. {
  85. $ret = false;
  86. if($die) die("Er kan niet worden geschreven naar '".htmlentities($file)."'.");
  87. }
  88. }
  89. }
  90. else
  91. {
  92. $ret = false;
  93. if($die) die("Bestand '".htmlentities($file)."' niet gevonden.");
  94. }
  95.  
  96. // retourneer een boolean die aangeeft of het .htpasswd-bestand succesvol is aangepast
  97. return $ret;
  98. }
  99. ?>


Voorbeeld van gebruik:
  1. <?php
  2. // we gaan er van uit dat we schrijfrechten hebben in $src
  3. $src = $_SERVER['DOCUMENT_ROOT']."/.htpasswd";
  4.  
  5. // maak het bestand aan als deze nog niet bestond
  6. touch($src);
  7.  
  8. // maak gebruiker "test" aan, met pwd "hoi"
  9. write_htpasswd($src, "test", "hoi");
  10.  
  11. // wijzig het wachtwoord van de gebruiker "test" in "hoi2"
  12. write_htpasswd($src, "test", "hoi2");
  13.  
  14. // verwijder gebruiker "test"
  15. write_htpasswd($src, "test", "", 2);
  16.  
  17. // maak gebruiker "test2" aan, met pwd "blaat"
  18. write_htpasswd($src, "test2", "blaat");
  19.  
  20. // probeer een wachtwoord te veranderen in readonly-mode
  21. // als je de functie in debug mode draait (zoals hier gebeurt) krijg je een foutmelding
  22. write_htpasswd($src, "test2", "blabla", 0, true);
  23. ?>
Download code! Download code (.txt)

 Stemmen
Niet ingelogd.

 Reacties
Post een reactie
Lees de reacties (3)
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.043s