Auteur: Thomas - 28 april 2006 - 15:09 - Gekeurd door: nemesiskoen - Hits: 12036 - 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 ;).
<?php
//! functie voor het toevoegen of bijwerken van gebruikersnamen/wachtwoorden in een .htpasswd-bestand
/*!
@param $file (string) volledig pad+naam van het .htpasswd-bestand
@param $user (string) naam van de gebruiker die middels .htaccess/.htpasswd toegang krijgt tot een directory
@param $pass (string) (nieuw) wachtwoord van $user - deze dient nog steeds zorgvuldig gekozen te worden
@param $mode (int) schrijfmodus, 0=passwords van bestaande gebruikers readonly, 1=password overschrijfbaar, 2=verwijderen user (default 1)
@param $die (bool) debug-mode; geeft aan of de functie moet stoppen op het moment dat er een fout optreedt (default false)
@post .htpasswd-bestand is bijgewerkt of functie retourneert false (of wanneer $die op true staat wordt er een foutmelding gegeven)
@return (bool) Geeft aan of deze functie succesvol is uitgevoerd - zoniet, controleer met $die = true wat er mis ging
*/
function write_htpasswd($file, $user, $pass, $mode = 1, $die = false)
{
$ret = true; // geeft aan of de functie succesvol is uitgevoerd
if(@file_exists($file))
{
// lezen - verwijder regeleinden
$contents = array_map("trim", file($file));
// genereren
$hash = crypt($pass, CRYPT_STD_DES);
// regelnummer waarop $user voorkomt, indien van toepassing
$line = -1;
// kwam de gebruikersnaam al voor in het .htpasswd-bestand?
foreach($contents as $k => $v)
{
list($u, $p) = explode(":", $v);
// gebruikersnaam is case-sensitive
if(!strcmp($u, $user))
{
// zijn bestaande users read-only?
if($mode == 0)
{
$ret = false;
if($die) die("Gebruiker '".$user."' al bekend.");
}
// onthoud de regel waarop $user voorkwam
$line = $k;
// we zijn klaar met zoeken
break;
}
}
// wachtwoord van bestaande gebruiker wijzigen
if($line > -1 && $mode == 1)
{
// bekende gebruiker - mogelijk nieuw wachtwoord
$contents[$line] = $user.":".$hash;
}
// nieuwe gebruiker toevoegen
if($line == -1 && ($mode == 0 || $mode == 1))
{
// onbekende gebruiker - nieuwe regel
$contents[] = $user.":".$hash;
}
// gebruiker verwijderen - een niet-bestaande gebruiker proberen te verwijderen is in principe niet fout :)
if($line > -1 && $mode == 2)
{
unset($contents[$line]);
}
// debug - de inhoud die geschreven gaat worden
// echo "<pre>".print_r($contents, 1)."</pre>";
// schrijven (alleen als er tot nu toe nog niets is fout gegaan)
if($ret)
{
// controleer of je kunt schrijven
if(is_writable($file))
{
// als dit blok wordt uitgevoerd, kan er in feite niets meer verkeerd gaan
// je zou hier nog kunnen kijken of deze operaties fout gaan, maar dat zou
// niet mogelijk moeten zijn
$handle = fopen($file, "wt");
fwrite($handle, implode("\n", $contents));
fclose($handle);
}
else
{
$ret = false;
if($die) die("Er kan niet worden geschreven naar '".htmlentities($file)."'.");
}
}
}
else
{
$ret = false;
if($die) die("Bestand '".htmlentities($file)."' niet gevonden.");
}
// retourneer een boolean die aangeeft of het .htpasswd-bestand succesvol is aangepast
return $ret;
}
?>
<?php
//! functie voor het toevoegen of bijwerken van gebruikersnamen/wachtwoorden in een .htpasswd-bestand
/*!
@param $file (string) volledig pad+naam van het .htpasswd-bestand
@param $user (string) naam van de gebruiker die middels .htaccess/.htpasswd toegang krijgt tot een directory
@param $pass (string) (nieuw) wachtwoord van $user - deze dient nog steeds zorgvuldig gekozen te worden
@param $mode (int) schrijfmodus, 0=passwords van bestaande gebruikers readonly, 1=password overschrijfbaar, 2=verwijderen user (default 1)
@param $die (bool) debug-mode; geeft aan of de functie moet stoppen op het moment dat er een fout optreedt (default false)
@post .htpasswd-bestand is bijgewerkt of functie retourneert false (of wanneer $die op true staat wordt er een foutmelding gegeven)
@return (bool) Geeft aan of deze functie succesvol is uitgevoerd - zoniet, controleer met $die = true wat er mis ging
*/
function write_htpasswd($file,$user,$pass,$mode=1,$die=false)
{
$ret=true;// geeft aan of de functie succesvol is uitgevoerd
<?php
// we gaan er van uit dat we schrijfrechten hebben in $src
$src = $_SERVER['DOCUMENT_ROOT']."/.htpasswd";
// maak het bestand aan als deze nog niet bestond
touch($src);
// maak gebruiker "test" aan, met pwd "hoi"
write_htpasswd($src, "test", "hoi");
// wijzig het wachtwoord van de gebruiker "test" in "hoi2"
write_htpasswd($src, "test", "hoi2");
// verwijder gebruiker "test"
write_htpasswd($src, "test", "", 2);
// maak gebruiker "test2" aan, met pwd "blaat"
write_htpasswd($src, "test2", "blaat");
// probeer een wachtwoord te veranderen in readonly-mode
// als je de functie in debug mode draait (zoals hier gebeurt) krijg je een foutmelding
write_htpasswd($src, "test2", "blabla", 0, true);
?>
<?php
// we gaan er van uit dat we schrijfrechten hebben in $src