Maskierung von Sonderzeichen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Maskierung von Sonderzeichen

    Hallo,

    mich hat eine zeitlang das Problem mit Magic_Quotes und der Sonderzeichenmaskierung beschäftigt.

    Bei Magic_Quotes wird ja nur vor die "gefährlichen" Sonderzeichen ein Backslash (\) gestellt und mittels einer Überprüfung mit get_magic_quotes_gpc und stripslashes wieder entfernt.

    Aber dann kam das Problem mit der Sonderzeichenmaskierung!
    Wenn ich ein ein Feld Sonderzeichen wie <, >, ", ... eingebe, so wird ja aus z.B. ä ein &auml;.
    Nur wenn ich das Ganze dann aus der Datenbank wieder auslas, war dann das Problem da, dass ich entweder &amp;auml; drannstehen hatte oder wenn ich alles vorher demaskiert habe, ich Probleme mit <, > und " bekommen habe, weil der Text danach einfach nicht mehr angezeigt wurde.

    Als Lösung habe ich mir dann 2 Funktionen geschrieben:

    PHP-Code:
    function htmlin(&$string$replace false) {
      
    $text $string;
      if( 
    is_array($text) )
          foreach(
    $text as $key => $value)
              
    $text[$key] = htmlin($valuefalse);
      else
          
    $text htmlentities($textENT_QUOTES'ISO-8859-15');
      
      if(
    $replace$string $text;
      else return 
    $text;
    }

    function 
    htmlout(&$string$replace false) {
      
    $text $string;
      
    $chars get_html_translation_table(HTML_ENTITIESENT_QUOTES);
      
      if( 
    is_array($text) )
          foreach(
    $text as $key => $value)
              
    $text[$key] = htmlout($value);
      else {
          
    $text html_entity_decode($textENT_QUOTES'ISO-8859-15');
          foreach(
    $chars as $char) {
            if( 
    stristr($text$char) ) {
              
    $text htmlout($text);
              break;
            }
          }
      }
      
      if(
    $replace$string $text;
      else return 
    $text;

    htmlin maskiert z.B. Ähren --> &amp;Auml;hren
    htmlout macht selbst aus &amp;amp;amp;Auml;hren wieder Ähren

    Das Problem bei der Sache ist, dass ich jetzt feststellen musste, dass dadurch manche Scripte sehr sehr langsam werden und ich wollte euch fragen (ja, jetzt kommt endlich die Frage):


    Wie löst ihr das Problem mit der Werteübergabe, Speicherung in der DB, dem Auslesen und wieder ausgeben in Formularfeldern?


    Einerseits muss man sich vor SQL-Injections schützen, andererseits soll alles ganz normal angezeigt werden und auf jedem Server laufen!

    Für Aufklärung wäre ich euch sehr dankbar.

    gruß
    Piremilok

  • #2
    magic_quotes off
    Beim Einfügen in die DB mysql_real_escape_string()
    Bei der Ausgabe htmlspecialchars()
    Fertig.

    Ich hab deinen Post jetzt nicht mal ganz gelesen, was auch immer du da machst, es ist viel zu kompliziert...

    Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

    bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
    Wie man Fragen richtig stellt

    Kommentar


    • #3
      Hi,

      was meinst du mit magi_quotes off?
      Einfach mit set_magic_quotes_runtime(0) ganz oben im Script deaktivieren?
      Muss ich dann nicht mehr stripslashes machen? Bzw. ab wann wirkt sich das aus? wie wirkt sich das aus?

      Ich habe in meinen Scripten immer beides drinn:
      PHP-Code:
      //Magic-Quotes deaktivieren
      @set_magic_quotes_runtime(0);
      @
      ini_set('magic_quotes_sybase''0'); 
      Wenn du etwas in die MySQL-DB einspeicherst einfach mysql_real_escape. Das mache ich ja auch.

      Und wenn du es aus der DB wieder ausliest machst du kein stripslashes()? Nur htmlspecialchars()?


      Ich weiß, dass ich es zu kompliziert mache
      Deswegen frage ich ja auch...


      gruß
      Piremilok

      Kommentar


      • #4
        Muss ich dann nicht mehr stripslashes machen?
        Doch, musst du. Guck mal hier
        Und wenn du es aus der DB wieder ausliest machst du kein stripslashes()? Nur htmlspecialchars()?
        Wie er schon sagt, ja, nur htmlspecialchars

        Kommentar


        • #5
          Hallo,

          habe das jetzt nochmal ausführlich getestet und ich weiß nicht, wie ich auf so einen Schmarrn gekommen bin!

          Vielen herzlichen Dank für eure Hilfe.

          -------------------------------------

          Noch eine Verständnisfrage zu Magic_Quotes:
          Ab wann greift es?

          1. Ich deaktiviere magic_quotes ganz oben im Script mit
          @set_magic_quotes_runtime(0);

          2. Ich schicke über dieses Script ein Formular an selbiges ab (z.B. für Zwischenspeichern)

          Sind die per GET oder POST übergebenen Daten nun maskiert oder nicht? Oder wie darf ich das verstehen?
          Wann greift magic_quotes?

          Ich glaub da steh ich grad momentan auf'm Schlauch und irgendwie hilft da auch kein Schritt zur Seite...


          Derzeit sieht der Aufbau meiner globals.php noch so aus:
          PHP-Code:
          <?php
          ...

          //Funktion um Slashes in Arrays zu entfernen
          function stripslashes_array(&$array) {
            foreach(
          $array as $key => $val) {
              if (
          is_string($val)) $array[$key] = stripslashes($val);
              elseif (
          is_array($val)) $array[$key] = stripslashes_array($val);
            }
            return 
          $array;
          }

          //Slashs aus den übergebbaren Variablen entfernen, sofern Magic-Quotes aktiv
          if (get_magic_quotes_gpc()) {
            if (
          count($_REQUEST)) stripslashes_array($_REQUEST);
            if (
          count($_POST)) stripslashes_array($_POST);
            if (
          count($_GET)) stripslashes_array($_GET);
            if (
          count($_COOKIE)) stripslashes_array($_COOKIE);
            if (
          count($_SERVER)) stripslashes_array($_SERVER);
          }

          //Magic-Quotes deaktivieren
          @set_magic_quotes_runtime(0);
          @
          ini_set('magic_quotes_sybase''0');

          ...
          ?>

          Vielen Dank für Antworten...


          gruß
          Piremilok
          Zuletzt geändert von Piremilok; 12.01.2008, 12:30.

          Kommentar


          • #6
            magic_quotes != magic_quotes_runtime
            Siehe Manual!

            Und magic_quotes lässt sich *nur* über die php.ini setzen (oder über eine htaccess-Direktive, auf jeden Fall aber VOR dem Skript - steht auch afaik im Manual)

            Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

            bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
            Wie man Fragen richtig stellt

            Kommentar

            Lädt...
            X