php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2006

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 06.07.2006, 15:53  
Erfahrener Benutzer
 
Registriert seit: 23.08.2004
Beiträge: 175
tekknotrip
Standard MySQL injection: mysql_real_escape_string

Hallo,

wundert mich, ich habe hier im Forum noch nichts darüber gefunden?

Egal, fange ich mal an:
http://de.wikipedia.org/wiki/SQL-Injection

Sollte sich eh mal jeder durchlesen.

Bei PHP gibt es ja
mysql_real_escape_string()

Wobei bei Abfragen:
PHP-Code:
$abfrage "SELECT spalte1 FROM tabelle WHERE spalte2 = '".$_POST['spalte2Wert']."'";
$query mysql_query($abfrage) or die("Datenbankabfrage ist fehlgeschlagen!"); 
Dies benutzt werden sollte:
PHP-Code:
$abfrage "SELECT spalte1 FROM tabelle WHERE 
           spalte2 = '"
.mysql_real_escape_string($_POST['spalte2Wert'])."'";
$query mysql_query($abfrage) or die("Datenbankabfrage ist fehlgeschlagen!"); 
Und ab PHP 5.1 folgendes:
PHP-Code:
$dbh->exec("INSERT INTO REGISTRY (name, value) VALUES (".$dbh->quote($name,PDO::PARAM_STR).", ".$dbh->quote($value,PDO::PARAM_INT).")"); 


Was ich aber nicht verstanden habe, was mach denn mysql_real_escape_string wirklich mit den $_POST / $_GET Daten?
Und was ist, wenn man diese Daten vorher fest definiert?

Also Beispielsweise Egal ob $_POST oder $_GET. ich wandle diese generell in eine Variable $vari1=$POST['vari1']; $vari2=$POST['vari2']; um. Sind dann Injections auch möglich?

Kennt jemand evtl. noch einen guten Link im Internet, der sich näher mit diesem Thema beschäftigt?

Wie löst Ihr diese Dinge?

Danke für Antworten!

Gruß, Micha
tekknotrip ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 06.07.2006, 16:06  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard Re: MySQL injection: mysql_real_escape_string

Zitat:
Zitat von tekknotrip
Und ab PHP 5.1 folgendes:
PHP-Code:
$dbh->exec("INSERT INTO REGISTRY (name, value) VALUES (".$dbh->quote($name,PDO::PARAM_STR).", ".$dbh->quote($value,PDO::PARAM_INT).")"); 
Wo hast du das gelesen? Ich verwende weiterhin meine alte Syntax und Validate-Klasse.

Zitat:
Was ich aber nicht verstanden habe, was mach denn mysql_real_escape_string wirklich mit den $_POST / $_GET Daten?
Und was ist, wenn man diese Daten vorher fest definiert?
Es verhindert, dass per SQL-Injection aus dem Wert ein Wert + neuer Befehl wird, nämlich indem
http://de2.php.net/mysql_real_escape_string
Zitat:
mysql_real_escape_string() calls MySQL's library function mysql_real_escape_string, which prepends backslashes to the following characters: \x00, \n, \r, \, ', " and \x1a.
Du kannst die Anführungszeichen um SELECT * FROM tab WHERE x = 'wert' also nicht "verlassen" und somit den Befehl nicht durch Erweiterung nach deinem Belieben umwandeln.


Zitat:
Also Beispielsweise Egal ob $_POST oder $_GET. ich wandle diese generell in eine Variable $vari1=$POST['vari1']; $vari2=$POST['vari2']; um. Sind dann Injections auch möglich?
Du kopierst die Variablen doch nur (wovon ich übrigens nicht viel halte), warum sollte das SQL-Injection Versuche beeinflußen?

Zitat:
Kennt jemand evtl. noch einen guten Link im Internet, der sich näher mit diesem Thema beschäftigt?
Wikipedia ist doch schonmal gut erklärt. Meinst du in Bezug auf PHP? Hast du die Links unter "Weblinks" beachtet?

Zitat:
Wie löst Ihr diese Dinge?
Ich verwende meistens sprintf() um meinen SQL-Befehl zu erstellen. Da kann ich festlegen, welchen Typ die eingesetzten Variablen haben und benutze da schonmal dort wo Zahlen hingehören keine Anführungszeichen und den type specifier %u. Wenn dann jemand Mist eingibt wird sowieso eine 0 gesetzt die meistens keinen Sinn ergibt.

