Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] SQL Injection

Einklappen

Neue Werbung 2019

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

  • [Erledigt] SQL Injection

    Hab nur eine kurze Frage:
    Kann man mit der unten angegebenen Funktion SQL Injections komplett verhindern?
    Wenn nicht wie dann?
    Ich will eine allgemeine Funktion, nicht sowas wie mysql_real_escape oder änliches

    PHP-Code:
    addcslashes($string"'%_".'"'); 

  • #2
    Da die Funktion nicht dafür gemacht ist, kann sie auch nicht alle Arten von SQL-Injecteions verhindern.
    Der beste Weg ist es konsequent prepared-Statements zu verwenden, damit ist man gegen alles abgesichert. (Auch mysql_real_escape kann noch böse Eingaben zulassen)
    [URL="http://php.net/manual/en/migration55.deprecated.php"]mysql ist veraltet[/URL] [URL="http://php-de.github.io/jumpto/mail-class/"]Mails senden: Ohne Probleme und ohne mail()[/URL]
    [PHP]echo 'PS: <b>Meine Antwort ist keine Lösung, sondern nur eine Hilfe zur Lösung.</b>';[/PHP]

    Kommentar


    • #3
      Ich will eine allgemeine Funktion, nicht sowas wie mysql_real_escape
      Das ist aber "die" Funktion und genau dafür. Siehe auch: http://php-de.github.io/jumpto/sql-injection/

      Jeder Kontextwechsel muss anders behandelt werden, SQL Injecitons anders als HTML Ausgaben (zB XSS etc.)

      Siehe dazu auch diese Beiträge "Sicherheit": http://php-de.github.io/#security

      LG
      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


      • #4
        Eigentlich können doch nur die Zeichen ' " _ % eine SQL Injection verursachen oder sich an etwas vorbeimogeln?

        Oder sehe ich da was falsch?

        Kommentar


        • #5
          SELECT password FROM benutzer WHERE user = $username

          Und jetzt mach mal ein "OR 1 = 1" an die Query und schon, ups ... SQL-Injection die keines deiner Zeichen beinhaltet ...
          - Laravel

          Kommentar


          • #6
            Eine allgemeine Funktion ergibt keinen Sinn, da nur die jeweilige Datenbankschnittstelle weiß, was (jetzt oder in der Zukunft) wie zu escapen ist, und da die korrekte Durchführung sogar von Eigenschaften der Datenbankverbindung abhängen kann (Zeichensatz etwa).

            - http://shiflett.org/blog/2006/jan/ad...-escape-string

            Zitat von ChrisvA
            (Auch mysql_real_escape kann noch böse Eingaben zulassen)
            Ich nehme an, ihr meint mysql_real_escape_string? Was escapet die denn nicht richtig? (Ich wüsste vermutlich einen Fall, der mit verschiedenen Verbindungen in einem Script und Verzicht auf den $link-Parameter zu tun hat. Und dann so eine Charset-Geschichte wie in dem Link oben. Aber, na ja. Das wäre schon sehr konstruiert.)

            Kommentar


            • #7
              Zitat von mermshaus Beitrag anzeigen
              Ich nehme an, ihr meint mysql_real_escape_string? Was escapet die denn nicht richtig? (Ich wüsste vermutlich einen Fall, der mit verschiedenen Verbindungen in einem Script und Verzicht auf den $link-Parameter zu tun hat. Und dann so eine Charset-Geschichte wie in dem Link oben. Aber, na ja. Das wäre schon sehr konstruiert.)
              Die Funktion macht das was sie machen soll, das Problem ist wie sie benutzt wird. Grade wenn vermeintliche Zahlen escapt werden und im Query ohne Quotes genutzt werden ist das ein massives Sicherheitsproblem, bzw. einfach nur Dummheit.

              PHP-Code:
              $böse '99999 UNION SELECT mail, password, NULL, NULL FROM users';
              "SELECT * FROM foo WHERE id = ".real_escape_string($böse); 
              Da ist $pdo->quote() auf jedenfall die bessere Alternative, auch wenn die Funktion wiederrum nicht auf NULL klar kommt. (gut das macht mysqli_real_escape_string erst recht nicht)

              Kommentar


              • #8
                Zitat von DoNotClick Beitrag anzeigen
                Ich will eine allgemeine Funktion, nicht sowas wie mysql_real_escape oder änliches
                Begründung dafür? Warum einfach wenns auch kompliziert geht? Datenmüll muss sein?!

                Wie mermshaus schon schrieb: "Eine allgemeine Funktion ergibt keinen Sinn, da nur die jeweilige Datenbankschnittstelle weiß, was (jetzt oder in der Zukunft) wie zu escapen ist, und da die korrekte Durchführung sogar von Eigenschaften der Datenbankverbindung abhängen kann (Zeichensatz etwa)."

                Das erspart dir dann nämlich auch die Datenbank nach Backslashes zu durchsuchen. Was denkst du kommt raus wenn du z.B.
                PHP-Code:
                INSERT INTO foo SET spalte_x 'Blub\_dsfds' 
                ausführst?!

                Kommentar


                • #9
                  Ein Beispiel (was ich selber schon mal gesehen habe, leider! ):
                  URL:
                  index.php?page=5

                  PHP-Code:
                  ...
                  SELECT `contentFROM `contentsWHERE `id`= mysql_real_escape_string($_GET['page'])
                  ... 
                  Hier kann man mit UNION allerlei quatsch machen.
                  [URL="http://php.net/manual/en/migration55.deprecated.php"]mysql ist veraltet[/URL] [URL="http://php-de.github.io/jumpto/mail-class/"]Mails senden: Ohne Probleme und ohne mail()[/URL]
                  [PHP]echo 'PS: <b>Meine Antwort ist keine Lösung, sondern nur eine Hilfe zur Lösung.</b>';[/PHP]

                  Kommentar


                  • #10
                    Damit es hier nicht nur negativ Beispiele gibt. Wenn man mit Zahlen arbeitet macht man am besten
                    PHP-Code:
                    SELECT `contentFROM `contentsWHERE `id`= (int)$_GET['page'
                    Fatal Error: Windows wird gestartet

                    Wie administriert man ein Netzwerk: Beispiel

                    Kommentar

                    Lädt...
                    X