kölir: magic_quotes und stripslashes

Hallo,

bei meinem Server ist magic_quotes on und es wird also auf alle GPC-Daten addslashes angewand.

Aber wenn ich diese Daten ausgeben muss, muss ich sie ja wieder entfernen die slashes? also stripslashes, aber dann ist er ja wiede gefährlich der strin o.ä.

wie sll ich ihn dann ohne \ ausgeben?

  1. Hallo,

    Aber wenn ich diese Daten ausgeben muss, muss ich sie ja wieder entfernen die slashes? also stripslashes, aber dann ist er ja wiede gefährlich der strin o.ä.

    Wenn due die Daten ausgibst sind sie meines Erachtens weniger gefährlich, wobei du natürlich immernoch prüfen musst, ob die Ausgabe beim Empfänger Probleme bereitet z.B. <script>Bereiche im HTML.

    Die Slashes sind dagegen bei der serverseitigen Verarbeitung wichtig, wenn du die Daten z.B. in eine Textdatei oder eine Datenbank schreibst.
    Bei letzteren ist aber auch von addslashes abzuraten, stattdessen sollte die entsprechende Escapefunktion des Datenbanksystems verwendet werden. Z.B. bei MySQL wäre das die Funktion mysql_real_escape_string().

    Gruß;

  2. n'abend,

    bei meinem Server ist magic_quotes on und es wird also auf alle GPC-Daten addslashes angewand.

    das lässt sich (Gott sei dank) auch abschalten.

    Aber wenn ich diese Daten ausgeben muss, muss ich sie ja wieder entfernen die slashes? also stripslashes, aber dann ist er ja wiede gefährlich der strin o.ä.

    Du unterliegst hier offenbar einem Denkfehler. Das "Unschädlich machen von Sonderzeichen durch Voranstellung eines Backslashes ()" ist lediglich dann notwendig, wenn du Strings (mit Sonderzeichen wie z.B. doppelten Anführungszeichen (")) in einen anderen String integrieren musst (um bspw. eine SQL-Query zu bauen).

    Wenn du gewisse Zeichen (im Wesentlichen < und > und &) unschädlich machen willst, weil du den String an den Browser ausgeben willst, ist htmlspecialchars() dein Freund. Backslash-escaped Zeichen machen deine Ausgabe allenfalls invalide.

    weiterhin schönen abend...

    --
    Freundlich wie man war, hat man mir Großbuchstaben geschenkt.
    sh:( fo:# ch:# rl:| br:> n4:& ie:{ mo:} va:) de:] zu:} fl:( ss:? ls:[ js:|
    1. das lässt sich (Gott sei dank) auch abschalten.

      aber nur von meinem hostrer oder?

      Und für ein normales echo sind " und ' nicht gefährlich ich dachte an Eingaben wie
      geb des aus"; böse_sachen; echo"

      wenn ich das jetzt unescaped mit echo "" ausgebe wird doch böse_sachen ausgeführt oder?

      echo "geb des aus"; bose_sachen; echo"";

      grüßle

      1. echo $begrüßung;

        das lässt sich (Gott sei dank) auch abschalten.
        aber nur von meinem hostrer oder?

        Das PHP-Handbuch widmet dem Thema eine eigene Seite: Disabling Magic Quotes. Wenn PHP als Modul im Apachen läuft, kannst du die .htaccess-Variante probieren. Manche Provider lesen (vor allem bei CGI) auch eine im Verzeichnis liegende php.ini. Wenn dieses keine Optionen sind ist es empfehlenswert, das auf der Seite angegebene Codebeispiel einmalig am Scriptanfang einzufügen und den restlichen Quelltext von strip_slash-Orgien zu verschonen.

        Und für ein normales echo sind " und ' nicht gefährlich ich dachte an Eingaben wie
        geb des aus"; böse_sachen; echo"

        Es ist nur dann "gefährlich", wenn es geparst werden muss (z.B. bei eval). Was sich bereits in einer Variable befindet ist harmlos. Zumindest für PHP. Wenn es in andere Kontexte (HTML, SQL, URL) gebracht werden soll, ist es dem Kontext entsprechend zu behandeln.

        wenn ich das jetzt unescaped mit echo "" ausgebe wird doch böse_sachen ausgeführt oder?

        Nein, nicht in PHP, das gibt es einfach nur aus. Dass es möglicherweise im anzeigenden Kontext (Webseite) Dinge tun kann, steht auf einem anderen Blatt.

        echo "$verabschiedung $name";

  3. Hallo,

    Ich habe dafür zwei Funktionen:

    // kill Magic Quotes  
    // wenn magic_quotes an ist dann wird es weggemacht, wenn nicht dann nicht  
    // ich verwende es so $get = strip($_GET); und verwende dann das $get  
    function strip($_data) {  
      if (!get_magic_quotes_gpc()) return $_data;  
      else {  
            if (is_array($_data)) foreach($_data as $key => $val) $_data[$key] = strip($val);  
            else $_data = stripslashes($_data);  
            return $_data;  
      }  
    }  
      
    // escape input for mysql  
    // Wird sachen (auch Arrays) angewendet die in MySQL gespeichert werden.  
    // $mysql_data = escape_for_mysql($data);  
    function escape_for_mysql($_data) {  
            if (is_array($_data)) foreach($_data as $key => $val) $_data[$key] = escape_for_mysql($val);  
            else $_data = mysql_escape_string($_data);  
            return $_data;  
    }
    

    Grüße
    Jeena Paradies

    --
    Geek Meet in Göteborg - erstes auf Schwedisch | Jlog | Gourmetica Mentiri
    1. Moin!

      // kill Magic Quotes
      // wenn magic_quotes an ist dann wird es weggemacht, wenn nicht dann nicht
      // ich verwende es so $get = strip($_GET); und verwende dann das $get

      Was nicht ganz so schön ist, weil $get natürlich keine superglobale Variable ist. Andererseits sollte man Funktionen sauber kapseln, dieses superglobale ist ja sozusagen ein automatisches "global" auf die Variablen - und da "global" böse ist, sind auch Superglobals böse (zumindest in diesem Aspekt).

      // escape input for mysql
      // Wird sachen (auch Arrays) angewendet die in MySQL gespeichert werden.
      // $mysql_data = escape_for_mysql($data);

      Diese Funktion hingegen ist echt böse. mysql_escape_string() sollte man nicht mehr verwenden. Der Ersatz mysql_real_escape_string() hingegen benötigt die geöffnete DB-Verbindung, für die escaped werden soll. Sowas ist mit so einer Funktion nicht wirklich nett hinzukriegen, weil die MySQL-Connection noch mit übergeben werden müßte.

      Ich hab mir zu diesem Zweck einfach die Escape-Funktion als Methode meines Datenbank-Singleton-Objekts eingebaut. Dann brauche ich nur $db->escape($string) aufrufen - ist außerdem kürzer und schneller getippt.

      - Sven Rautenberg

      --
      "Love your nation - respect the others."
      1. Ich hab mir zu diesem Zweck einfach die Escape-Funktion als Methode meines Datenbank-Singleton-Objekts eingebaut. Dann brauche ich nur $db->escape($string) aufrufen - ist außerdem kürzer und schneller getippt.

        Hi,

        was ist dieses Datenbank-Singleton-Object habe es schon öfters gehört aber was ist das?

        Ich ache halt ganz normal eine mysql-Verbinfdung wähle die Datenbank ud mach deann meine selcts und co..

        aber was ist das Singleton object?

        gruß

        1. Moin!

          was ist dieses Datenbank-Singleton-Object habe es schon öfters gehört aber was ist das?

          Wenn du objektorientiert programmierst, dann kommst du dann und wann in die Situation, dass du eine Klasse zwar als Objekt instanziieren mußt, aber egal wo in deinem Programm - es darf jeweils nur ein einziges, einmaliges Objekt geben. Jeder weitere Versuch darf nur wieder das bereits einmal erzeugte Objekt zurückgeben.

          Weil das Problem häufiger auftritt, haben sich Menschen dafür irgendwann mal a) einen Namen (Singleton-Pattern) und praktischerweise b) auch noch direkt Methoden ausgedacht, wie man das realisieren kann. "Pattern" heißt nämlich "Muster", und z.B. für das Singleton-Pattern sind deshalb in vielen verschiedenen Programmiersprachen diverse Umsetzungen dieses Musters im Netz recherchierbar. Von denen muß man sich dann nur noch eine aussuchen, die einem gefällt, und kann dann recht sicher sein, dass diese Beispielumsetzung funktioniert und das Problem löst (sofern man keine Fehler einbaut).

          Ich ache halt ganz normal eine mysql-Verbinfdung wähle die Datenbank ud mach deann meine selcts und co..

          aber was ist das Singleton object?

          In meinem Projekt habe ich exakt EINE Datenbankverbindung zu meiner einzigen Datenbank. Deshalb habe ich das Singleton-Pattern gewählt, um überall immer nur eine einzige Datenbankconnection aufzubauen, auch wenn ich evtl. mehrere Datenbankobjekte instanziieren sollte.

          Du kannst sowas aber auch vollkommen ohne Singleton-Pattern machen - einfach eine Klasse definieren, die Methoden zum DB-Connect (z.B. im Konstruktor realisiert) und für diverse Operationen (Query, Escape, Fehlerabfrage, ggf. Logging) bereithält.

          Meine DB-Klasse macht beispielsweise eigentlich ziemlich wenig. Wenn man es genau nimmt, gibt es für alles, was es als benutzen mysql_whatever()-Befehl gibt, eine passende, nahezu identisch arbeitende Methode (bis auf den Query - der liefert gleich das gesamte Array der Abfrage zurück, nicht nur einen Datensatz). Das realisiere ich so, weil ich dann dieses Objekt viel besser in meinen Unit-Tests anderer Klassen simulieren kann (also ohne echte Datenbank so tun, als hätte ich eine Datenbank mit definierten Daten).

          - Sven Rautenberg

          --
          "Love your nation - respect the others."
          1. Wenn du objektorientiert programmierst, dann kommst du dann und wann in die Situation, dass du eine Klasse zwar als Objekt instanziieren mußt, aber egal wo in deinem Programm - es darf jeweils nur ein einziges, einmaliges Objekt geben. Jeder weitere Versuch darf nur wieder das bereits einmal erzeugte Objekt zurückgeben.

            Weil das Problem häufiger auftritt, haben sich Menschen dafür irgendwann mal a) einen Namen (Singleton-Pattern) und praktischerweise b) auch noch direkt Methoden ausgedacht, wie man das realisieren kann. "Pattern" heißt nämlich "Muster", und z.B. für das Singleton-Pattern sind deshalb in vielen verschiedenen Programmiersprachen diverse Umsetzungen dieses Musters im Netz recherchierbar. Von denen muß man sich dann nur noch eine aussuchen, die einem gefällt, und kann dann recht sicher sein, dass diese Beispielumsetzung funktioniert und das Problem löst (sofern man keine Fehler einbaut).

            das klingt interessant

            ist das auch mit pdo und smarty möglich?
            als PHP Version ist hier php 5.2.0 im Einsatz

            Janine :-)

            1. Moin!

              ist das auch mit pdo und smarty möglich?
              als PHP Version ist hier php 5.2.0 im Einsatz

              Nimm dann lieber mysqli - das bietet hinsichtlich der Klassenunterstützung nochmal komplett andere Features, die wirklich sehr nett klingen (habe ich mangels PHP 5.x noch nicht selbst probieren können).

              - Sven Rautenberg

              --
              "Love your nation - respect the others."
              1. Hi!

                ist das auch mit pdo und smarty möglich?
                als PHP Version ist hier php 5.2.0 im Einsatz

                Nimm dann lieber mysqli - das bietet hinsichtlich der Klassenunterstützung nochmal komplett andere Features, die wirklich sehr nett klingen (habe ich mangels PHP 5.x noch nicht selbst probieren können).

                das wird mir bei mein postgres-Projekt wenig helfen :-)

                ich verwende pdo, da es Datenbankunabhängig ist
                soll heißen, immer die gleichen Funktionsnamen bei allen Datenbanken

                liebste Grüße
                Janine

      2. echo $begrüßung;

        Ich hab mir zu diesem Zweck einfach die Escape-Funktion als Methode meines Datenbank-Singleton-Objekts eingebaut. Dann brauche ich nur $db->escape($string) aufrufen - ist außerdem kürzer und schneller getippt.

        Alternativvorschlag: Wenn man nicht auf die mysql-Extension angewiesen ist und stattdessen mysqli oder PDO nutzen kann, kann man sich zwar nicht das Ent-Magic-Quoten sparen aber das Quoten für die Datenbank. Man verwendet dann einfach Prepared Statements mit Platzhaltern für die variablen Werte und übergibt diese dann unbehandelt in einem zweiten Schritt. Um die ordnungsgemäße Übertragung kümmert sich dann mysqli bzw. PDO selbst.

        echo "$verabschiedung $name";