PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : .htaccess passwörter mit PHP



Ldi91
05-01-2007, 20:56
Ich habe ein loginsystem welches auf htaccess Dateien basiert. Jetzt soll der User aber sein Passwort ändern können. Ich habe mir deshalb ein Script programmiert welches Passwörter ändern kann. zur Zeit aber nur klartext passwörter.

<?
#/srv/vhost/backend/user-center/auth/.htusers
if ($_SERVER['REQUEST_METHOD'] != 'POST') {
$cont.=<<<EOD
<h3>Passwort ändern</h3>
<form method="post"><table>
<tr>
<td>Altes Passwort:</td><td><input name="old_passwd"type="password"size="20"></td>
</tr>
<tr>
<td>Neues Passwort:</td><td><input name="new1_passwd"type="password"size="20"></td>
</tr>
<tr>
<td>Wiederhohlen:</td><td><input name="new2_passwd"type="password"size="20"></td>
</tr>
</table>
<input value="Ändern" type="submit">
</form>
EOD;
} else {

$old_passwd=$_POST['old_passwd'];
$new1_passwd=$_POST['new1_passwd'];
$new2_passwd=$_POST['new2_passwd'];
foreach (file('/srv/vhost/backend/user-center/auth/.htusers') as $this_user) {
list($this_name, $this_passwd)=split(":", $this_user, 2);
if($user==$this_name){
$db_user=$this_name;
$db_passwd=$this_passwd;
}
}
if($db_user==""){
$cont.=<<<EOD
<blockquote><b>
Username ist in der Datenbank nicht bekannt.<br/><br/>
<a href="javascript:history.back()">Nochmal Versuchen</a></b>
</blockquote>
EOD;
$ext=1;
}
if($db_passwd!=$old_passwd."\n"){
$cont.=<<<EOD
<blockquote><b>
Das alte Passwort ist falsch.<br/><br/>
<a href="javascript:history.back()">Nochmal Versuchen</a></b>
</blockquote>
EOD;
$ext=1;
}
if($new2_passwd!=$new1_passwd){
$cont.=<<<EOD
<blockquote><b>
Die neuen Kennwörter stimmen nicht überein.<br/><br/>
<a href="javascript:history.back()">Nochmal Versuchen</a></b>
</blockquote>
EOD;
$ext=1;
}
if(strlen($new1_passwd) < 4){
$cont.=<<<EOD
<blockquote><b>
Das Kennwort ist zu kurz. Es muss mindestens 4 Zeichen haben.<br/><br/>
<a href="javascript:history.back()">Nochmal Versuchen</a></b>
</blockquote>
EOD;
$ext=1;
}
if($ext==0){
foreach (file('/srv/vhost/backend/user-center/auth/.htusers') as $this_user) {
list($this_name, $this_passwd)=split(":", $this_user, 2);
if($db_user==$this_name){
$new_file.=$this_name.":".$new1_passwd."\n";
} else$new_file.=$this_user;
}

$handle = fopen ('/srv/vhost/backend/user-center/auth/.htusers', "w+");
fwrite($handle, $new_file);
fclose($handle);
$cont.=<<<EOD
<blockquote><b>
Das Neue Kennwort wurde gesetzt. <br/><br/>

</blockquote>
EOD;

}
}

?>
(wundert euch nicht über das PHP Script. Es ist nur ein modul. Die Variable $cont wird dann über mein CMS in die website eingebaut.)
Jetzt habe ich paar Probleme.
1. User muss sein altes Passwort eingeben. Nur wie ver/entschlüssele ich es
2. Wie verschlüssele ich passwörter nach dem .htaccess verfahren. zur Zeit verwende ich SelfHTML (http://de.selfhtml.org/servercgi/server/htaccess.htm#verzeichnisschutz)

BlueJay
06-01-2007, 09:11
Suche im php.net nach den Funktionen crypt und md5.

so long,
BlueJay

Ldi91
06-01-2007, 10:49
ja crypt gibt mir nichts brauchbares aus. Außerdem werden immer verschiedene Zeichenketten gebildet, somit ist es für die rückwärts Abfrage ob das Passwort, welches der Kunde eingibt, richtig ist unbrauchbar.

Ich hoffe auf weitere Vorschläge.

nul
06-01-2007, 11:38
md5 liefert immer die gleichen Hash-Werte zurueck.

undefined
06-01-2007, 12:30
Also Passwörter sollte man immer mit htpasswd Bearbeiten weil die Cryptographie und der gewählte Zeichensatz sich vom PHP-Client-Module zum Apache Server doch stark Unterschieden können.
Wenn du PHP5 verwendest nehme oder siehe proc_open()

Ldi91
06-01-2007, 13:00
md5 liefert immer die gleichen Hash-Werte zurueck.
was soll ein md5 bringen? das hatt IMHO ja nichts mit der verschlüsselung von htpasswd zu tun.

Also Passwörter sollte man immer mit htpasswd Bearbeiten weil die Cryptographie und der gewählte Zeichensatz sich vom PHP-Client-Module zum Apache Server doch stark Unterschieden können.
Wenn du PHP5 verwendest nehme oder siehe proc_open()

nein ich hänge noch an PHP4. ich ich will auch nicht eine Funktion starten, denn ich habe aus Sicherheitsgründen in der php.ini das Kommando proc_open aus gutem Grund gesperrt. Mir geht es auch um das authentifizieren der User. Ich weis nicht wie ich ein eingegebenes Passwort mit der einem sich dauernd ändernden, verschlüsselndem String vergleichen.

BlueJay
06-01-2007, 15:13
Also Passwörter sollte man immer mit htpasswd Bearbeiten weil die Cryptographie und der gewählte Zeichensatz sich vom PHP-Client-Module zum Apache Server doch stark Unterschieden können.

Haben ein Gewehr ;)

