Ankündigung

Einklappen
Keine Ankündigung bisher.

Escapen - Wann?

Einklappen

Neue Werbung 2019

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

  • Escapen - Wann?

    Ich möchte eben mal fragen, ob ich das richtig verstanden habe:

    Man muss nur escapen, wenn ein Benutzer etwas in den Query einträgt. Das heißt, nur wenn sich zum Beispiel einer einloggt und dannach eine Abfrage stattfindet.

    Zum Beispiel eine selbstgeschriebene News von einem Benutzer werde ich doch nicht escapen müssen, da diese ja nur ausgegeben wird und nicht mit einer Bedingung im Kontext steht.

    Stimmt das? Gibt es noch was anderes zu beachten?

  • #2
    bei querys solltest du alles, was vom benutzer eingegeben wird, escapen, sonst besteht SQL Injections-Gefahr!!

    Kommentar


    • #3
      Zitat von maxorxy Beitrag anzeigen
      bei querys solltest du alles, was vom benutzer eingegeben wird, escapen, sonst besteht SQL Injections-Gefahr!!
      Das beantwortet in keinerlei Hinsicht meine Frage. Warum sollte ich etwas escapen, wenn es so oder so niemals zu einer Abfrage kommt? Beispiel:

      Code:
      Query: SELECT NULL FROM users WHERE user = '$user' AND passwd = '$pass'
      Hier würde ich nun Abfragen, ob dieser Benutzer existiert oder nicht, deswegen könnte man hier zum Beispiel als Username 'User OR '1' == '1'' verwenden, um sich einzuloggen.

      Warum sollte ich nun eine News escapen, die später so oder so nur ausgelesen und ausgegeben wird?

      Kommentar


      • #4
        Weil sonst Deine Query beliebig verändert werden kann. SQL Injection kennt mehr als die 1=1 Variante.

        Kommentar


        • #5
          escape einfach grundsätzlich alles vom User eingegebene, dann kann dir nix passieren.

          Kommentar


          • #6
            Gut zu wissen. Werde ich dann wohl auch so machen.

            Eine kleine Frage dennoch:

            Nehmen wir an, der Wert in $eingabe ist der Wert, den der User eingegeben hat.
            PHP-Code:
            $eingabe "This'is'\me";
            echo 
            mysql_real_escape_string($eingabe);
            echo 
            stripslashes($eingabe); 
            Man wird merken, dass nun auch der Slash, den der User eingefügt hat, weg sein wird. Muss ich nun extra nur vor den escapten Zeichen den Slash entfernen, oder gibts da Tricks?

            Kommentar


            • #7
              Eigentlich solltest du nur mysql_real_esacpe_string verwenden müssen. Bei der Ausgabe aus der Datenbank müsste der \ wieder da sein!

              Kommentar


              • #8
                Mein Wert wird escaped (also mit Slashes) in der Datenbank gespeichert. Nun möchte ich aber den Datensatz ohne Slashes aber mit den Slashes, die der Benutzer verwendet hat ausgeben. Aber stripslashes wird alle Slashes verwerfen.

                Kommentar


                • #9
                  Du brauchst kein stripslashes! Einfach nur mysql_real_esacpe_string() und fertig!

                  Kommentar


                  • #10
                    stripslashes hat hier nichts zu suchen! Außer dein Server hat magic-quotes eingestellt.
                    Code:
                    magic quotes?
                    ja:
                      eingabe -> stripslashes -> real_escape -> Query -> DB
                      DB -> Query -> ausgabebezogene maskierung (z.B. htmlspecialchars im Kontext HTML) -> ausgabe 
                    nein:
                      eingabe -> real_escape -> Query -> DB
                      DB -> Query -> ausgabebezogene maskierung (z.B. htmlspecialchars im Kontext HTML) -> ausgabe

                    Kommentar


                    • #11
                      Ah, also werden beim 'fetschen' eigentlich garkeine Slashes mitkommen. Das wusste ich so nicht, das erklärt alles, danke.

                      Da ich in meinem anderen Thread keine Antwort bekam, probier ich's noch hier:

                      Ab wann lohnt es sich ein Template-System wie SMARTY zu verwenden? Ist SMARTY überhaupt ein gutes Template-System und wäre es besser selbst ein solches System zu schreiben?

                      Kommentar


                      • #12
                        Ah, also werden beim 'fetschen' eigentlich garkeine Slashes mitkommen.
                        Falsch. Das weit verbreitete Missverständnis besteht darin, dass gar keine Escapezeichen in die Datenbank gelangen. real_escape maskiert nur die Eingabe, es wandelt nichts um, das geändert in die Datenbank fließt.

                        Analog:

                        PHP-Code:
                        <?php

                        $string 
                        'Hallo O\'Neill!';
                        Das Backslash speichert PHP auch nicht in der Variable. Es ist nur Mittel zum Zweck, um ein Hochkomma innerhalb von Hochkommata schreiben zu können, ohne dass der Parser darüber stolpert. Die äußeren Hochkommata speichert PHP ebenfalls nicht in der Variable. Sie sind nur Mittel zum Zweck, um eine Zeichenkette als Stringsdatentyp zuweisen zu können, ohne dass der Parser evtl. diese Zeichen als etwas anderes interpretiert.

                        Kommentar


                        • #13
                          Zitat von nikosch Beitrag anzeigen
                          Falsch. Das weit verbreitete Missverständnis besteht darin, dass gar keine Escapezeichen in die Datenbank gelangen. real_escape maskiert nur die Eingabe, es wandelt nichts um, das geändert in die Datenbank fließt.

                          Analog:

                          PHP-Code:
                          <?php

                          $string 
                          'Hallo O\'Neill!';
                          Das Backslash speichert PHP auch nicht in der Variable. Es ist nur Mittel zum Zweck, um ein Hochkomma innerhalb von Hochkommata schreiben zu können, ohne dass der Parser darüber stolpert. Die äußeren Hochkommata speichert PHP ebenfalls nicht in der Variable. Sie sind nur Mittel zum Zweck, um eine Zeichenkette als Stringsdatentyp zuweisen zu können, ohne dass der Parser evtl. diese Zeichen als etwas anderes interpretiert.
                          Das macht alles klar. Ich habe das noch nie mit den Hochkommata betrachtet, das scheint nun alles Sinn zu machen. Jetzt verstehe ich auch, warum mein voriges Beispiel mit 'OR '1' == '1'' mit escapten Hochkommata nicht mehr funktioniert. Hast mir nen ganzen Schritt weitergeholfen.

                          Kommentar

                          Lädt...
                          X