muenzchen: Wie funktionieren addslashes() und stripslashes() ?

Hallo!

Wie man diese Funktionen auf einen String, der fix im Quelltext steht, anwendet, weiß ich. Aber wie geht das bei einem Textfeld, das über ein Formular abgeschickt und dann ausgegeben wird?

Da werden ja immer automatisch "" vor die zu schützenden Zeichen gesetzt, aber wie bekomme ich die wieder weg?

Ich würde es gerne mit addslashes() machen, aber wie eght das während dem Senden?

MfG, muenzchen

  1. Hallo!

    Das geht nicht "während dem Senden", erst wenn Du die Daten in PHP hast($_POST oder $_GET) kannst Du sie bearbeiten. Wenn Du ein Textfeld mit dem Namen "Text" hast, und das Forumular mit POST an das PHP-Script schickt, steht der Wert on $_POST['Text'].  Wenn Du jetzt die Slashes entfernen willst, benutze die PHP-Funktion stripslaches - das Gegenstück zu addslashes, siehe http://www.php3.de/manual/de/function.stripslashes.php.

    Grüße
    Andreas

  2. Aber wie geht das bei einem Textfeld, das über ein Formular abgeschickt und dann ausgegeben wird?

    Da werden ja immer automatisch "" vor die zu schützenden Zeichen gesetzt, aber wie bekomme ich die wieder weg?

    Schalte die Einstellung magic_quotes_gpc in den PHP-Einstellungen aus, entweder direkt in der php.ini oder, falls Du dort keinen Zugriff hast, mit einer Zeile in der obersten .htaccess:

    php_flag magic_quotes_gpc off

    Dann hast Du Ruhe, mußt Dich allerdings wenn nötig (Datenbanken) mit Funktionen wie mysql_escape_string() bewaffnen. IMHO ist das aber seltener der Fall als jener, wo die automatischen Schrägstriche stören.

    Daß Benutzereingaben sowieso nur durch htmlentities() in eine HTML-Seite ausgegeben werden sollten, sollte eine Selbstverständlichkeit sein. Denn gegen Eingaben à la '<style type="text/css">body {display:none}</style>' hilft weder magic_quotes_gpc noch addslashes().

    Ich würde es gerne mit addslashes() machen,

    addslashes() fügt Schrägstriche hinzu, zum Wegnehmen ist stripslashes() gedacht. Vertippt? Oder meinst Du etwas ganz anderes?

    aber wie eght das während dem Senden?

    Beim Senden werden die Schrägstriche nicht eingebaut, das passiert nur mit Daten, die empfangen werden (ein kleiner, aber feiner Unterschied). Daher auch der Name magic_quotes_gpc: gpc wie Get, Post, Cookie.

    Gruß,
      soenk.e

    1. Hört sich ja ziemlich schwer an ohne diesem magic_quotes_gpc.

      Ich meinte schon addslashes, nur verstehe ich nicht ganz, wie das dann funktionieren soll.

      Wie mache ich das dann manuell, mit addslashes? Das automtisch Setzen der Slashes geschieht ja irgendwann zwischen dem Absenden und der Ausgabe des Textes.

      Das habe ich jetzt noch nicht ganz verstanden.

      1. Hört sich ja ziemlich schwer an ohne diesem magic_quotes_gpc.

        Nein, IMHO umgekehrt. Hast Du die magic_quotes_gpc ausgestellt, kommen die Schrägstriche nicht mehr automatisch und Du kannst auf stripslashes() verzichten.

        Ich meinte schon addslashes, nur verstehe ich nicht ganz, wie das dann funktionieren soll.

        Wie mache ich das dann manuell, mit addslashes?

        Was möchtest Du denn jetzt machen?

        Automatische Schrägstriche
        --------------------------
        Wenn Du es so machen willst, wie bisher, mit automatischen Schrägstrichen, mußt Du vor (fast) jeder Benutzung der von außen kommenden Variablen stripslashes() aufrufen, um die Schrägstriche zu entfernen:

        echo htmlentities(stripslashes($_POST["urmel"]));

        In besonderen Fällen, zum Beispiel bei der Übergabe an eine MySQL-Datenbank, brauchst Du allerdings die Schrägstriche (was auch der Grund für diese Automatisch-Eingefügen-Funktion von PHP ist). Hier kannst Du die Variable dann einfach direkt übergeben:

        mysql_query("insert into tabelle set urmel='".$_POST["urmel"]."'");

        Keine automatischen Schrägstriche
        ---------------------------------
        Schaltest Du hingegen die automatischen Schrägstriche aus, kannst Du auf stripslashes() verzichten:

        echo htmlentities($_POST["urmel"]);

        Damit allerdings Datenbanken nicht über gewisse Zeichen stolpern, mußt Du jetzt hier Schrägstriche manuell hinzufügen:

        mysql_query("insert into tabelle set urmel='".mysql_escape_string($_POST["urmel"])."'");

        (mysql_escape_string() macht im Prinzip dasselbe wie addslashes(), ist aber speziell für MySQL gedacht.)

        Nun wirst Du sicherlich sagen, daß es ziemlich wurscht ist, welche der beiden Varianten man benutzt, manuelles Löschen oder manuelles Hinzufügen.
        Der kleine Unterschied ist jedoch, daß (zumindest meinem Gefühl nach) mehr Sachen ausgegeben (echo) als in Datenbanken verwendet werden (mysql_query). Unter dieser Annahme ist es sinnvoller, nur in den selteneren Fällen, sprich bei Bedarf (mysql_query) Schrägstriche einzufügen, anstatt in den häufigeren Fällen (echo) die Schrägstriche rausnehmen zu müssen. Anders ausgedrückt: Hast Du in einem Skript fünf echo()s und zwei Datenbankanfragen mysql_query(), kannst Du Dich entscheiden zwischen fünfmal /-Löschen mit stripslashes() (für echo) oder zweimal /-Hinzufügen mit mysql_escape_string() (für mysql_query).

        Für welchen Weg Du Dich entscheidest, mußt Du selbst wissen.

        Davon unabhängig: Auf das htmlentities() bei Ausgaben wie im Beispiel oben kann man so oder so nicht verzichten.

        Das automtisch Setzen der Slashes geschieht ja irgendwann zwischen dem Absenden und der Ausgabe des Textes.

        Das automatische Einfügen passiert, wenn das PHP-Skript (bzw. der PHP-Interpreter) die Daten vom Browser empfängt, aber noch bevor das PHP-Skript gestartet wird.
        Also: Du hast ein Formular mit <input name="bla" value="test">. Es passiert nach dem Drücken des "Abschicken"-Knöpkens im Browser folgendes:

        1. Browser sendet den Inhalt vom <input> an den Webserver.
          2. Server gibt den Inhalt an den PHP-Interpreter.
          3. PHP-Interpreter fügt die Schrägstriche zum Inhalt hinzu.
          4. PHP-Interpreter startet das gewünschte Skript.