Zumal man meist im besten Fall die Verschlüsselung des Clients bekommt, nicht die des Servers.

Die meisten PW-Services arbeiten mit crypt oder md5 mit irgendwelchen Parametern, die da bei den Funktionen stehen. Eine Möglichkeit kommt meist hin.

Und warum nicht mit dem alten PW einloggen vor der PW-Änderung? Erlegt alle Probleme.

so long,
BlueJay

undefined
06-01-2007, 16:02
Haben ein Gewehr ;)

Zumal man meist im besten Fall die Verschlüsselung des Clients bekommt, nicht die des Servers.

Die meisten PW-Services arbeiten mit crypt oder md5 mit irgendwelchen Parametern, die da bei den Funktionen stehen. Eine Möglichkeit kommt meist hin.

Und warum nicht mit dem alten PW einloggen vor der PW-Änderung? Erlegt alle Probleme.

so long,
BlueJay
Genauso schaut's aus - Der Cypher unterscheidet sich extrem!
Daher habe ich damals als ich meine KDE Anwendung (siehe Signatur) geschrieben habe. Expect verwendet - damit man dieses Problem umgeht.
Windows Client's können z.B. ohne cygwin kein Crypt aber alle Unix Systeme verwenden Standardmäßig diese Verschlüsselung.

Ich würde bei einer PHP Authetifizierung auch nicht auf .htaccess Aufbauen.
Dafür bietet PHP den header WWW-Authenticate mit den ENV's PHP_AUTH_USER und PHP_AUTH_PW.
Diese kann man genauso gut aus einer Datenbank nehmen.

Ldi91
07-01-2007, 14:21
ok das entschlüsseln habe ich mir schon aus dem Kopf geschlagen. jetzt bitte die Funktion zum verschlüsseln?

Ich würde bei einer PHP Authetifizierung auch nicht auf .htaccess Aufbauen.
Dafür bietet PHP den header WWW-Authenticate mit den ENV's PHP_AUTH_USER und PHP_AUTH_PW.
Diese kann man genauso gut aus einer Datenbank nehmen.
ja blöd aber wenn man ein cgi-script sichern möchte, genauer awstats. und da bietet .htaccess die besten Möglichkeit.

BlueJay
07-01-2007, 17:26
Hast du hier alle genannten Varianten mit der .htusers durchgecheckt?

http://de.php.net/manual/en/function.crypt.php

Ldi91
07-01-2007, 18:00
was meinst du?
welche .htusers?

BlueJay
07-01-2007, 22:02
na, die, aus der sich .htaccess bedienen soll...

Näheres dazu bei SelfHTML

Ldi91
08-01-2007, 16:52
achso bei mir heißt sie .htpasswd. Ich habe mich nur ein wenig gewundert. aber wie ich crypt anwenden muss weis ich immer noch nicht.

BlueJay
08-01-2007, 22:43
Beispiel 1 aus dem oben genannten Link

Ldi91
09-01-2007, 10:43
<?php
$password = crypt('mypassword'); // let the salt be automatically generated

/* You should pass the entire results of crypt() as the salt for comparing a
password, to avoid problems when different hashing algorithms are used. (As
it says above, standard DES-based password hashing uses a 2-character salt,
but MD5-based hashing uses 12.) */
if (== $password) {
echo "Password verified!";
}
?>
danke jetzt habe ich es. Nur wie ich ein neues passwort erstelle weis ich noch nicht
mit

crypt($password, $password)
?

BlueJay
09-01-2007, 14:25
$stopfsindiehtusers=crypt($passwortimklartext);

Ldi91
09-01-2007, 15:53
so aber sobald da das neue eingetragen ist schlägt die gültigkeitsüberprüfung mit dem vorherigen Script fehl. Anmelden kann man sich.

BlueJay
09-01-2007, 17:55
Du lässt die Jungs mit dem alten Passwort sich anmelden, ihr Passwort ändern, verifizierst das noch alte, cryptest das neue und schreibst das neue gecryptete dann in die .htwasauchimmer.

Die Maske/das Formular dazu könnte so aussehen wie beim OS/2-LAN

Natürlich musst du vorher checken, ob das gecryptete PW akzeptiert wird.
Wenn nicht, repeat mit einem Parameter eine andere Crypt-Variante nehmen until klappt.

Ldi91
09-01-2007, 17:56
Du lässt die Jungs mit dem alten Passwort sich anmelden, ihr Passwort ändern, verifizierst das noch alte, cryptest das neue und schreibst das neue gecryptete dann in die .htwasauchimmer.


genau. ich das ist auch gut so