Loginformular ist unsicher!!!!! HILFE!!!!!
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
ausgabe
bedingung
beitrag
benutzername
daten
datensatz
eingegebenen daten
eins
injection
limit
login
manual
mglicherweise
pawort
sicherheit
username
vergleichen
verschlsselung
zeile
zuweisung
-
Hallo Leute... ich hab rausgefunden, dass mein Loginformular unsicher ist... wenn man Benutzername und Passwort frei lässt und dann auf anmelden klickt, kommt man trozdem in den geschützten Bereich rein...
hier ist mal mein Script:
if($_POST['anmelden']==true) { $username = $_POST['anmeldung_user']; $passwort = $_POST['anmeldung_passwort']; $loginabfrage = "SELECT * FROM user WHERE username LIKE '$username' LIMIT 1"; $loginergebnis = mysql_query($loginabfrage); $row = mysql_fetch_object($loginergebnis); if($row->passwort == "$passwort") { $_SESSION['username'] = $username; echo "Login war erfolgreich."; } else { echo "Benutzername und/oder Passwort waren falsch."; } }
einen unbenannten User ohne Passwort gibt es nicht... was stimmt da jetzt nicht??? -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Vielleicht solltest du in die Bedingung aufnehmen
if Username!='' und Passwort!='' dann Login erfolgreich.
if Username=='' und Passwort=='' dann Login nicht erfolgreich.
Genau weiss ich auch nicht wo der Fehler steckt.
Aber durch die oben genannte Methode kannst du den Fall 'keine Angaben' als erfolglos verarbeiten lassen. -
Das mit der If-Anweisung zu machen, ist ja ok, aber trozdem... normalerweise dürfte das nicht sein, weil es so einen "unsichtbaren" User ja nicht gibt... was also ist da falsch?
-
$_SESSION['username'] = $username;
Liegt das Problem vielleicht hier in deinem Code?
Soll das ein Vergleich oder eine Zuweisung sein?
Wenn Vergleich dann muss es heissen:
$_SESSION['username'] == $username;
EDIT: Ich sehe grad, es ist vermutlich eine Zuweisung und damit in Ordnung.
Hatte aber das gleiche Problem und es nur über den von mir genannten Lösungsweg behoben.
Beitrag geaendert: 20.2.2007 11:01:17 von karpfen -
Das ist Unsinnig:
$loginabfrage = 'SELECT * FROM user WHERE username LIKE '$username' LIMIT 1';
Besser ist:
$loginabfrage = "SELECT * FROM user WHERE username = \"".$username."\" AND passwort = \"".$passwort."\"";
Somit hohlst du den Datensatz, bei dem das Passwort mit dem Username übereinstimmt. Wenn Abfrage erfolgreich Cookie setzen, ansonsten Login fehlgeschlagen. -
... $loginabfrage = "SELECT * FROM user WHERE username LIKE '$username' LIMIT 1"; $loginergebnis = mysql_query($loginabfrage); $row = mysql_fetch_object($loginergebnis);
So ist das Skript generell unsicher da jemand über den Befehl
"DROP username;" durch Magicquotes problemlos deine Tabelle Löschen bzw. manipulieren kann.
Prüfe vorher die Eingaben auf entsprechende Zeichen, so dass ein solche Angriff gleich garnicht möglich ist.
PS.: Zur Information: auch POST Variablen Lassen sich Clientseitig Manipuleren.
Beitrag geaendert: 20.2.2007 14:46:14 von keiax -
Oha, da gibt's ja mehr zu beachten, als gedacht... was gibt's denn noch für Zeichen bzw. Befehle, die eventuell was anstellen können. und das mit dem Passwort werde ichnicht machen, da ich es nicht mit einem md5 verschlüsselt habe, und dann genau wie beim login alles abfragen kann, was in der session ist, indem er den sessionbefehl in ein Eingabefeld eingibt...
-
Am besten selektierst du die Zeilen aus der Datenbank, wo Passwort und Name übereinstimmen. Dann zählst du einfach die Ergebnisse und wenn es (nur) eins gibt, dann war der Login erfolgreich.
<?php if($_POST['anmelden']==true){ $username = $_POST['anmeldung_user']; $passwort = $_POST['anmeldung_passwort']; $loginabfrage = "SELECT * FROM user WHERE username LIKE '$username' AND passwort LIKE '$passwort'"; $loginergebnis = mysql_query($loginabfrage); $num = mysql_num_rows($loginergebnis); if($num == 1){ $_SESSION['username'] = $username; echo "Login war erfolgreich."; }else{ echo "Benutzername und/oder Passwort waren falsch."; } }?>
Übrigens solltest du noch eine MD5-Verschlüsselung o.ä. für das Passwort einbauen und per mysql_real_escape_string() die Usereingaben noch entwerten.
http://www.php.net/manual/de/function.mysql-real-escape-string.php
Beitrag geaendert: 20.2.2007 17:57:31 von i-spacke -
Am besten selektierst du die Zeilen aus der Datenbank, wo Passwort und Name übereinstimmen. Dann zählst du einfach die Ergebnisse und wenn es (nur) eins gibt, dann war der Login erfolgreich.
if($_POST['anmelden']==true){ $username = $_POST['anmeldung_user']; $passwort = $_POST['anmeldung_passwort']; $loginabfrage = "SELECT * FROM user WHERE username LIKE '$username' AND passwort LIKE '$passwort'"; $loginergebnis = mysql_query($loginabfrage); $num = mysql_num_rows($loginergebnis); if($num == 1){ $_SESSION['username'] = $username; echo "Login war erfolgreich."; }else{ echo "Benutzername und/oder Passwort waren falsch."; } }
Übrigens solltest du noch eine MD5-Verschlüsselung o.ä. für das Passwort einbauen und per mysql_real_escape_string() die Usereingaben noch entwerten.
http://www.php.net/manual/de/function.mysql-real-escape-string.php
Wenn ich dieses mysql_real_escape_string() verwende, werden die Daten in ihrer eingegebenen Form gespeichert, oder in der umgewandelten Form? Weil ich die Daten gerne so ausgeben möchte, wie se eingegeben wurden ^^ -
Das ist grundsätzlich richtig, aber wenn sich jemand mit einer SQL-Injection als Nickname anmeldet, dann bist du froh, dass es nicht so als Query übermittelt wurde, wie er es eingegeben hat. Es werden ja auch nur möglicherweise gefährliche Zeichen maskiert, was für die Ausgabe kein Problem darstellt. Der User sieht es dann so, wie er es eingegeben hat und du hast einen sichereren Code.
-
Das ist grundsätzlich richtig, aber wenn sich jemand mit einer SQL-Injection als Nickname anmeldet, dann bist du froh, dass es nicht so als Query übermittelt wurde, wie er es eingegeben hat. Es werden ja auch nur möglicherweise gefährliche Zeichen maskiert, was für die Ausgabe kein Problem darstellt. Der User sieht es dann so, wie er es eingegeben hat und du hast einen sichereren Code.
Und wenn ich die eingegebenen Daten dann als Textfeld value wieder ausgeben möchte auch?
Am besten, ihr sacht mir mal alles, was ihr über Sicherheit bei PHP wisst... mir fällt gerade auf, dass ich gefährlich programmieren. x.x aber anders hab ichs net gelernt. -
Du hast dir den Link gar nicht angesehen? Da steht eigentlich alles, was du wissen musst zu mysql_real_escape_string. Du solltest lernen, mit php.net umzugehen. Fortgeschrittene Sachen habe ich mir via php.net selbst erarbeitet, was wirklich nicht schwer ist.
http://www.php.net/manual/de/function.mysql-real-escape-string.php
Google einfach nach irgendwelchen Tutorials für Sicherheit... -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage