PHP PHP Login

Hallo Community

Ich arbeite grade an einer kleinen Homepage...
Nun hatte ich die Idee einige Inhalte nur für angemeldete Mitglieder freizuschalten...
In der HTML muss ich auf jeden Fall eine POST-Form erstellen...
Das ist auch nicht das Problem, mit der verarbeitenden PHP-Datei komm ich nich klar... Kann mir da jemand helfen und erklären was ich zu tun hab?
Die Tutorials die Google vorschlägt funktionieren alle nich...

Danke schonmal im Vorraus :)
 
Du solltest erstmal PHP lernen, würde ich empfehlen. Und wenn du das kannst, registrierst du eine Session, nimmst die eingegebenen Daten entgegen, gleichst sie mit den Daten in einer Datenbank ab und lässt je nach gesetztem Login-Status den User mehr oder weniger auf der Seite tun.

Ohne PHP-Kenntnisse und Grundwissen zur Funktionsweise des WWW wirst du auf jeden Fall nicht weit kommen. Mit diesem Wissen wird sich deine Frage aber ganz von allein beantworten. Mit "mal schnell einen Login schreiben" ist es jedenfalls nicht getan. Der Content muss auch abhängig vom Login-Status angezeigt werden, was wiederum PHP o.ä. bedingt. Dann bediene dich lieber den Login-Mechanismen des Webservers, packe das, was nur eingeloggte User sehen dürfen, in einen extra Ordner und wer dann diesen Ordner aufruft, muss vorher seinen Login eingeben. Passwort-Schutz für Ordner bieten die meisten guten Webhoster an.
 
Hier gibts ein meiner Meinung nach sehr gutes Tutorial: phpBuddy.eu - Login Systeme von Einfach bis Profi

Allgemein brauchst du ein Login-Formular in dem User ihre Logindaten (Benutzername, Passwort) eingeben, diese überprüfst du mit den Einträgen in deiner Datenbank. Stimmen die Einträge überein, speicherst du das Ergebnis in einer Session, damit auch die anderen PHP-Skripten auf deinem Server wissen, dass der User eingeloggt ist.

Das kann dann etwa so aussehen:
Login.php
PHP:
<?php
 
session_start();
 
if (isset( $_POST['submit'] ))
{
     $user = mysql_query('SELECT username ...');
     $passwort_hash = mysql_query('SELECT passwort_hash ...');
     if ( $user == $_POST['username'] && md5($_POST['passwort']) == $passwort_hash )
     {
          $_SESSION['angemeldet'] = true;
          $_SESSION['user'] = $user;
     }
     else
          echo 'Benutzername oder Passwort falsch!';
}
?>
OnlyForMembers-Seite.php
PHP:
session_start();
if ( $_SESSION['angemeldet'] == true )
{
     echo 'Some members-only Text.';
}
else
{
     echo 'Bitte loggen sie sich ein, um diese Seite zu betrachten.';
     exit;
}
 
MCStreetguy hat gesagt.:
Die Tutorials die Google vorschlägt funktionieren alle nich
Bezweifel ich irgendwie ;)

Habe mal kurz gegoogelt, da solche Fragen schon zig mal beantwortet wurden und daher die Bereitschaft selbst etwas zu schreiben doch sinkt ;).
Das erste Ergebniss sieht ganz gut aus:

How to Create a Secure Login Script in PHP and MySQL - wikiHow

edit:Bitte nutze das gepostetete Gerüst von dafuq nicht unverändert.
Nutze gleich prepared statements (Auch in jedem besseren Tutorial erwähnt).
Sonst hast du gleich eine wunderschöne Möglichkeit zur sql-Injection eingebaut.

edit2: dafuq: warum denn zwei Selects ?
 
@Sleepprogger: das ganze war mehr zu Demozwecken gedacht. Zwei Selects sind natürlich nicht nötig, am besten lässt man gleich die Datenbank die Überprüfung vornehmen und zählt dann nur noch die Anzahl der Ergebnisse.

Was Datenbank-Sicherheit angeht, sind Prepared Statements sicher eine tolle Lösung, einem Anfänger würde ich da allerdings eher escape-Funktionen nahelegen oder nur gehashte Strings in den Query einbauen.
 
