Ankündigung

Einklappen
Keine Ankündigung bisher.

Eingabe escapen, aber Escape-Zeichen nicht speichern

Einklappen

Neue Werbung 2019

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

  • Eingabe escapen, aber Escape-Zeichen nicht speichern

    Hallo,

    ich habe das Problem, dass ich einen String, der über ein Textfeld von einem Nutzer eingegeben wird, natürlich escapen will.
    Also mache ich folgendes:

    PHP-Code:
    $eingabe mysqli_real_escape_string($conn$eingabe); 
    So, wie erwartet wird ein Apostroph dann mit einem Backslash versehen. Danach füge ich die die Eingabe in meine MySQL Datenbank (UTF8_general_ci) ein und stelle fest, dass der Backslash auch in der Datenbank gespeichert wird, wodurch ich ja nun bei jeder Ausgabe irgendwo einen stripslashes() machen müsste.

    Gibt es keine Möglichkeit, den String so zu speichern, wie gedacht?
    Ich möchte, wenn der Nutzer als Namen z.B: O'Keefe eingibt, in der MySQL Datenbank auch O'Keefe steht und nicht O\'Keefe.
    Magic Quotes sind deaktiviert und wenn ich die mysqli_real_escape_string() auskommentiere, funktioniert es auch. Aber das soll man ja auch nicht machen.

    Vielen Dank!

  • #2
    Irgendwo findet ein zweites Escaping statt. Ohne Beispielcode kann man dazu nichts sagen.

    Kommentar


    • #3
      Das habe ich auch gedacht, aber es findet kein zweites Escaping statt. Kommentiere ich die Zeile mit mysqli_real_escape_string aus, findet sich auch kein Backslash in der Datenbank.
      Hier mal der Code, simplifiziert, geht aber trotzdem nicht:

      PHP-Code:
      <?php
      if(isset($_POST['speichern'])) {
        
      $id strForDB($conn$_GET['id']);
        
      $nachname strForDB($conn$_POST['nachname']);
        
      $vorname strForDB($conn$_POST['vorname']);

      $result mysqli_query($conn"UPDATE nutzer SET nachname='$nachname', vorname='$vorname' WHERE id='$id'");
      }

      function 
      strForDB($conn$input) {
          
      $input trim($input);
          
      $input mysqli_real_escape_string($conn$input);
          return 
      $input;
      }

      ?>
      Das mal getestet und dennoch erscheint der Backslash in der Datenbank. Kommentiere ich in der strForDB die Zeile mit dem mysqli_real_escape_string aus, funktioniert es - es erscheint kein Backslash in der Datenbank. Also wird ja eigentlich nicht auch noch woanders escapet, oder?

      Edit:

      Gebe ich $nachname aus, bevor es in die Datenbank wandert, sind da tatsächlich zwei Backslashes, also wird doch nochmal escaped. Aber wo? Magic Quotes sind definitiv disabled... habe ich mir nochmal ausgeben lassen eben.

      Kommentar


      • #4
        Was genau steht in $_POST['nachname'] und $_POST['vorname'] drin?

        Kommentar


        • #5
          Alternativ mache es mit Prepared Statments, dann ist das Thema "Escaping" damit automatisch erledigt.
          The string "()()" is not palindrom but the String "())(" is.

          Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
          PHP.de Wissenssammlung | Kein Support per PN

          Kommentar


          • #6
            Also, in der $_POST['nachname'] und $_POST['vorname'] stehen die Daten aus dem Formular drin, gibt zwei inputs vom Typ Text und ich habe reingeschrieben für Vorname Brett und Nachname O'Keefe, das dann abgeschickt gebe ich dann nach dem Escapen die $nachname aus, steht da O\\'Keefe
            Mir ist aber nach wie vor schleiferhaft, woher bitte das zweite Escape-Zeichen kommt. get_magic_quotes_gpc() gibt definitiv false zurück.

            Kann man Prepared Statements auch mit prozeduralem MySQLi machen? Das sind ne Menge Dateien, die möchte ich ehrlich gesagt jetzt nicht alle umbauen müssen. Zumal es ja auch irgendeinen Grund für das komische Verhalten geben muss.

            Kommentar


            • #7
              PHP Version?

              Was wird ausgegeben, wenn du nur ein
              PHP-Code:
              var_dumpmysqli_real_escape_string($conn"O'Keefe") ); 
              machst?

              Mach mal ein phpinfo() und suche (STRG+F) nach magic, ob du da was findest. Das wurde ja schon in aktuellen Versionen entfernt was ich im Kopf habe.
              The string "()()" is not palindrom but the String "())(" is.

              Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
              PHP.de Wissenssammlung | Kein Support per PN

              Kommentar


              • #8
                PHP-Version ist 7.2, ausgegeben wird:
                Code:
                string(8) „O\’Keefe“
                phpinfo() enthält kein magic mehr... ist tatsächlich schon entfernt. Daher gibt get_magic_quotes_gpc() wahrscheinlich auch false zurück. Irgendwie ist es seltsam... ich glaube, ich probiere es mal auf einem anderen Server morgen...

                Kommentar


                • #9
                  Was gibt folgendes aus:

                  PHP-Code:
                  var_dump(
                      
                  $_POST['nachname'],
                      
                  mysqli_real_escape_string($conn$_POST['nachname']),
                      
                  bin2hex($_POST['nachname']),
                      
                  bin2hex(mysqli_real_escape_string($conn$_POST['nachname']))
                  ); 

                  Kommentar


                  • #10
                    Da wird das ausgegeben:

                    Code:
                    string(8) „O\’Keefe“
                    string(10) „O\\’Keefe“
                    string(16) „4f5c274b65656665“
                    string(20) „4f5c5c5c274b65656665“
                    Auf einem anderen Server funktioniert es... da liegt wohl irgendwas im Argen...

                    Kommentar


                    • #11
                      Also der Backslash steht schon in $_POST drin. Wenn es nicht am PHP-Code liegt, ist da wohl irgerndeine komische PHP- oder Webserver-Extension installiert.

                      Kommentar


                      • #12
                        Das kommt schon so vom Form, spannend.

                        Laut Doku wurde magic_quote mit 5.4 entfernt, dh wenn du 7.2 hast kann es das eigentlich nicht sein.

                        Kannst du mal phpinfo() hier posten?
                        The string "()()" is not palindrom but the String "())(" is.

                        Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                        PHP.de Wissenssammlung | Kein Support per PN

                        Kommentar


                        • #13
                          Zitat von DocHS Beitrag anzeigen
                          Da wird das ausgegeben:

                          Code:
                          string(8) „O\’Keefe“
                          string(10) „O\\’Keefe“
                          string(16) „4f5c274b65656665“
                          string(20) „4f5c5c5c274b65656665“
                          Auf einem anderen Server funktioniert es... da liegt wohl irgendwas im Argen...
                          Habt ihr euch mal die var_dump() Ausgabe genauer angeschaut? Was sind denn das für Stringbegrenzer? Wird das wirklich genau so ausgegeben?
                          So auch das Hochkomma im Text.
                          PHP-Code:
                          debug::write("O’Keefe"); 
                          [11.01.2019 09:41:13,544](386k/410k) Debug::write "phpconsole.php
                          0 string(9) UTF-8mb3 "O’Keefe"

                          Mehr als merkwürdig das ganze.

                          Kommentar

                          Lädt...
                          X