<b>REGISTER</b>

GFX-Sector - PHP und MySQL Tutorials


 
GFX-Sector » Coding Area » Coding-Tutorials » PHP und MySQL Tutorials » [PHP/MySQL] PHP-Skripte absichern - Teil 1: (Remote) SQL-Injections » Hello Guest [Login|Register]
Last Post | First Unread Post Print Page | Recommend to a Friend | Add Thread to Favorites

PHP und MySQL Tutorials

Tutorials über die serverseitige Programmierung mit PHP und der Datenbank MySQL
Post New Thread Post Reply

PHP-Skripte absichern - Teil 1: (Remote) SQL-Injections

     Deutsche Version  English version
Author
Post « Previous Thread | Next Thread »

thaseek thaseek is a male
Zauberstabbenutzer


Avatar von thaseek

Registration Date: 25.11.2007
Posts: 15
Location: Heilbronn, BW
Program: Adobe Fireworks CS3

Spacer
PHP-Skripte absichern - Teil 1: (Remote) SQL-Injections

PHP-Skripte absichern - Teil 1: (Remote) SQL-Injections

      

PHP-Skripte absichern – Teil 1: (Remote) SQL-Injections

Hallo liebe Community,

in meinem ersten Tutorial möchte ich mich einem der größten Sicherheitsrisiken in PHP-Code widmen: den SQL-Injections. Darunter versteht man das Einschleusen von bösartigem Code in SQL-Abfragen des Scriptes.

Zum besseren Verständnis beginnen wir mit einem Beispiel:

Tatort: Benutzerdatenbank. Der Benutzer kann seinen Benutzernamen in einem Formular eingeben; der eingegebene Wert wird in der Variablen $name gespeichert. Dann kommt der Knackpunkt, nämlich die ungesicherte Datenbankabfrage:
php:
1:
mysql_query(“SELECT FROM users WHERE username=’”.$name.”’”);


Der Angreifer gibt als Benutzernamen z.B. Folgendes an:
code:
1:
thaseek’; DELETE FROM users

Bei Datenbanksystemen, die solche „stacked queries“ unterstützen, ist die Benutzertabelle jetzt leer.

Das Problem ist, dass jeder Benutzer nach Belieben einzelne oder doppelte Anführungszeichen setzen (und damit die vorgesehene SQL-Abfrage erweitern) kann.

Um das zu vermeiden, müssen den Anführungszeichen Backslashes \ vorangestellt werden; man nennt das „escapen“. PHP bietet von Haus aus einen Mechanismus, der das bewerkstelligen kann, nämlich magic_quotes_gpc. Jedoch sollte immer der Escaping-Mechanismus der verwendeten Datenbank verwendet werden, da diese Option nur rudimentären (und verallgemeinerten) Schutz bietet.
Um also eine Ausgangsbasis für eine ordentliche Verarbeitung des Ganzen zu erreichen, müssen die Auswirkungen der Magic Quotes zuerst rückgängig gemacht werden, indem die eingefügten Slashes entfernt werden:
php:
1:
2:
3:
if(get_magic_quotes_gpc()) { //Magic Quotes sind aktiviert
            $name stripslashes($name);
        }


Dann wenden wir die datenbankeigene Escape-Funktion an. Im Falle von MySQL ist das mysql_real_escape_string():
php:
1:
$name mysql_real_escape_string($name);


Jetzt kann $name guten Gewissens eingesetzt werden.



Aber Vorsicht: Anders als gemeinhin angenommen, ist es mit mysql_real_escape_string() nicht immer getan, um SQL-Abfragen abzusichern. Zur Veranschaulichung wiederum ein Beispiel:

Angenommen, ihr habt ein Newsscript im Einsatz, das über folgende URL erreichbar ist:
http://www.beispieldomain.de/news.php?id=XYZ , wobei XYZ natürlich durch einen ganzzahligen Wert zu ersetzen ist, anhand dessen der Newseintrag in der Datenbank gesucht wird:
php:
1:
2:
3:
4:
5:
6:
7:
$id $_GET[‘id’];
if(get_magic_quotes_gpc()) { //Magic Quotes sind aktiviert
            $id stripslashes($id);
        } 
$id mysql_real_escape_string($id);
$query "SELECT * FROM news WHERE id=".$id$result mysql_query($query);


Ein Angreifer vermutet eine solche Sicherheitslücke und ruft die Seite mit einem modifizierten Parameter auf:
http://www.beispieldomain.de/news.php?id=1;DELETE%20FROM%20news
Damit ließe sich der Inhalt der gesamten Newsdatenbank löschen, ohne die Zugangsdaten zur Datenbank zu kennen.

Moment mal, werden jetzt einige sagen, wo ist hier eigentlich eine Sicherheitslücke?
Die Crux liegt im verwendeten Datentyp, denn der erwartete Integerwert wird ohne rahmende Anführungszeichen verarbeitet; der schöne Escaping-Mechanismus läuft also ins Leere.

Um dem abzuhelfen, muss der Wert der Variablen vor der Verwendung unbedingt auf den gewünschten Datentyp gebracht werden.

Erste Möglichkeit: umwandeln mittels der Funktion intval():
php:
1:
$id intval($id);


Zweite Möglichkeit: Klassisches Typecasting:
php:
1:
$id = (int) $id;


Anschließend kann $id in der Datenbankquery eingesetzt werden.


So, fürs erste wären wir soweit – ich hoffe, dass ich euch mit diesem Tutorial weiterhelfen konnte. Trotzdem ist das noch nicht alles, was man bei SQL-Abfragen beachten sollte. Auf Wunsch gibt es dazu demnächst mehr smile
Danke fürs Lesen & stay tuned for my next contribution Wink



Thanks for this thread by the author

Until now 3 users have thanked

This post has been edited 2 time(s), it was last edited by thaseek: 21.12.2007 20:38.

PHP-Skripte absichern - Teil 1: (Remote) SQL-Injections 21.12.2007 20:33 thaseek is offline Search for Posts by thaseek

Fireball Fireball is a male
Boardchef


Avatar von Fireball

Registration Date: 11.11.2006
Posts: 16,355
Classing-Rank: GFX-Sector
Location: Bremen, Deutschland
Program: Adobe Photoshop CS2
Deviantart: oenismaster
Forums: (alle)

Spacer
      

Hey, hast ja doch noch an uns gedacht Zunge raus
Habe dir ja vor einiger Zeit in ICQ schon gesagt, dass ich das Tutorial sehr gut finde!
Daher nochmals vielen Dank smile



PHP-Skripte absichern - Teil 1: (Remote) SQL-Injections 21.12.2007 20:38 Fireball is offline Homepage of Fireball Search for Posts by Fireball

thaseek thaseek is a male
Zauberstabbenutzer


Avatar von thaseek

Registration Date: 25.11.2007
Posts: 15
Location: Heilbronn, BW
Program: Adobe Fireworks CS3

Thread Starter Thread Started by thaseek
Spacer
      

danke fröhlich
wie versprochen habe ich das tut nochmal gründlich überarbeitet Wink

PHP-Skripte absichern - Teil 1: (Remote) SQL-Injections 21.12.2007 20:39 thaseek is offline Search for Posts by thaseek

Mr. Tool Mr. Tool is a male
Pfadfinder

Spender


Mr. Tool hat kein Avatar

Registration Date: 17.06.2007
Posts: 531
Location: Österreich
Program: Photoshop CS2
Deviantart: verel

Spacer
      

also dadurch das ich mich mit den injections ned so auskenn und glaub da braucht man ja perl kenntnisse dazu hab ich einfach mal die version mit der url probiert.

hat aber nix gemacht hat einfach meine error seite angezeigt..



PHP-Skripte absichern - Teil 1: (Remote) SQL-Injections 21.12.2007 21:27 Mr. Tool is offline Homepage of Mr. Tool Search for Posts by Mr. Tool

thaseek thaseek is a male
Zauberstabbenutzer


Avatar von thaseek

Registration Date: 25.11.2007
Posts: 15
Location: Heilbronn, BW
Program: Adobe Fireworks CS3