Für Strings eben in meiner Validate::toString($_POST['text']) mysql_real_escape_string() verwenden, aber dort am besten nochmal mit get_magic_quotes_gpc() abfragen, ob der String über $_POST, $_GET usw. nicht bereits automatisch escaped wurde.
Zergling-new ist offline  
Alt 06.07.2006, 16:58  
Erfahrener Benutzer
 
Registriert seit: 23.08.2004
Beiträge: 175
tekknotrip
Standard

Zitat:
Wo hast du das gelesen? Ich verwende weiterhin meine alte Syntax und Validate-Klasse.
Auch unter dem obenstehenden Wikipedia Link.

Bedeutet das letztenendes, um die Funktion zu verstehen
Egal was hinter meinen definierten Variablen kommt: Ignoriere es!?

Also z.B. aus diesem Link:
Zitat:
http://webserver/cgi-bin/find.cgi?ID=42;UPDATE+USER+SET+TYPE="admin"+WHERE+ ID=23
Wird bei dieser MySQL Abfrage:
Code:
$abfrage = "SELECT spalte1 FROM tabelle WHERE 
           spalte2 = '".mysql_real_escape_string($_POST['ID'])."'";
folgendes Ergebnis erzielt, als das der Link nichts anderes enthalten hätte ausser:


Sprich mysql_real_escape_string kapp alles, was nicht unter mysql_real_escape_string definiert ist?


Danke Dir schon jetzt.

Das mit dem Definieren der POST Daten mache ich gerne.
Denn es ist später einfacher die definierte $vari zu ändern, als die zigmalvorkommende $_POST. Ist aber letztenendes Geschmackssache (?)
tekknotrip ist offline  
Alt 06.07.2006, 17:51  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Also mal langsam, lies doch mal was ich dir schicke:
Zitat:
mysql_real_escape_string() calls MySQL's library function mysql_real_escape_string, which prepends backslashes to the following characters: \x00, \n, \r, \, ', " and \x1a.
mysql_real_escape_string() setzt einfach Backslashes vor bestimmte Zeichen, die beim Einfügen in SQL relevant sein könnten.

PHP-Code:
<?php
echo "ich benutze ein Anführungszeichen innerhalb von Anführungszeichen so: \", ohne escapen geht das nicht";
?>
Den Backslash \ vor zB " setzen nennt sich escapen. Damit wird dem " die eigentliche Funktion, nämlich den String zu beenden, genommen.

Das SQL-Injection Beispiel von Wikipedia funktioniert im aktuellen PHP überhaupt nicht mehr, denn pro mysql_query() kannst du nur einen Query-Befehl ausführen.
Also einen neuen Befehl kannst du nicht mehr einschleußen, es sei denn der Coder hat absoluten Blödsinn gebaut und der String läßt sich komplett über Eingabe-Parameter verändern (zB den SQL-Befehl per Parameter übergeben).

Das Problem des Ausspähens von Daten mittels UNION oder der Manipulation der Restriktions-Bedingung (WHERE) bleibt, wenn du es erlaubst Strings in Felder zu übergeben, die Zahlen erwarten und deshalb nicht mit Anführungszeichen eingegrenzt sind. Beispiel aus Wikipedia:
Zitat:
Aufruf:
http://webserver/cgi-bin/find.cgi?ID=42+UNION+SELECT+login,+password,+'x'+F ROM+user
Erzeugtes SQL:
SELECT author, subjekt, text FROM artikel WHERE ID=42 UNION SELECT login, password, 'x' FROM user
Wie du siehst ist 42 richtigerweise nicht in Anführungszeichen geschrieben (es ist ja eine Zahl und kein String), aber es wurde eben nicht geprüft, ob es sich auch um eine reine Zahl handelt - zB mittels is_numeric() oder die direkte Wandlung mit intval().

Wenn du jetzt aber Anführungszeichen verwendest und der String nicht escaped wird, kann der "Hacker" dir Sonderzeichen unterjubeln, die deine String-Eingrenzung mittels ' beenden und dadurch das Statement verändern, zB die Bedingung beim Login.

Code:
SELECT * FROM users WHERE username = '$user' AND pw = '$pw'
Wenn für
Code:
$user = admin' --
eingegeben wird benötigt der Angreifer garkein Passwort mehr (-- ist die Kommentar-Funktion von SQL)
Dann käme heraus:
Code:
SELECT * FROM users WHERE username = 'admin' -- 'AND pw = ''
Escaped käme
Code:
SELECT * FROM users WHERE username = 'admin\' --' AND pw = ''
heraus, also würde in der DB nach dem username "admin \' --" gesucht, den gibt es nicht, SQL-Injection gescheitert.


