2009-07-05 16 views
4

Ich arbeite an meiner ersten PHP-basierten Website, und ich fragte mich, welche Lösungen für ein Benutzername/Passwort-System da draußen waren? Ich habe versucht, eine. Htaccess-Datei für grundlegende Sicherheit zu verwenden, und während es funktioniert, möchte ich etwas ein wenig einfacher für einen Laien zu verwalten. Gibt es andere Lösungen, die ich ausprobieren könnte? Ich habe keinen Datenbankserver zur Verfügung, also müsste er flache Datei-Datenbanken unterstützen ... Danke!PHP Benutzername Passwort Lösung

Bearbeiten Ich habe festgestellt, dass ich SQLite-Unterstützung habe, so habe ich eine Datenbank-Option verfügbar. Außerdem denke ich, dass ich noch ein paar Anforderungen erwähnen sollte, die ich habe. Ich habe ursprünglich versucht, .htaccess zu verwenden, um meine Website zu schützen, da ich Sicherheit über das gesamte Verzeichnis benötige. Die meisten Dateien, die ich zu schützen versuche, sind .pdf und .doc ... jede Lösung würde mir erlauben, diese Dateien sowie alle Webseiten im Verzeichnis zu sichern.

Wenn ich eine gute Lösung für mehr oder weniger "Haut" finden könnte, die. Htaccess-Methode zum Sperren eines Verzeichnisses, so dass ich Dinge tun könnte wie eine tatsächliche Login/Register-Seite, etc. dann würde ich einfach bleiben die .htaccess-Methode. Ich möchte jedoch etwas, das überschaubarer ist, ich brauche nur die Verzeichnissicherheit.

Antwort

2

Ich schrieb diesen Code schnell, es ist syntaktisch korrekt, aber ich habe es nicht getestet.
Es gibt 2 Dinge, die ich hier nicht gemacht habe, erstens habe ich keine Funktion zur Verfügung gestellt, um einen Benutzer zu entfernen und zweitens habe ich keine Funktion zur Verfügung gestellt, um ein Benutzerpasswort zu ändern, diese müssen Sie selbst schreiben.
Allerdings sollte dies für einen guten Startpunkt sorgen.

Diese Funktionen Ihre Benutzernamen gespeichert werden/Passwörter in einer Datei namens Passwörter in folgendem Format

username0:password0 
username1:password1 
username2:password2 
... 

.

function authenticate($username, $password) 
{ 

    //ALWAYS use a salt to secure the encryption of your passwords, this can be any value of any 
    //length, the longer and the more characters the better 
    //I like to use a "perfect password" from Steve Gibbson's https://www.grc.com/passwords.htm 
    //This must the exactly the same as the salt in theaddUser() function 
    $salt = 'voDeaFWckErOPPGwiapYBwEoc4O2d1M60m2QsYc7A15PUshrLamoVioG1wUmEgF'; 

    //First we need to get the contents of the file that has the usernames/passwords in it. 
    //we don't want to use fopen() or we may end up with a locked file error if another access is 
    //attempted before we've closed it. 

    //this line will get the contents of the file named passwords and store it in the $fh variable 
    $fh = file_get_contents('passwords'); 

    //Now lets take the file and split it into an array where each line is a new element in the array. 
    $fh = split("\n", $fh); 

    //Now lets loop over the entire array spliting each row into it's username/password pair 
    foreach($fh as $r) 
    { 
     //Every time this loop runs $r will be populated with a new row 

     //Lets split the line into it's username/password pairs. 
     $p = split(':', $p); 

     //Since we don't need all the usernames/password to be in memory lets stop when we find the one we need 
     if($p[0] == $username && $p[1] == sha1($salt . $password)) 
     { 
      //We've found the correct use so lets stop looping and return true 
      return true; 
     } 
    } 
    //If we've reached this point in the code then we did not find the user with the correct password in the 'database' 
    //so we'll just return false 
    return false; 
} 
function addUser($username, $password) 
{ 
    //ALWAYS use a salt to secure the encryption of your passwords, this can be any value of any 
    //length, the longer and the more characters the better 
    //I like to use a "perfect password" from Steve Gibbson's https://www.grc.com/passwords.htm 
    //This must the exactly the same as the salt in the authenticate() function 
    $salt = 'voDeaFWckErOPPGwiapYBwEoc4O2d1M60m2QsYc7A15PUshrLamoVioG1wUmEgF'; 

    //We need to parse out some preticularly bad characters from the user name such as : which is used to seperate the username and password 
    //and \r and \n which is the new line character which seperates our lines 
    $username = preg_replace('/\r|\n|\:/', '', $username); 

    //Now lets encrypt our password with the salt added 
    $password = sha1($salt . $password); 

    //Lets build the new line that is going to be added 
    $line = $username . ':' . $password . "\n"; 

    //Lets open the file in append mode so that the pointer will be placed at the end of the file 
    $fh = fopen('passwords', 'a'); 

    //Write the new entry to the file 
    fwrite($fh, $line); 

    //Close the file 
    fclose($fh); 

    //Typicaly one would write a bunch of error handling code on the above statments and if something 
    //goes wrong then return false but if you make it this far in the code then return true 
    return true; 
} 
+1

Wenn Sie die Flatfile-Methode verwenden, vergewissern Sie sich, dass Ihre Kennwortdatei nicht über das Internet zugänglich ist. Platzieren Sie es entweder außerhalb des Web-Verzeichnisses (normalerweise www orhtdocs) oder verweigern Sie den Zugriff in Ihrer .htaccess-Datei. :) – MitMaro

+3

Besser ein einmaliges, zufälliges Salz für jeden Eintrag verwenden. – Gumbo

+1

@Gumbo: Wie genau würde das funktionieren? Sie müssen das Salz kennen, wenn Sie den Benutzer validieren. Wenn das Salz zufällig ist, würden Sie es nicht wissen, um das Benutzerpasswort zu überprüfen. – MitMaro

1

Sicher, es gibt viele flache Datei-Datenbank-PHP-Sicherheitssysteme zur Verfügung. Bei einer schnellen Google-Suche werden viele Ergebnisse angezeigt. Hier ist ein Tutorial:

http://www.devshed.com/c/a/PHP/Private-Pages-with-PHP-and-Text-Files/

+0

Das sieht ziemlich gut aus, aber ich hoffte auf Sicherheit auf Verzeichnisebene, und ich wollte auch einen Registrierungsformular-Deal. Ich nehme an, diese Dinge wären gar nicht so schwer, mich selbst zu programmieren, ich bin nur ziemlich neu bei PHP und wollte nicht, dass mein Klient (sozusagen) lange auf mich warten muss, um zu lernen, wie man das programmiert php! –

1

Überprüfen Sie, ob Sie die Unterstützung für SQLite haben, es keinen Server benötigt, so dass es für Sie arbeiten.

Und vergessen Sie nicht, Ihre Passwörter zu hacken. ;)

zu überprüfen, um eine Datei (ex php_info.php) hinzufügen erstellen:

<?php 
    phpinfo(); 

Dann laden Sie die Datei auf den Host, laden Sie es in Ihrem Browser (example.com/php_info.php) und. Suche nach sqlite.

Sie sollten mehrere Referenzen zu sqlite auf der Seite sehen, die zeigt, ob Sie Unterstützung haben. Die Zeile mit "SQLite Library" sagt Ihnen die Version von sqlite, die Sie haben (wenn Sie es haben).

Auch wenn Sie fertig sind, sollten Sie die php_info.php-Datei von Ihrer Website löschen, da es einige Informationen über Ihre Einrichtung gibt, die Crackern hilfreich sein können.

+0

habe nicht über sqlite nachgedacht ... ich werde mir das anschauen, danke! –

+0

Wie würde ich von meinem Host herausfinden, ob sqlite unterstützt wurde? –

+0

Ich habe meinen Beitrag mit Informationen zur Suche nach Support aktualisiert. – MitMaro

0

haben Sie gesehen, wenn Sie SQLite verfügbar haben? Es ist PHPs eingebaute Datenbank. Wenn nicht, könnten Sie einfach lesen/schreiben zu einem file hoffe das hilft ein bisschen

-3

Nach this page von der Apache-Website:

In der Regel sollten Sie nie .htaccess Dateien verwenden, wenn Sie den Zugriff auf die Hauptserver-Konfigurationsdatei nicht haben. Es gibt zum Beispiel ein vorherrschendes Missverständnis, dass die Benutzerauthentifizierung immer in .htaccess Dateien durchgeführt werden sollte. Dies ist einfach nicht der Fall. Sie können Benutzerauthentifizierungskonfigurationen in die Hauptserverkonfiguration einfügen, und dies ist in der Tat die bevorzugte Vorgehensweise.

Es ist leicht zu sehen, warum dies auch so ist. Es ist weit vorzuziehen, eine zentrale Steuerung zu haben, anstatt jedes einzelne Verzeichnis beim Debuggen einer fehlerhaften Konfiguration zu durchsuchen.

Ich fordere Sie dringend auf, Ihre .htaccess Dateikonfiguration so schnell wie möglich in Ihre Hauptkonfigurationsdatei zu übertragen!

+0

Ich werde die Annahme machen, da er keinen Zugriff hat zu einer Datenbank, die wahrscheinlich keinen root/admin-Zugang zum Server hat, um die Serverkonfiguration zu ändern. – UnkwnTech

+0

das wäre eine korrekte Annahme! und eigentlich habe ich nur ein Verzeichnis (mit mehreren Unterverzeichnissen), das ich sperren müsste ... –

+0

Zwei Wörter: Joe

2

Werfen Sie einen Blick auf Zend_Auth. Es ist Open Source, also können Sie herumschnüffeln, um ein Gefühl dafür zu bekommen, wie ein Authentifizierungsmodul implementiert werden sollte (oder könnte). Vom doc:

Zend_Auth ist nur mit Authentifizierung betrifft und nicht mit Genehmigung. Die Authentifizierung ist , die lose definiert ist als Bestimmen, ob eine Entität tatsächlich ist, was sie vorgibt zu sein (d. H. Identifikation), basierend auf einige Anmeldeinformationen.

+0

Ich mag das Aussehen dieser ... ich werde grabe weiter, danke für den Link! –

Verwandte Themen