Thread Starter Thread Started by thaseek
Spacer
      

nein, mit perl hat das nichts zu tun Wink

abgesehen davon: ich weiß nicht genau, was du ausprobiert hast; der code da oben ist nur zur grundsätzlichen verdeutlichung der problematik da. (die einschränkung steht indirekt im text, mysql_query unterstützt nämlich kein stacking, steht damit aber allein auf weiter flur...)

PHP-Skripte absichern - Teil 1: (Remote) SQL-Injections 21.12.2007 21:39 thaseek is offline Search for Posts by thaseek

Mr. Tool Mr. Tool is a male
Pfadfinder

Spender


Mr. Tool hat kein Avatar

Registration Date: 17.06.2007
Posts: 531
Location: Österreich
Program: Photoshop CS2
Deviantart: verel

Spacer
      

ich glaub wir reden uns mal über icq oder so zusammen.. XD

würd das was du da erkärt hast mal wirklich ausprobieren (Test Instanz)
XD

danke



PHP-Skripte absichern - Teil 1: (Remote) SQL-Injections 21.12.2007 23:24 Mr. Tool is offline Homepage of Mr. Tool Search for Posts by Mr. Tool

Babbsdrebbler
Weichzeichner


Babbsdrebbler hat kein Avatar

Registration Date: 14.03.2007
Posts: 51

Spacer
      

Oder bei id auch is_numeric() wenn man die Sachen vorher schon überprüft hat man nachher weniger Arbeit.

Und bei Passwörtern würde ich mir per SQL erst die userdaten ziehen (abfrage per name) und dann die Passwörter in PHP vergleichen.

PHP-Skripte absichern - Teil 1: (Remote) SQL-Injections 22.12.2007 10:52 Babbsdrebbler is offline Search for Posts by Babbsdrebbler

thaseek thaseek is a male
Zauberstabbenutzer


Avatar von thaseek

Registration Date: 25.11.2007
Posts: 15
Location: Heilbronn, BW
Program: Adobe Fireworks CS3

Thread Starter Thread Started by thaseek
Spacer
      

quote:
Original von Babbsdrebbler
Oder bei id auch is_numeric() wenn man die Sachen vorher schon überprüft hat man nachher weniger Arbeit.

Und bei Passwörtern würde ich mir per SQL erst die userdaten ziehen (abfrage per name) und dann die Passwörter in PHP vergleichen.


ich würde - wenn überhaupt - für is_int() plädieren; is_numeric() lässt so einige werte durch, die man im falle des obigen beispiels nicht haben will Wink ich wollte hier übrigens den schnellsten weg zeigen, und das sind nunmal die beiden einzeiler.

bzgl. den passwörtern widerspreche ich nebenbei bemerkt nicht - ich habe aber auch nichts anderes behauptet.

This post has been edited 1 time(s), it was last edited by thaseek: 22.12.2007 11:54.

PHP-Skripte absichern - Teil 1: (Remote) SQL-Injections 22.12.2007 11:53 thaseek is offline Search for Posts by thaseek

Babbsdrebbler
Weichzeichner


Babbsdrebbler hat kein Avatar

Registration Date: 14.03.2007
Posts: 51

Spacer
      

is_numeric ist halt auch für numerische Zeichenketten, es lässt aber auch noch die entsprechenden hexzeichen durch.

Und das 2. war ein Beispiel großes Grinsen

PHP-Skripte absichern - Teil 1: (Remote) SQL-Injections 22.12.2007 13:03 Babbsdrebbler is offline Search for Posts by Babbsdrebbler

xsypt xsypt is a male
Homofürst =)


Avatar von xsypt

Registration Date: 13.11.2006
Posts: 168
Location: Achim / Bremen
Program: Photoshop CS4

Spacer
      

gibt es auch Dateitypen die nur aus den Zeichen 0-9 und a-z bestehen können?

Ich hab dazu schon ein bisschen gegoogelt, hab aber nur was über die Längen gefunden.



PHP-Skripte absichern - Teil 1: (Remote) SQL-Injections 13.01.2008 21:57 xsypt is offline Search for Posts by xsypt