Hm, ok, da hat wahrscheinlich jeder so seine vorlieben, aber ich sehe eigentlich keinen Grund warum man nicht gleich mit prepared Statements anfängt.
Sowohl Geschwindigkeit als auch Sicherheit dürfte bei prepared Statements besser sein als bei Nutzung von escape Funtkionen.

Ich lasse mich natürlich gerne eines besseren belehren.
 
Hier gibts ein meiner Meinung nach sehr gutes Tutorial: phpBuddy.eu - Login Systeme von Einfach bis Profi

Wirklich "sicher" ist der Code dort aber auch nicht siehe:
PHP:
action="<?php echo $_SERVER['PHP_SELF']; ?>">
bzw.
PHP:
<a href="<?php echo $_SERVER['PHP_SELF']. "?benutzer=abmelden"; ?>">

Und MD5 sollte man nun wirklich nicht mehr benutzen.

@Sleepprogger, casten/mysql_real_escape_string bzw. mysqli_real_esacape_string schützen auch sicher vor SQLi's (natürlich nur wenn man sie richtig benutzt).
 
Und MD5 sollte man nun wirklich nicht mehr benutzen.
Natürlich sollte man Passwörter nicht einfach per MD5 hashen und wenn dann nur mit Salt und mehrfachem Hashen. Allerdings ist es durchaus gängige Praxis einfach nur MD5 zu verwenden, unter anderem weil somit die Benutzerdaten leicht auf andere Systeme übertragbar sind, z.B. bei einem CMS-Wechsel oder ähnlichem (siehe TYPO3, phpBB, etc.).

@enkore: Das setzt allerdings voraus, dass sich der Query selbst nicht ändert, sondern nur die übergebenen Parameter. Grundsätzlich halte ich aber die gewöhnlichen mysql-Funktionen für anfängertauglicher, da sie meistens in den Tutorials verwendet werden.
 
Natürlich sollte man Passwörter nicht einfach per MD5 hashen und wenn dann nur mit Salt und mehrfachem Hashen. Allerdings ist es durchaus gängige Praxis einfach nur MD5 zu verwenden, unter anderem weil somit die Benutzerdaten leicht auf andere Systeme übertragbar sind, z.B. bei einem CMS-Wechsel oder ähnlichem (siehe TYPO3, phpBB, etc.).

@enkore: Das setzt allerdings voraus, dass sich der Query selbst nicht ändert, sondern nur die übergebenen Parameter. Grundsätzlich halte ich aber die gewöhnlichen mysql-Funktionen für anfängertauglicher, da sie meistens in den Tutorials verwendet werden.

@1: Alle großen CMS haben inzwischen Plugin-APIs für Nutzerauth, sodass das kein Grund mehr ist. Heutzutage sollte man Algorithmen wie PKBDF2 nutzen, die wirklich sicher sind.

@2: Prepared Statements sind sehr viel übersichtlicher als "select x, y, z from " . $tabelle . " where " . $condition . " = ". $value . ";".
Wie gesagt, es gibt absolut keinen Grund mehr sich SQL-Queries mit Stringops zusammenzuwichsen.
 
Danke Leute ich bin echt überrascht das ich so schnell gute antworten hab :)
Nur eine Frage hätte ich noch...

Was müsste ich in dafuq's Code noch abändern um SQL-Injection zu verhindern?
 
Du musst die vom User eingegebenen Daten (also das, was per POST kommt) mittels mysql_real_escape_string() escapen.
 
@Sleepprogger, casten/mysql_real_escape_string bzw. mysqli_real_esacape_string schützen auch sicher vor SQLi's (natürlich nur wenn man sie richtig benutzt).
Ich würde möglichst keinem Escaping vertrauen, wenn es auch eine saubere Lösung (hier: Prepared Statements) gibt. Im Zweifelsfall geht das immer schief, z.b. dank Second Order Injection oder Unicode Smuggling.
 
@MCStreetguy
Bitte filter und validiere entsprechend auch die Daten, welche Du vom Benutzer entgegennimmst, auch auf das was Du erwartest.

ganz Oberflächlich dargestellt:
PHP:
if ( isset( $_POST['submit'] ) ) {
    if ( $ok === $filter->filter( POST ) ) {
        if ( $ok === $valdate->valid( POST ) ) {

             $user = mysql_query('SELECT username ...');
             $passwort_hash = mysql_query('SELECT passwort_hash ...');
             return true;
        }
    }   
    return false;
}