http://de.wikipedia.org/wiki/Escape#...capen.E2.80.9C
http://de.wikipedia.org/wiki/Escapen
Zergling-new ist offline  
Alt 07.07.2006, 07:51  
Erfahrener Benutzer
 
Registriert seit: 23.08.2004
Beiträge: 175
tekknotrip
Standard

Klasse, danke und verstanden

Du bist doch Moderator, ich hätte mal einen Vorschlag da es früher oder später eh jeden interessiert oder interessieren sollte.

Eine Rubrik einzuführen:
PHP - Sicherheit

Dort kann man all diese Themen sammeln, oder aber z.B. wenn man eine grauenhafte Sicherheitslücke in einem geposteten Script entdeckt, dass dort entsprechend zu diskutieren, damit die PHP Gemeinde auch "lernt" sicher zu programmieren.... Denn das bringt uns oftmals in Verruf und schadet uns im allgemeinen langfristig....

Fände ich ne gute Sache.

Gruß, Micha
tekknotrip ist offline  
Alt 07.07.2006, 11:46  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Über die Forenaufteilung in andere Rubriken, statt Anfänger - Profis wurde schon einmal nachgedacht. Allerdings ist PHP-Sicherheit auch ein sehr allgemeines Thema. Aber vielleicht schaust du mal ins Tutorial-Forum, da ist zumindest ein ganz interessanter Beitrag von Basti:
http://www.phpfriend.de/forum/ftopic51631.html
Oder das Tutorial der PHP-Newsgroup:
http://www.php-faq.de/ch/ch-security.html
Zergling-new ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Erledigt] MySQL - ERROR 1044 bei erstellen einer Datenbank _youngenterpriser_ Datenbanken 2 05.02.2008 17:56
Mysql Server Einstellunen Optimieren pchero Datenbanken 3 01.05.2007 19:50
PHP, MySQL installieren frankys9 PHP Tipps 2006 10 16.03.2006 16:05
Kein Zugriff über ODBC mit der IP-Adresse auf MySql DB Datenbanken 4 09.02.2006 11:04
[Erledigt] Mysql 4.1.x unter php 4.3.9 Datenbanken 3 15.11.2005 13:49
Schnittstelle zwischen PHP und MySQL klappt net !!! Datenbanken 16 16.10.2005 14:24
[Erledigt] not allowed to connect to this MySQL server PHP Tipps 2005-2 2 23.09.2005 18:34
MySQL &amp;amp; PHP: Problem mit Password() Datenbanken 10 19.09.2005 11:00
[Erledigt] MySQL Befehl für MySQL 4.0.24 Datenbanken 2 23.08.2005 17:35
Suche Tipps für Persormance-Steigerung (Geld für Nützliches) Beitragsarchiv 18 16.08.2005 10:57
MYSQL läuft nur wenn /tmp auf 777 Datenbanken 5 06.07.2005 08:38
mysql root passwort vergessen Datenbanken 1 29.05.2005 11:33
mysql injection wirkungsvoll verhindern PHP Tipps 2005 4 09.04.2005 18:08
Access denied for user: '@localhost' / SYSTEM@localhost Datenbanken 0 10.11.2004 20:35
[Erledigt] PHP5 &amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;a m p; MySQL Datenbanken 5 01.08.2004 05:47

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
mysql_real_escape_string umgehen, mysql_real_escape_string injection, mysql_real_escape_string, mysql mysql_real_escape_string, mysql_real_escape_string() umgehen, mysql sicherheit mysql_real_escape_string, mysql_real_escape umgehen, mysql real escape umgehen, http://www.php.de/php-tipps-2006/41080-mysql-injection-mysql_real_escape_string.html, mysql injection beispiel, mysql real escape string umgehen, mysql_real_escape_string injections, \\\x1a\ mysql, mysql_real_escape_string tutorial, mysql injection beispiele, umgehen mysql_real_escape_string, php mysql injection mysql_real_escape_string, mysql injection mysql_real_escape_string, sql injection mysql_real_escape_string, mysql injection verhindern

Alle Zeitangaben in WEZ +2. Es ist jetzt 18:08 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.