C. Kiesling: Probleme mit mysql_real_escape_string()

Hallo!

Ich habe da ein Problem mit der Funktion mysql_real_escape_string(), die ich benutzen möchte, um SQL Injection zu verhindern. Ich erhalte immer folgende Warnung:

Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: Access denied for user 'wwwrun'@'localhost' (using password: NO) in /home/confixx/web605/html/20051105/comm-new02.php on line 68

Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: A link to the server could not be established in /home/confixx/web605/html/20051105/comm-new02.php on line 68

Und zwar erhalte ich für jedes Feld, dass ich vor dem Insert in die DB mit dieser Funktion behandle, diese Warnung. Diese Felder bleiben dann in der Tabelle leer. Alle anderen, fix vorgegebenen Felder, die ich sowieso nicht mit der Funktion prüfe, werden normal eingetragen... Kenne mich da leider nicht so gut aus, und würde mich wirklich riesig freuen, wenn mir jemand auf die Sprünge helfen könnte, was ich da falsch mache!

danke im Voraus und schöne Grüße aus Graz,
Constantin

  1. echo $begrüßung;

    Ich habe da ein Problem mit der Funktion mysql_real_escape_string(), die ich benutzen möchte, um SQL Injection zu verhindern. Ich erhalte immer folgende Warnung:

    Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: Access denied for user 'wwwrun'@'localhost' (using password: NO) in /home/confixx/web605/html/20051105/comm-new02.php on line 68

    Die Funktion mysql_real_escape_string() benötigt eine geöffnete Verbindung zum MySQL-Server, da sie in Abhängigkeit von Parametern dieser Verbindung arbeitet.

    echo "$verabschiedung $name";

    1. Hallo!

      Danke für die schnelle Antwort! Habe das Skript geändert und es funktioniert!

      Eine Frage habe ich noch: Die Slashes, die dadurch vor Anführungszeichen etc. entstehen, kann man die dann bei der Datenausgabe mit stripslashes() wieder entfernen, oder gibts da noch andere Varianten?

      lG,
      Constantin

      1. Hallo,

        Eine Frage habe ich noch: Die Slashes, die dadurch vor Anführungszeichen etc. entstehen, kann man die dann bei der Datenausgabe mit stripslashes() wieder entfernen, oder gibts da noch andere Varianten?

        Wenn du die Funktion auf den Text anwendest und ihn dann in die Datenbank schreibst, steht in der Tabelle nur der Text ohne Slashes. Bei der Abfrage aus der Datenbank werden standardmäßig keine Slashes mehr hinzugefügt.

        Gruß;

        1. Hallo!

          Wenn du die Funktion auf den Text anwendest und ihn dann in die Datenbank schreibst, steht in der Tabelle nur der Text ohne Slashes. Bei der Abfrage aus der Datenbank werden standardmäßig keine Slashes mehr hinzugefügt.

          Also so wie ich das sehe, werden durch die mysql_real_escape_string() funktion dem Text Slashes hinzugefügt (bei Anführungszeichen etc.) und so wird der Text dann auch in die Datenbank geschrieben (also mit Slashes).

          Wenn ich den Text dann wie gewohnt ausgeben lasse, stehen die Slashes noch immer da... Deswegen wende ich jetzt vor der Ausgabe stripslashes() an, damit der Text wieder normal dasteht. Ich hoffe, das ist eine gute Lösung, habe aber bisher nichts gegenteiliges entdecken können.

          lG,
          Constantin

          1. echo $begrüßung;

            Wenn du die Funktion auf den Text anwendest und ihn dann in die Datenbank schreibst, steht in der Tabelle nur der Text ohne Slashes. Bei der Abfrage aus der Datenbank werden standardmäßig keine Slashes mehr hinzugefügt.

            Also so wie ich das sehe, werden durch die mysql_real_escape_string() funktion dem Text Slashes hinzugefügt (bei Anführungszeichen etc.) und so wird der Text dann auch in die Datenbank geschrieben (also mit Slashes).

            Nein, die Slashes werden nur benötigt, weil die Daten über eine Text-Schnittstelle (das SQL-Statement) transportiert werden sollen. Man muss da ja unterscheiden können, ob bestimmte Zeichen zu den Daten gehören oder Statement-Bestandteil sind. Der Server entfernt beim Analysieren des Statments diese Maskierungen und trägt die Daten in Rohform in die Felder ein.

            Wenn ich den Text dann wie gewohnt ausgeben lasse, stehen die Slashes noch immer da... Deswegen wende ich jetzt vor der Ausgabe stripslashes() an, damit der Text wieder normal dasteht. Ich hoffe, das ist eine gute Lösung, habe aber bisher nichts gegenteiliges entdecken können.

            Das kommt davon, weil du nun doppelt maskierst. Zum einen wirken die Magic Quotes und zum anderen machst du das auch noch händisch mit mysql_real_escape_string(). Da die Magic Quotes nicht sämtliche Zeichen berücksichtigen, ein aussterbendes Feature sind (PHP6) und obendrein auch noch immer wirken, auch wenn man sie grad nicht haben möchte (z.B. in einem Vorschauformular), solltest du sie auszuschalten versuchen, oder, wenn das nicht geht, ihre Auswirkungen rückgängig machen. Jedes Script, das mit externen Daten (EGPCS-Arrays = $_*) arbeitet, sollte das auf der Seite Disabling Magic Quotes angeführte Beispiel einmalig am Anfang ausführen, um die Eingabedaten Magic-Quotes-frei zu bekommen.

            Die Lösung, stripslashes() erst auf die Ausgabedaten anzuwenden, ist nicht besonders sinnvoll, da damit in der Datenbank maskierte Daten zu stehen kommen, mit denen man schlecht Stringverarbeitung betreiben kann. Die Slashes erhöhen die String-Länge, beim Teilstring-Bilden darf man sie nicht vom nachfolgenden Zeichen trennen, bei der Sortierung werden sie als normales Zeichen angesehen, usw. usf.

            Eine andere, modernere Alternative zum händischen Maskieren der Daten sind Prepared Statements. Hier wird der Befehl mit Platzhaltern notiert, in die dann die Daten eingefügt werden. Um die ordnungsgemäße Übertragung der Daten kümmert sich die Datenbankschnittstelle selbst. Entweder werden Statement und Daten gleich getrennt übertragen (z.B. mysqli) oder die Daten werden von der Schnittstelle entsprechend behandelt in die Statements eingefügt (PDO mit Datenbanken ohne Prepared Statements).
            Prepared Statements werden von der MySQL Improved Extension oder von den PDO Functions - eine allgemeine Datenbankabstraktionsschicht - zur Verfügung gestellt.
            Natürlich gilt auch hier, dass die Magic Quotes zunächst aus den Daten entfernt werden müssen, da sie sonst als Bestandteil der Daten angesehen werden.

            echo "$verabschiedung $name";

            1. Hallo!

              Danke für deine Hilfe! Da ich nur ein virtuelles Hosting-Angebot nutze, glaube ich nicht, dass ich einfach so an der php.ini rumbasteln kann, um dieses magic quotes zu deaktivieren.

              Anscheinend gibt es aber auch eine Möglichkeit dies mit htaccess zu vollbringen... wie funktioniert denn das genau? Würdem mich über Tipps freuen!

              Danke und lG,
              Constantin

              1. echo $begrüßung;

                Danke für deine Hilfe! Da ich nur ein virtuelles Hosting-Angebot nutze, glaube ich nicht, dass ich einfach so an der php.ini rumbasteln kann, um dieses magic quotes zu deaktivieren.

                Anscheinend gibt es aber auch eine Möglichkeit dies mit htaccess zu vollbringen... wie funktioniert denn das genau? Würdem mich über Tipps freuen!

                Falls der Apache mit mod_php läuft und nicht mit PHP als CGI - dies verrät die die Zeile "Server API" im Kopf einer phpinfo()-Ausgabe - kannst du

                php_flag magic_quotes_gpc off

                anwenden. Bei CGI bieten einige Provider die Möglichkeit, eine eigene php.ini im Script-Verzeichnis abzulegen, die dann Werte in der Haupt-php.ini überschreiben kann.

                echo "$verabschiedung $name";

      2. Hallo Constantin,

        Eine Frage habe ich noch: Die Slashes, die dadurch vor Anführungszeichen etc. entstehen, kann man die dann bei der Datenausgabe mit stripslashes() wieder entfernen, oder gibts da noch andere Varianten?

        Hierbei handelt es sich um die sogenannten Magic Quotes. Du kannst sie eventuell in deiner php.ini oder in einer .htaccess-Datei ausschalten. Dazu gibt's auch eine Anleitung.

        Grüße

        Marc Reichelt || http://www.marcreichelt.de/

        --
        Linux is like a wigwam - no windows, no gates and an Apache inside!
        Selfcode: ie:{ fl:| br:> va:} ls:< fo:} rl:( n4:( ss:) de:> js:| ch:? sh:| mo:) zu:)