Ein Filter kann Parameter bereinigen, oder für Dich aufbereiten.
Sprich aus 0 ein false machen, oder aus 0,0 = 0.0 oder Html tags entfernen usw. usw.

Die Validierer sollten auf den erwarteten Typ, oder Inhalt prüfen.

Ist der parameter auch wirklich ein int, oder Bool, oder alphanum usw. usw.
 
Zuletzt bearbeitet:
@MCStreetguy
Bitte filter und validiere entsprechend auch die Daten, welche Du vom Benutzer entgegennimmst, auch auf das was Du erwartest.

ganz Oberflächlich dargestellt:
PHP:
if ( isset( $_POST['submit'] ) ) {
    if ( $ok === $filter->filter( POST ) ) {
        if ( $ok === $valdate->valid( POST ) ) {

             $user = mysql_query('SELECT username ...');
             $passwort_hash = mysql_query('SELECT passwort_hash ...');
             return true;
        }
    }   
    return false;
}

Ein Filter kann Parameter bereinigen, oder für Dich aufbereiten.
Sprich aus 0 ein false machen, oder aus 0,0 = 0.0 oder Html tags entfernen usw. usw.

Die Validierer sollten auf den erwarteten Typ, oder Inhalt prüfen.

Ist der parameter auch wirklich ein int, oder Bool, oder alphanum usw. usw.

Wie wunderschön viel, überflüssiger und nutzloser Code. Poesie pur

Nicht, dass man einfach Prepared Statements nehmen könnte, um sich einen Dreck um die Nutzerdaten scheren zu müssen...
 
Nunja zumindest html elemente und co entfernen/umwandeln (html_entities un co) koennte selbst bei prepared statements sinnvoll sein um XSS zu vermeiden. Bei allem anderen verstehe ich den Mehraufwand auch nicht.
 
Wie wunderschön viel, überflüssiger und nutzloser Code. Poesie pur
Viele Wege führen nach Rom.

Ich denke das in anbetracht der Tatsachen, zu seinem Beispiel, und zu seiner Aussage an Erfahrungen mit PHP, es nicht sinnloser und viel überflüssiger Code.

Nicht, dass man einfach Prepared Statements nehmen könnte, um sich einen Dreck um die Nutzerdaten scheren zu müssen...
Welch eine Ironie und wahrlich auch extreme Überheblichlichkeit von Dir.

Ein Prepared Statements schließt aber trotzdem eine Überprüfung nicht aus ....

Es ist, wie sagtest Du noch gleich eine poetische Frage, ob fehlerhafte Daten überhaupt an die Db weitergereicht werden sollten, oder nicht.
Auch wenn die Datenbank selbst eine Prüfung dieser durchführen kann.

Es ist auch eine Betrachtungsweise ob die Daten für die weitere Verarbeitung aufbereitet werden müssen. nur als kleines Bespiel trim().

Ich denke nicht das man sich einen Dreck um die Nutzerdaten scheren sollte, sondern auch hier schon den Hebel ansetzen muss.

Aber, alles natürlich nur rein poetisch betrachtet ... ;)
 
Viele Wege führen nach Rom.
Viele Wege sind Sackgassen.

Ein Prepared Statements schließt aber trotzdem eine Überprüfung nicht aus ....

Es ist, wie sagtest Du noch gleich eine poetische Frage, ob fehlerhafte Daten überhaupt an die Db weitergereicht werden sollten, oder nicht.
Auch wenn die Datenbank selbst eine Prüfung dieser durchführen kann.

Es ist auch eine Betrachtungsweise ob die Daten für die weitere Verarbeitung aufbereitet werden müssen. nur als kleines Bespiel trim().
Das ist bei einem Loginformular vollkommen irrelevant. Vollkommen. Und auch sonst ist es barely relevant.
Warum? Weil es seit Ewigkeiten gute und einfach nutzbare ORMs und Formularframeworks gibt. Gerade bei PHP, was per se Scheiße ist und einem das Leben schwer macht, ist es wichtig, auf als gut bekannte Lösungen zu setzen.
 
Zurück
Oben