sjBlack sjBlack is a male
Zauberstabbenutzer


Avatar von sjBlack

Registration Date: 29.02.2008
Posts: 18
Program: GIMP

Spacer

PHP-Skripte absichern - Teil 1: (Remote) SQL-Injections

      

EIn Auszug aus includes/funcions_main.php meiner eigenen Forensoftware

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
// Eigene addslashes-Funktion deklarieren.
// Der Optionswert für magic_quotes_gpc spielen damit praktisch keine Rolle.
if (get_magic_quotes_gpc() == 0)
{
	function em_addslashes($string) {return addslashes($string);}

	function em_unaddslashed($string) {return strtr($string, array('\\\\' => '\\', '\\' => ''));}
}
	else
{
	function em_addslashes($string) {return $string;}

	function em_unaddslashed($string) {return $string;}
}

Besser evrwendet wäre aber eher http://de3.php.net/manual/de/function.stripslashes.php als strtr()

Und das passiert mit einem, der die Auswirkungen solcher Fehler unterschätzt XDDD
http://rapidshare.com/files/94689389/sql..._by_paloxus.avi

Salzt eure Passworthashesauch noch zusätzlich für alle Fälle.
http://de.wikipedia.org/wiki/Salted_Hash



Kostenlose MP3s und Wave-Loops zum selber Mixen

This post has been edited 2 time(s), it was last edited by sjBlack: 29.02.2008 23:58.

PHP-Skripte absichern - Teil 1: (Remote) SQL-Injections 29.02.2008 23:55 sjBlack is offline Homepage of sjBlack Search for Posts by sjBlack

brendel
Fingerwischer


brendel hat kein Avatar

Registration Date: 09.12.2007
Posts: 28

Spacer
      

schönes tutorial, mache es auch so ähnlich. habe alle sonderzeichen in einem array getan und fals da einer drinn vorkommt -> error <- fragt er nix in der mysql ab.

Gruß

PHP-Skripte absichern - Teil 1: (Remote) SQL-Injections 15.03.2008 02:37 brendel is offline Homepage of brendel Search for Posts by brendel

NEO_2.0 NEO_2.0 is a male
Filtertester


NEO_2.0 hat kein Avatar

Registration Date: 29.04.2011
Posts: 2

Spacer
      

Nettes Tut. Kannst ja auch mal was über Blind Injection reinstellen smile

PHP-Skripte absichern - Teil 1: (Remote) SQL-Injections 29.04.2011 11:39 NEO_2.0 is offline Search for Posts by NEO_2.0
 
Spacer
   
GFX-Sector
unregistered


 hat kein Avatar


Spacer

Have you enjoyed this topic?


If you were enjoying this post and if you keen on reading more interesting stuff then do not hesitate to complete the free sign up.

After the free registration you will gain access to all areas and you will be able to communicate with other artists from all over the world.

In addition you will benefit from our Photoshop and coding section as well as from our huge (hundreds of gigabytes) free resource section where you can find everything you will need to be a successful (web) designer/artist.

Sign up now and enjoy the advantages as a registered member.

(This website will be ad-free after a complete free sign up.)

New Post 29.04.2011 11:39  
Tree Structure | Board Structure
Post New Thread Post Reply
GFX-Sector » Coding Area » Coding-Tutorials » PHP und MySQL Tutorials » [PHP/MySQL] PHP-Skripte absichern - Teil 1: (Remote) SQL-Injections

Similar topics to PHP-Skripte absichern - Teil 1: (Remote) SQL-Injections
Thread
[Frage] Parisurteil - Kreative Auseinandersetzung/Illustration (Forum: Fragen & Probleme)
Tutorial-Section Unterteiln (: (Forum: Feedback)
Heute - 18 Uhr Live Mikogo Tutorial - Teil 2 (Forum: Anderes)
My first Design ( Noob Teil ^^) (Forum: Designs)
[PHP/MySQL] PHP-Skripte absichern – Teil 2: XSS (Forum: PHP und MySQL Tutorials)