Suchen
Inside Wiki
Nützliche Links




 
phpforum.de bei Facebook
 
phpforum.de bei Twitter
 

Zurück   PHP Forum: phpforum.de > phpforum.de Wiki > phpforum.de Wiki

PHP Wiki Dieses Wiki sammelt Lösungen, zu Problemen, welche immer wieder im Forum auftauchen.

 
 
Artikel-Optionen Ansicht
  #1  

Standard Magic Quotes

 

Tutorials - Inhalte

 

Zur Geschichte


Wie es begann


Mit Version 3 begann der PHP Siegeszug auf die Webserver dieser Welt. Schnell stellte sich heraus, dass viele der Programmierer schlampig arbeiten und mangels richtigem "Escapens"* riesen Sicherheitslücken in ihre Scripte einbauten. Benutzer Eingaben wurden ungeprüft einfach an die Datenbank weiter gereicht und ermöglichten damit die so genannten "SQL Injections". Ein lauter Aufschrei ging durch die Welt: "Wieder Sicherheitslücken in PHP Scripten aufgedeckt!" Nicht einmal, sondern dutzende von Malen. In den Köpfen der Projekt Entscheider ist davon leider nur eins angekommen: "PHP ist unsicher!"

*) Escapen ist ein neudeutsches Kunstwort. Es bezeichnet das Neutralisieren von bestimmten Zeichen, die in der verwendeten Sprache eine besondere Bedeutung haben. Meist wird dazu ein Backslash vor das entsprechende Zeichen gesetzt. Aus einem " wird also ein \".

Die "gute" Idee


Mit der PHP Version 4 führten die Entwickler dann die magic_quotes ein. Das heißt: Alle Request Variablen werden automatisch an den nötigen Stellen mit Backslashes versehen. Das entspricht der Anwendung von addslashes() auf alle Elemente. Davon gibt es dann auch ein paar Runtime Varianten, welche uns vor bösen Datei- und Datenbankinhalten schützen sollen. Netterweise ist das Ganze auch noch vielfältig ein- und abschaltbar.

Der Katzenjammer


In der Praxis tauchten dann schell ein paar Probleme auf:
  • Die Einstellung kann auf jedem Server anders sein
  • Die "wundersame Backslash Vermehrung" wenn die Daten öfter zwischen Server und Client hin und her pendeln
  • Ab und an defekte SQL Statements
  • Einige Datenbankfunktionen bringen eigene Escaping Methoden mit (z.B. Prepared Statements) was zu doppeltem Escapen führen kann.
  • Bei dem Schreiben in Dateien darf meist nichts escaped werden
  • Ebenso bei Ausgaben zum Browser
Und, wohin führt uns das?
Wenn wir portable Scripte schreiben wollen, müssen wir IMMER herausfinden, wie magic_quotes eingestellt ist und dementsprechend handeln, wenn Benutzereingaben direkt verarbeitet werden. (GET/POST oder über Cookies). Sonst produziert das selbe Script je nach Servereinstellung auf verschiedenen Systemen eventuell Fehler.

Hinweis:
Die Filter Erweiterung ist nicht von der magic_quotes Einstellung betroffen. So greift man mit filter_input und filter_input_array immer auf die Rohdaten zu.

Die Besserung


Mit PHP6 fliegt magic_quotes endlich wieder raus! Welches dann der Off Einstellung früherer PHP Versionen entspricht.


Die Lösung


Wenn wir möglichst portable Scripte schreiben wollen und die magic_quotes Abhandlung nicht an tausend Ecken im Script vornehmen möchten, bietet sich nur ein schöner Weg an:
  1. Ganz am Anfang des Scriptes die überflüssigen Backslashes alle wieder rausoperieren
  2. Das ganze magic-runtime Gedöns abschalten
  3. Im Rest der Scriptes, davon ausgehen, dass magic_quotes=OFF steht
So konzentrieren wir die Abhandlung nur auf eine Datei.

Hier mal ein Beispiel für eine solche Abhandlung:
PHP Quellcode:
<?php

if(function_exists('get_magic_quotes_gpc')&& get_magic_quotes_gpc()) // PHP6 safe
{
  if(!function_exists('array_stripslashes'))
  {
      // man könnte unter PHP5+6 auch mit
      // array_walk_recursive() arbeiten
      function array_stripslashes(&$var)
      {
          if(is_string($var))
             $var = stripslashes($var);
          else
              if(is_array($var))
                   foreach($var AS $key => $value)
                      array_stripslashes($var[$key]);
      }
  }

  // die wichtigsten
  array_stripslashes($_GET);
  array_stripslashes($_POST);
  array_stripslashes($_COOKIE);

  // seltener notwendig
  array_stripslashes($_REQUEST);
  array_stripslashes($_FILES);
}


if(function_exists('set_magic_quotes_runtime')) // PHP6 safe
    set_magic_quotes_runtime(FALSE); // abschalten
// magic_quotes_sybase ist damit auch automatisch aus

?>

Warnung:
Dieser Quellcode schützt nicht vor Angriffen irgendwelcher Art.
Ganz im Gegenteil, er überträgt die volle Verantwortung wieder an den Programmierer!
Da wo sie auch hingehört!

« Vorheriges Kapitel   Tutorials
  Nächstes Kapitel »

Mitwirkende: combie, Gary, Heine, Gefrierbrand
Erstellt von combie, 27.01.2008 am 16:45
Zuletzt bearbeitet von combie, 23.02.2009 am 23:53
2 Kommentare , 22523 Betrachtungen

Dieser Text steht unter der GNU-Lizenz für freie Dokumentation


 

Lesezeichen

Stichworte
grundlagen, magic_quotes

Artikel-Optionen
Ansicht

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

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.

Gehe zu
Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Image magic bilder terrorkrümel PHP 2 23.03.2007 10:18
Quotes replacen durch deutsche Anführungszeichen breaddes PHP 2 19.04.2006 16:11
Problem mit Quotes und Formularfeldern r.kretzer PHP 6 01.04.2005 03:11
Ausschalten der Magic Quotes innerhalb eines Php-scripts ? markus_haupt PHP 8 28.02.2004 18:56
3 "quotes Dave PHP 9 27.05.2003 18:45


Alle Zeitangaben in WEZ +2. Es ist jetzt 00:06 Uhr.


Powered by vBulletin® Version 3.8.8 (Deutsch)
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Powered by NuWiki v1.3 RC1 Copyright ©2006-2007, NuHit, LLC