Login vor SQL-Injections schützen
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
abfrage
aussehen
befehl
benutzername
bereich
code
dank
datenbank
ergebnis
falsch login
frage
griff
jemand
limit
login
profi
safe
url
verbindung
verhindern
-
Hallo, ich wollte fragen wie ich mein login Script von Mysql injections schützen kann, hier das Script...
<?php session_start(); ?> <?php $verbindung = mysql_connect("localhost", "Benutzername" , "DeinPasswort") or die("Verbindung zur Datenbank konnte nicht hergestellt werden"); mysql_select_db("homepage") or die ("Datenbank konnte nicht ausgewählt werden"); $username = $_POST["username"]; $passwort = md5($_POST["password"]); $abfrage = "SELECT username, passwort FROM login WHERE username LIKE '$username' LIMIT 1"; $ergebnis = mysql_query($abfrage); $row = mysql_fetch_object($ergebnis); if($row->passwort == $passwort) { $_SESSION["username"] = $username; echo "Login erfolgreich. <br> <a href=\"geheim.php\">Geschützer Bereich</a>"; } else { echo "Benutzername und/oder Passwort waren falsch. <a href=\"login.html\">Login</a>"; } ?>
Danke für eure Antworten
mfg
Beitrag zuletzt geändert: 6.3.2010 10:55:23 von space-upload -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
ho ;)
Ich bin sicher kein Profi im Verhindern von MySQL Injections, aber es gibt ein paar Grundsatzregeln, die du stets im Hinterkopf haben solltest:
1) User eingaben niemals direkt der Datenbank übergeben.
$username = $_POST["username"];
Wenn ich mich da ein wenig mit ' " ; usw herumspiele, dann sollte ich relativ einfach an deine Daten ran kommen.
Ich glaube, dass PHP das mitlerweile schon ein bisschen besser im Griff hat, als früher, aber man sollte sich nicht drauf verlassen...
Aus diesem Grund gibt es Befehle wie HtmlSpecialChars() und mysql_real_escape_string()
Eine sehr gute Erklärung findest du unter www.php.net
In dem Fall willst du ja nicht verhindern, dass jemand HTML Code (in einem Kommentar oder ähnlichem) verwendet, sondern nur, dass deine Query geschützt ist. Dein Code sollte also so aussehen:
$username = mysql_real_escape_string($_POST["username"]);
Das gleiche gilt natürlich auch fürs Passwort, falls du es in die Datenbank schreibst - Also bei der Registrierung eines Users.
2) Bei einem Loginscipt willst du, dass die Usereingaben nicht ähnlich (LIKE), sondern genau die gleichen (=) sind, die in der Datenbank stehen...
Dein Code:
$abfrage = "SELECT username, passwort FROM login WHERE username LIKE '$username' LIMIT 1";
Besser:
$abfrage = "SELECT username, passwort FROM login WHERE username = '$username' LIMIT 1";
Dass du Limit 1 verwendest, finde ich sehr gut ;)
Es gibt sicher noch mehr, dass du beachten kannst, aber wie gesagt: Ich bin kein Profi :D
lg
Sincer -
du solltest auch abfragen, ob überhaupt etwas in der Variable $username steht. Also die Datenbankabfrage erst starten wenn überhaupt etwas übermittelt wurde.
if(!empty($username)) { Datenbankabfrage.....
Weiterhin solltest Du prüfen, ob überhaupt eine Antwort von der SQL Datenbank zurückkommt. mysql_num_rows($ergebnis)>0, sonst kann jemand mit einem falschen, nicht vorhandenen Usernamen und einem leeren Passwort hineinkommen ($row->passwort ist dann leer und $passwort ebenso, also beide gleich) -
A ok, das Script könnt dann aber auch so aussehen oder?
<?php session_start(); ?> <?php $verbindung = mysql_connect("localhost", "Benutzername" , "DeinPasswort") or die("Verbindung zur Datenbank konnte nicht hergestellt werden"); mysql_select_db("homepage") or die ("Datenbank konnte nicht ausgewählt werden"); $username = $_POST["username"]; $passwort = md5($_POST["password"]); $usernameq = mysql_real_escape_string($uername); $abfrage = "SELECT username, passwort FROM login WHERE username = '$usernameq' LIMIT 1"; $ergebnis = mysql_query($abfrage); $row = mysql_fetch_object($ergebnis); if($row->passwort == $passwort) { $_SESSION["username"] = $username; echo "Login erfolgreich. <br> <a href=\"geheim.php\">Geschützer Bereich</a>"; } else { echo "Benutzername und/oder Passwort waren falsch. <a href=\"login.html\">Login</a>"; } ?>
mfg -
hi
bevor hier gross an dein skript eigegangen werden kann, der bester rat, was ich dir geben kann ist das hier.
über dein query nur kurz:
SELECT username, passwort FROM login WHERE username LIKE '$username' LIMIT 1
ist sehr abenteuerlich.
1. username vom POST ungefiltert übernommen. (z.B.: wenn im input '../' oder so vorkommt, leitet man ohne irgendeiner weiteren meldung zum index.php und damit schluss [etwas rigoros, aber es wirkt!])
2. LIKE und LIMIT sind hier fehl am platz! wieso? der username sollte eindeutig sein, daher nicht like und kommt automatisch auch nur einmal vor. (ausserdem, dein LIKE ist so gar nicht fuktionell! es gehört so: like '%$username', oder like '$username%',oder aber like '%$username%'. also bei mysql über '_' und '%' nachlesen!)
dann weiter in deinem script:
$ergebnis = mysql_query($abfrage); $row = mysql_fetch_object($ergebnis);
diese ungeheure schlamperei begeht hier ohnenhin ein jeder!. was meine ich damit:
$ergebnis = mysql_query($abfrage); IST KEIN ERGEBNIS - womöglich! und dann spuckt der server mit meldungen um sich, worüber der atakkierender gfrast sich sehr freut! er kann ja damit was anfangen!! was mache ich dagegen?:
if ( $result = mysql_query ($query) ) { // hier kannst dafür sorgen, was du vor hast mit der query // solltest auch danach fragen, wie viele zeilen du bekommen hast und nicht nur sagen, "ergebnis = ..." // was ist wenn du eine leere menge bekommst? } else { // hier MUSST DU etwas programmieren für den fall, wenn dein query am bach runterging! // KEINE ALTERNATIVE!! DAS IST EIN MUSS! (so gut wie niemand hir macht das! ich lasse diesen teil NIE WEG!) }
... und so weiter ... (sprengt hier alle rahmen).
also die überlegungen in sachen userinput gehen in zig richtungen! wills du das ding für etwas ernsthaftes, nehme dir einen fertigen skript, der nachweislich gut programmiert ist, oder lerne das eben! den anfang kannst schon mal mit google oben, in dem ersten satz machen.
Beitrag zuletzt geändert: 6.3.2010 11:48:35 von czibere -
Ok, danke ich werde mich jetzt mal damit beschäftigen und alle Ratschläge befolgen, vielen dank an euch
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage