Ankündigung

Einklappen
Keine Ankündigung bisher.

Funktion zum laufen bringen

Einklappen

Neue Werbung 2019

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

  • #31
    Wenn er ursprünglich von aussen kommt, dann muss eben da der Kontextwechsel greifen, aber nicht im Nachhinein wenn der Wert schon der DB steht und einer weiteren Abfrage genutzt wird. Ansonsten könnte man Joins oder Subselects gleich vergessen.
    Auf die Werte in der DB sollten man sich schon verlassen können., sonst ist es eh zu spät.

    Kommentar


    • #32
      Zitat von protestix Beitrag anzeigen
      Wenn er ursprünglich von aussen kommt, dann muss eben da der Kontextwechsel greifen, aber nicht im Nachhinein wenn der Wert schon der DB steht und einer weiteren Abfrage genutzt wird.
      Doch. Der Kontextwechsel nach SQL findet jedesmal statt, wenn ein Wert in SQL-Code eingefügt wird. Egal wie oft.

      PHP-Code:
      $db = new PDO('mysql:host=localhost;dbname=test;charset=utf8''root''', [
          
      PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
      ]);

      $db->query("
          CREATE TEMPORARY TABLE temp (
              id INT NOT NULL AUTO_INCREMENT,
              value VARCHAR(255) NOT NULL,
              PRIMARY KEY (id)
          )
      "
      );

      $stmt $db->prepare("INSERT INTO `temp` (`value`) VALUES (?)");
      $stmt->execute(['Dylan O\'Brien']);

      $stmt $db->prepare("SELECT `value` FROM `temp` WHERE `id` = ?");
      $stmt->execute([1]);
      $row $stmt->fetch(PDO::FETCH_ASSOC);

      $sql "INSERT INTO `temp` (`value`) VALUES ('" $row['value'] . "')";
      echo 
      $sql PHP_EOL;

      $db->query($sql); 
      Ausgabe:
      Code:
      INSERT INTO `temp` (`value`) VALUES ('Dylan O'Brien')
      
      
      Fatal error:  Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Brien')' at line 1' in C:\xampp\htdocs\test.php:25
      Stack trace:
      #0 C:\xampp\htdocs\test.php(25): PDO->query('INSERT INTO `te...')
      #1 {main}
        thrown in C:\xampp\htdocs\test.php on line 25

      Kommentar


      • #33
        Zitat von protestix Beitrag anzeigen
        Ansonsten könnte man Joins oder Subselects gleich vergessen.
        Die machen aber keinen Kontextwechsel.

        Kommentar


        • #34
          Zitat von protestix Beitrag anzeigen
          Das dachte ich zuerst auch, aber er nimmt $name2 aus dem Ergebnis einer vorherigen SQL-Abfrage, weshalb der Wert hier nicht von aussen eingeschleust wird.
          Das hat auch wirklich keinerlei Bedeutung woher der Wert stammt.

          Wenn da irdwie was im Format:

          Code:
          ' OR '1' <> '0
          oder irgend was anderes was das SQL kaputt machen kann drin steht

          dann ist die Injection fertig.

          Selbst wenn nur Foo'Bar drin steht kommt kaputtes SQL am Ende raus.

          PHP-Manual ¡ mysql_* ist veraltet ¡ Debugging: Finde DEINE Fehler selbst ¡ Passwort-Hashing ¡ Prepared Statements

          Kommentar


          • #35
            hellbringer wow, überzeugendes Beispiel, das du da bringst. Respekt!

            Kommentar

            Lädt...
            X