[SQL]Anweisung: Maskieren
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
advance
anmerkung
aufruf
daten
datensatz
eins
erfolgreich session
erweiterung
folgender inhalt
formen
funktion
genau aussehen
irgend
maskierter daten
maskierung
pawort
result
schauen
thank
verwirrung
-
Hallo!
Ich lerne z.Z. wie man sicher PHP/MySQL programmiert und um SQL Injenction vorzubeugen gibt es den befehl: mysql_real_escape_string um Daten zu maskieren.
[ Siehe http://de2.php.net/manual/de/function.mysql-real-escape-string.php ]
Anmerkung: Ist magic_quotes_gpc aktiviert, wenden Sie zuerst stripslashes() auf die Daten an. Das Bearbeiten bereits in irgend einer Form maskierter Daten durch mysql_real_escape_string f?hrt ansonsten dazu, dass bereits Maskiertes doppelt maskiert wird.
Ich br?uchte jetzt also eine Funktion die unabh?ngig von magic_quotes_gpc l?uft. Auf der Seite (Link oben) ist auch schon der Code der Funktion, nur die Funktion klappt bei mir nicht.
Hier der Codeteil der das Einloggen auf meiner Seite bewerkstelligt:
$check_SQL="SELECT * FROM `users` WHERE `nick`='$nick' AND `pw`='$pw'"; $result=mysql_query($check_SQL); $auth_check=mysql_num_rows($result); if($auth_check==1){ //Authentifizierung erfolgreich, Session authentifizieren $_SESSION['auth']=true; //Geht nat?rlich noch etwas weiter der Code, aber das d?rfte das wichtigste sein!
So kann ich mich noch problemlos einloggen, aber sobald ich die funktion von der seite verwende um $nick und $pw zu maskieren kann ich mich nicht mehr einloggen. Liegt das an der Funktion oder wie muss der inhalt von $check_SQL genau aussehen dann mit quote_smart(); <-- Die funktion der Seite zum maskieren ( mit ?berpr?fung ob magic_quotes_gpc aktiviert ist).
Thanks in advance
Jan
Beitrag ge?ndert am 2.07.2006 20:57 von t3remy -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Hast du verstanden, was mysql_real_escape_string macht?
Denn es wird ein String in eine anderen String umgewandelt.
Und zwar dann, wenn bestimmte Zeichen in String sind.
Das ganze ist unabh?ngig von sql.
Also wenn du dich nicht mehr einloggen kannst, dann hat entweder dein Benutername oder dein Passwort ein Zeichen, welches von mysql_real_escape_string umgewandelt wurde und somit gibt es diesen Benutzer mit diesen Passwort nicht.
Jens -
Also ich habe hier eine Funktion, die magic quotes entfernt, falls die Erweiterung aktiviert ist. Nach dem Aufruf der Funktion kannst du dann wie du willst mysql_real_escape_string() machen.
<?php function magic_quotes_strip($mixed) { if(is_array($mixed)) return array_map('magic_quotes_strip', $mixed); return stripslashes($mixed); } function magic_quotes_off(){ if(get_magic_quotes_gpc() || ini_get('magic_quotes_sybase')) { $_GET = magic_quotes_strip($_GET); $_POST = magic_quotes_strip($_POST); $_COOKIE = magic_quotes_strip($_COOKIE); $_SERVER = magic_quotes_strip($_SERVER); $_FILES = magic_quotes_strip($_FILES); $_ENV = magic_quotes_strip($_ENV); $_REQUEST = magic_quotes_strip($_REQUEST); $HTTP_SERVER_VARS = magic_quotes_strip($HTTP_SERVER_VARS); $HTTP_GET_VARS = magic_quotes_strip($HTTP_GET_VARS); $HTTP_POST_VARS = magic_quotes_strip($HTTP_POST_VARS); $HTTP_COOKIE_VARS = magic_quotes_strip($HTTP_COOKIE_VARS); $HTTP_POST_FILES = magic_quotes_strip($HTTP_POST_FILES); $HTTP_ENV_VARS = magic_quotes_strip($HTTP_ENV_VARS); if (isset($_SESSION)) { $_SESSION = magic_quotes_strip($_SESSION, ''); $HTTP_SESSION_VARS = magic_quotes_strip($HTTP_SESSION_VARS, ''); } } } ?>
-
Folgendes Scripte sollte ausreichen, um die Backslashes, die bei magic_quote auf on hinzugef?gt werden, wieder zu entfernen :
if (get_magic_quotes_gpc() || ini_get('magic_quotes_sybase') { $GLOBALS['_GET'] = array_map ('stripslashes', $GLOBALS['_GET']); $GLOBALS['_POST'] = array_map ('stripslashes', $GLOBALS['_POST']); $GLOBALS['_COOKIE'] = array_map ('stripslashes', $GLOBALS['_COOKIE']); }
Die Funktion "mysql_real_escaped_string ()" entwertet bzw. maskiert MySQL Zeichen.
Ich verdeutliche das mal an einem Script :
$var = "' OR true#"; $sql_query_1 = "SELECT * FROM `user` WHERE `user` = '*******' AND `password` = '".$var."'"; $sql_query_2 = "SELECT * FROM `user` WHERE `user` = '*******' AND `password` = '".mysql_real_escape_string ($var)."'";
Die Wertzuweisung sind mit doppelten Hochkommata, da es sonst Verwirrung wegen der Maskierung f?r PHP geben k?nnte.
Also
$sql_query_1 w?rde nun folgendes enthalten :
SELECT * FROM `user` WHERE `user` = '*******' AND `password` = '' OR true#'
D.h., dass der Datensatz ausgew?hlt wird, wo der user = ******* und das password = (nichts) ist, oder! alles. Das heisst wiederrum, dass der erste Datensatz immer ausgew?hlt wird, weil die WHERE Bedinung halt immer richtig ist (hinter dem # wird alles ignoriert, weil es ein Kommentar in SQL ist).
In der Variable $sql_query_2 w?rde folgender Inhalt stehen :
SELECT * FROM `user` WHERE `user` = '*******' AND `password` = '\' OR true\#'
Diese Query w?hlt den Datensatz aus, wo der user = ******* und das password = ' OR true#.
Dadurch wird die SQL Injection verhindert.
So nochmal allgemein.
Die Einstellung "magic_quotes" auf on bewirkt, dass die Anf?hrungszeichen der Werte der Variablen GET, POST und COOKIE maskiert bzw. entwertet werden.
Also aus "Hallo, das ist ein Hochkommata ', oh schau noch eins '." (ohne Anf?hrungszeichen) wird "Hallo, das ist ein Hochkommata \', oh schau noch eins \'."
Ich hoffe jetzt ist es einigerma?en verst?ndlich.
MfG Lucas -
Also a) w?rde ich $GLOBALS nie direkt ver?ndern und b) bin ich mir immernoch nicht sicher, dass nicht auch noch mehr von magic_quotes beeinflusst wird, aber mir soll's auch egal sein. ^^
-
Moin.
Auf Wunsch des Threaderstellers...
-Closed-
Bei R?ckfragen: PN an mich!
GrEetz, Olliander -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage