Ankündigung

Einklappen
Keine Ankündigung bisher.

gpc_quotes funktion: verbesserungsvorschläge?

Einklappen

Neue Werbung 2019

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

  • gpc_quotes funktion: verbesserungsvorschläge?

    um mir in diversen formularen immer sicherheitsabfragen zu ersparen dachte ich mir ich schreibe mir eine funktion mit der ich alle eventualitäten beseitige:

    Code:
    function verify($text) {
      if(get_magic_quotes_gpc()) $text = stripslashes($text);
      $text = strip_tags(trim($text));
      return $text;
    }
    so müsste ich dann eben jedes gewünschte feld eines formulares prüfen (verify($_POST['kommentar'])). oder sollte ich gleich alle $_POST werte verifizieren? so ungefähr:
    Code:
    function verify($arr) {
      foreach($arr as $value) {
        if(get_magic_quotes_gpc()) $arr[$value] = stripslashes($arr[$value]);
        $arr[$value] = strip_tags(trim($arr[$value]));
      }
      return $arr;
    }
    oder sollte ich das ganze kombinieren und so modifizieren dass ich sowohl ein array als auch einen einzelnen text verifizieren kann:
    Code:
    function verify($target) {
      if(is_array($target)) {
        foreach($target as $value) {
          if(get_magic_quotes_gpc()) $target[$value] = stripslashes($target[$value]);
          $target[$value] = strip_tags(trim($target[$value]));
        }
      } else {
        if(get_magic_quotes_gpc()) $target = stripslashes($target);
        $target = strip_tags(trim($target));
      }
      return $target;
    }
    so könnte ich zum beispiel mit verify($_POST) das array oder mit verify($_POST['kommentar']) ein einzelnes feld von bösen dingen befreien.

    was haltet ihr davon. wäre über jegliche vorschläge, anregungen und kommentare froh.

    EDIT: leider habe ich gerade etwas festgestellt. wenn ich die 3. form anwende und $_POST verifizieren lasse, so wird sonderbarerweise NICHTS geändert, sprich $_POST wird gleich wieder zurückgegeben OHNE modifikationen. ABER wenn ich mir das array in der funktion ausgeben lasse, so ist alles korrekt entfernt worden?!

    hier das beispiel:
    ursprünglicher $_POST array welches an verify() übergeben wird:
    Array
    (
    [rev_prename] => Max
    [rev_lastname] => Mustermann
    [rev_comment] => \"hallo\" fett
    )


    $_POST array nach der funktion (mittels print_r in der funktion ausgegeben):
    Array
    (
    [rev_prename] => Max
    [rev_lastname] => Mustermann
    [rev_comment] => "hallo" fett
    )


    $_POST wie er auf der seite nach verify($_POST) als ergebnis der funktion ausgegeben wird:
    Array
    (
    [rev_prename] => Max
    [rev_lastname] => Mustermann
    [rev_comment] => \"hallo\" fett
    )
    mfg Alex

  • #2
    Also eine universelle Funktion wäre vielleicht das sinnvollste, aber ich gehe mal stark davon aus das nicht nur Textfelder korrigiert werden sollen?! Ich denke du solltest auch auf die Typen achten, bei dir wird alles zum String gemacht, was ich nicht besonders sinnvoll halte.
    Ich prüfe meine Formularwerte immer nach Typ und danach auf Syntax, bzw. ich caste die Werte auf den entsprechenden Typ.

    // Edit:
    Zitat von Promaetheus
    [...]
    EDIT: leider habe ich gerade etwas festgestellt. wenn ich die 3. form anwende und $_POST verifizieren lasse, so wird sonderbarerweise NICHTS geändert, sprich $_POST wird gleich wieder zurückgegeben OHNE modifikationen. ABER wenn ich mir das array in der funktion ausgeben lasse, so ist alles korrekt entfernt worden?!
    [...]
    Also deine 3. Form (und deine 2.) ist auch nicht ganz korrekt, der foreach-Syntax ist hier falsch.

    Außerdem ist noch zu beachten:
    Zitat von PHP Manual
    Anmerkung: Beachten Sie auch, dass foreach mit einer Kopie des angegebenen Arrays arbeitet, nicht mit dem Array selbst. Deshalb wird auch der Arrayzeiger nicht wie bei dem each()-Konstrukt verändert und Veränderungen an ausgegebenen Arrayelementen haben keine Auswirkung auf das originale Array. Trotzdem wird der interne Arrayzeiger des originalen Arrays bei der Verarbeitung bewegt. Angenommen, die foreach-Schleife ist komplett abgearbeitet, wird der interne Arrayzeiger (des originalen Arrays) auf das letzte Element zeigen.
    zum nachlesen: foreach

    Kommentar


    • #3
      danke für deinen hinweis. also kann ich das mit dem array schonmal vergessen. werde dann einfach die normale verify($text) anwenden für jedes feld das überprüft werden soll. es handelt sich bei meinen feldern nur um textfelder.

      danke nochmal für deinen hinweis bezüglich der arraykopie in der foreach schleife. schade.
      mfg Alex

      Kommentar


      • #4
        Zitat von Promaetheus
        [...]
        also kann ich das mit dem array schonmal vergessen.
        [...]
        Naja, so schnell musst du nicht aufgeben, es geht schon. Das Stichwort heißt "Call by reference".

        PHP-Code:
        // kleines Testscript
        $Array = array('    Original    ''[b]Fett[/b]');
        $String '    [b]Fett[/b]    ';

        function 
        verify(&$Input) {
          if (
        is_array($Input)) {
            
        reset($Input);
            while (list(
        $Key$Value) = each($Input)) {
              
        $Input[$Key] = trim(strip_tags($Value));
            }
          } else {
            
        $Input trim(strip_tags($Input));
          }
        }

        verify($Array);
        verify($String);

        print_r($Array);
        print_r($String); 
        So sollte es funktionieren, ist jetzt nur ein kleiner Ansatz den du noch verbessern könntest. (z.B. mehrdimensionale Arrays oder Typenvergleich)

        Hier noch zum nachlesen: Passing by reference

        Kommentar


        • #5
          danke für deinen hinweis. von "call by reference" habe ich bisher noch nichts gehört. werde mal suchen und lesen.

          grob heisst das ganze also dass er anstatt eine kopie anzulegen die tatsächliche variable verwendet oder? das betrifft aber nur arrays oder? denn wenn ich meiner kombinierten funktion ein array übergebe, so handelt er INNERHALB der funktion alles gut ab, aber auf der seite auf der die funktion aufgerufen wird, wird nicht das zurückgegebene und korrigierte $_POST verwendet sondern das "originale. das würde ja für das sprechen was du geschildert hast.
          ABER: wenn ich ein explizites element von $_POST übergebe, beispielsweise $_POST['name'], so wird alles korrekt durchgeführt und auf der seite wo die funktion aufgerufen wird, nachher auch das korrigierte und von der funktion zurückgegebene $_POST['name'] verwendet.

          CONCLUSIO: das problem lag also NUR an der foreach schleife, welche mit der arraykopie arbeitet. wenn ich while verwenden würde so müsste es funktionieren (siehe dein beispiel). wenn ich trotzdem mit foreach arbeiten möchte, so muss ich einfach beim funktionsaufruf ein & vor die variable anfügen, dann verwendet foreach keine kopie sondern die originale variable/array.
          habe ich hier alles richtig verstanden und ist meine conclusio korrekt?
          mfg Alex

          Kommentar


          • #6
            An deiner Stelle würde ich aus Performancegründen array_walk() verwenden, wenn du eine bestimmte Prozedur auf alle Items in einem Array durchführen möchtest. Falls du deine verify() Funktion weiterhin verwenden möchtest, würde ich in Zeile 9 folgendes schreiben:
            PHP-Code:
            $Input[$Key] = verify($Input[$Key]); 
            Es kann schließlich vorkommen, dass das/der (?) aktuelle Item gar kein String, sondern ein Array ist.

            Gruß
            Tim
            Betriebssystem: Ubuntu 7.10, Kernel v2.6.24-8-generic
            Webserver: LightTPD v1.4.13, PHP v5.2.4 + FastCGI + MySQLi v5.0.51a

            Kommentar


            • #7
              Zitat von qwertzu
              [...]
              Es kann schließlich vorkommen, dass das/der (?) aktuelle Item gar kein String, sondern ein Array ist.
              [...]
              Ich wollte keine komplette Lösung präsentieren, nur einen Ansatz...

              Zitat von Promaetheus
              [...]
              grob heisst das ganze also dass er anstatt eine kopie anzulegen die tatsächliche variable verwendet oder?
              [...]
              Ja, das kann man so erklären, tatsächlich wird hier eben nicht eine Kopie der Variablen angelegt sondern eine Referenz zur Variablen übergeben wo man den Inhalt dieser findet (stell es dir vereinfacht wie ein Zeiger vor der dann auf den Originalwert zeigt).

              Zitat von Promaetheus
              [...]
              das betrifft aber nur arrays oder? denn wenn ich meiner kombinierten funktion ein array übergebe, so handelt er INNERHALB der funktion alles gut ab, aber auf der seite auf der die funktion aufgerufen wird, wird nicht das zurückgegebene und korrigierte $_POST verwendet sondern das "originale.
              [...]
              Es wird generell unterschieden zwischen "Call by value" und "Call by reference". PHP nutzt standardmäßig die "Call by value" Methode um Funktionsparameter zu übergeben. Soll heißen, alles was du einer Funktion übergibst, wird als Wert übergeben. Somit kannst du damit in der Funktion selbst alles mögliche mit anstellen, die Variable außerhalb der Funktion bleibt jedoch unverändert. (Ausnahmen sind hier Objekte, diese werden per Referenz übergeben)

              Zitat von Promaetheus
              [...]
              CONCLUSIO: das problem lag also NUR an der foreach schleife, welche mit der arraykopie arbeitet. wenn ich while verwenden würde so müsste es funktionieren (siehe dein beispiel). wenn ich trotzdem mit foreach arbeiten möchte, so muss ich einfach beim funktionsaufruf ein & vor die variable anfügen, dann verwendet foreach keine kopie sondern die originale variable/array.
              [...]
              Ob du nun als Kontrollstruktur while oder foreach verwendest ist hier egal, denn es kommt darauf an was du der Funktion übergibst. Referenz oder Wert.

              // Edit
              PHP-Code:
              function verify(&$Input) {
               
              // ...
              }

              # Funktionsaufruf
              verify($Var); 
              oder
              PHP-Code:
              function verify($Input) {
               
              // ...
              }

              # Funktionsaufruf
              verify(&$Var); 
              führt beides übrigens zum gleichen Ergebnis.

              Kommentar


              • #8
                Zitat von mAy^daY
                Ob du nun als Kontrollstruktur while oder foreach verwendest ist hier egal, denn es kommt darauf an was du der Funktion übergibst. Referenz oder Wert.
                Das stimmt nicht - ihr redet aneinenader vorbei.

                Er hat kein Problem mit call by value/reference sondern er hat einfach foreach nicht verstanden.

                Warum du hier zwanghaft ein call by reference einsetzen willst ist mir schleierhaft - ist doch mit Rückgabewerten viel schöner...
                [URL="https://www.quizshow.io/"]Create your own quiz show.[/URL]

                Kommentar


                • #9
                  Ja du hast recht, ich habe nicht richtig gelesen, seine Funktion hatte den Rückgabewert. Das habe ich nicht beachtet, mein Ansatz hatte immer als Ziel die Originaldaten zu ändern.
                  (Ich bin einfach zu vorbelastet mit Zeigern, da versuche ich wohl die unbewusst überall unter zu bringen )

                  Gut... möglich ist beides, kommt halt letztendlich darauf an wie er es anwenden will.

                  Kommentar


                  • #10
                    Ich würde Referenzen nur in seltenen Fällen verwenden, dann wenn der Array wirklich sehr groß ist (paarhundert Datensätze). Aber wann hat man das schonmal.

                    Kommentar


                    • #11
                      danke für eure ganzen antworten. habe da wohl eine heisse diskussion entfacht. ich hoffe ich habe das ganze jetzt richtig verstanden. ich übergebe der funktion einfach den wert und nicht die referenz indem ich ein & vor zb. mein $_POST schreibe. dann handelt die funktion die schleife nicht mit einer kopie ab, sondern mit dem echten $_POST array, bzw. dessen daten.
                      mfg Alex

                      Kommentar

                      Lädt...
                      X