Honda: Forumlar - Sicherheit - SQL-Injection

Hallo,

  • ich verwende Formulare um Text in einer MySQL-Datenbank zu speichern.

  • Die Texte und Daten enthalten unter anderem zahlreiche onderzeichen (sprich: Sprachspezifische Zeichen (Griechisch, Kroatisch, Deutsch, etc.).

Sämtliche Werte aus dem Formular versehe ich mit "strip_tags" bevor ich diese in die Datenbank speichere.

Genügt dies um vor böswilligen Angriffen ausreichend geschützt zu sein?

Was könnt Ihr mir zwecks Sicherheit empfehlen?
Wie gesagt, es sollen alle länderspezifischen Sonderzeichen gespeichert werden können. Die Texte in der Datenbank sollen unversehrt angezeigt werden können.

Merci für jegliche Ratschläge,
Honda

  1. Hi,

    Sämtliche Werte aus dem Formular versehe ich mit "strip_tags" bevor ich diese in die Datenbank speichere.
    Genügt dies um vor böswilligen Angriffen ausreichend geschützt zu sein?

    nein. Es hat nicht den geringsten Effekt.

    Was könnt Ihr mir zwecks Sicherheit empfehlen?

    Kodiere jedes Datum, welches Du in irgend einen Kontext bringst, kontextspezifisch. Es ist nutzfrei, in den SQL-Kontext gebrachte Informationen einer HTML-Kodierung zu unterziehen. Der SQL-Kontext erfordert eine SQL-Kodierung.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. Hi again,

      Es ist nutzfrei, in den SQL-Kontext gebrachte Informationen einer HTML-Kodierung zu unterziehen.

      ... bzw. HTML-Sonderzeichen zu eliminieren.

      Chea "So viel Zeit muss sein." tah

      --
      X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
      X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
      X-Will-Answer-Email: No
      X-Please-Search-Archive-First: Absolutely Yes
    2. Hallo,

      Kodiere jedes Datum, welches Du in irgend einen Kontext bringst, kontextspezifisch. Es ist nutzfrei, in den SQL-Kontext gebrachte Informationen einer HTML-Kodierung zu unterziehen. Der SQL-Kontext erfordert eine SQL-Kodierung.

      1.) Ich möchte zum einen generell verhindern, dass durch HTML veränderte Texte abgespeichert und dann auch angezeigt werden.

      2.) Es soll nicht möglich sein Javascript einzuschleusen.

      3.) Es soll vor SQL-Injections gesichert werden, dabei sollen aber Anführungszeichen.

      Meine Überlegung war:

      ad.1+2) strip_tags für die ersten beiden Punkte
      ad.3) mysql_real_escape_string(); für den 3ten.

      Honda

      1. hi,

        1.) Ich möchte zum einen generell verhindern, dass durch HTML veränderte Texte abgespeichert und dann auch angezeigt werden.

        2.) Es soll nicht möglich sein Javascript einzuschleusen.

        3.) Es soll vor SQL-Injections gesichert werden, dabei sollen aber Anführungszeichen.

        Dann mache dir doch erst mal Gedanken darüber, welcher "Angriff" sich _wo_ auswirken würde - und dann demzufolge auch Gedanken über die Reihenfolge der "Entschärfungen".

        Stört sich deine DB in irgendeiner Weise an HTML-Code?
        Nein, nicht im geringsten, HTML ist ihr furzegal.
        Also reicht es beim Einfügen in die Datenbank vollkommen aus, hier für Sicherheit gegenüber SQL-Injections (oder harmloseren, durch aus Sicht der DB Sonderzeichen darstellender Zeichen auftretende Fehler) zu sorgen.

        Wen beeinflussen denn HTML-Code und Javascript?
        Den Client.
        Also entschärfe diese, bevor du die Daten wieder ausgibst.

        Meine Überlegung war:

        ad.1+2) strip_tags für die ersten beiden Punkte
        ad.3) mysql_real_escape_string(); für den 3ten.

        Erst 3), und dann bei der Ausgabe 1+2)
        Für 1+2) würde ich aber eher htmlspecialchars nehmen.

        gruß,
        wahsaga

        --
        /voodoo.css:
        #GeorgeWBush { position:absolute; bottom:-6ft; }
        1. Hallo,

          Meine Überlegung war:

          ad.1+2) strip_tags für die ersten beiden Punkte
          ad.3) mysql_real_escape_string(); für den 3ten.

          Erst 3), und dann bei der Ausgabe 1+2)
          Für 1+2) würde ich aber eher htmlspecialchars nehmen.

          zu 1+2) Was spricht dagegen, 1+2 schon vorab (bei der Eingabe) mit strip_tags abzufangen, anstatt unnötige HTML-Codierungen in der Datenbank zu haben?

          zu 3)hier werden bei der Ausgabe natürlich jedem Anführungszeichen stets backslashes angezeigt. Es handelt sich bei mir in concreto um ein internes Mailingsystem, d.h. wenn ich nun auf Antworten klicke, habe ich nun 3 Backslahes im Text,.. wenn ich auf die Antwort wieder antworte plötzlich 7 usw.

          Wie kann ich das eliminieren?

          Merci & Grüsse,
          Honda

          1. Nachtrag:

            zu 3)hier werden bei der Ausgabe natürlich jedem Anführungszeichen stets backslashes angezeigt. Es handelt sich bei mir in concreto um ein internes Mailingsystem, d.h. wenn ich nun auf Antworten klicke, habe ich nun 3 Backslahes im Text,.. wenn ich auf die Antwort wieder antworte plötzlich 7 usw.

            Wie kann ich das eliminieren?

            Meine Einstellungen: magic_quotes_gpc = ON

            Grüsse,
            Honda

          2. hi,

            zu 1+2) Was spricht dagegen, 1+2 schon vorab (bei der Eingabe) mit strip_tags abzufangen, anstatt unnötige HTML-Codierungen in der Datenbank zu haben?

            strip_tags ist eine grobe Wildsau ... strip_tags'e doch mal den Text 'Einfache Mathematik: 5<6 und 7>6' - na, begeistert?

            Außerdem _möchte_ ich ja vielleicht mal den Text posten, "Ein HTML-Dokument enthält in der Regel die Elemente <html>, <head> und <body>" - was bleibt denn davon noch übrig, nachdem du obige Wildsau hast drüberlaufen lassen?

            Also mache es _vernünftig_, und "entschärfe" diese Texte dadurch, dass du Sonderzeichen wie < und > in ihre HTML-Entities umwandeln lässt. Einfaches "Rauswerfen" ist, das sollten die obigen Beispiele ja wohl zur Genüge zeigen, ziemlicher Blödsinn. Kein Mensch könnte hier im Forum HTML-Beispielcodes posten, wenn hier so blödsinnig vorgegangen würde ...

            Es erst bei der Ausgabe zu machen, dafür spricht, dass du vielleicht einen gespeicherten Text ja auch noch mal editieren möchtest.

            zu 3)hier werden bei der Ausgabe natürlich jedem Anführungszeichen stets backslashes angezeigt. Es handelt sich bei mir in concreto um ein internes Mailingsystem, d.h. wenn ich nun auf Antworten klicke, habe ich nun 3 Backslahes im Text,.. wenn ich auf die Antwort wieder antworte plötzlich 7 usw.

            Wie kann ich das eliminieren?

            Informiere dich über magic_quotes_gpc.

            gruß,
            wahsaga

            --
            /voodoo.css:
            #GeorgeWBush { position:absolute; bottom:-6ft; }
          3. Hallo Honda,

            zu 1+2) Was spricht dagegen, 1+2 schon vorab (bei der Eingabe) mit strip_tags abzufangen, anstatt unnötige HTML-Codierungen in der Datenbank zu haben?

            stell' Dir vor, jemand möchte einen HTML- oder PHP-Beispielcode über das interne Mailingsystem versenden. Mit wahsagas Vorschlag kein Problem, mit Deinem unmöglich.

            zu 3)hier werden bei der Ausgabe natürlich jedem Anführungszeichen stets backslashes angezeigt. Es handelt sich bei mir in concreto um ein internes Mailingsystem, d.h. wenn ich nun auf Antworten klicke, habe ich nun 3 Backslahes im Text,.. wenn ich auf die Antwort wieder antworte plötzlich 7 usw.

            Lies bitte mysql_real_escape_string(), speziell die Hinweise zu "magic quotes".

            Freundliche Grüße

            Vinzenz

      2. Hi,

        1.) Ich möchte zum einen generell verhindern, dass durch HTML veränderte Texte abgespeichert und dann auch angezeigt werden.

        wie ich schon sagte: Kodiere kontextspezifisch, _wenn Du ein Datum in einen Kontext bringst_. Nicht Jahre vorher. Das von wahsaga beschriebene Vorgehen ist das einzig wah(r)e.

        2.) Es soll nicht möglich sein Javascript einzuschleusen.

        In welchem Kontext spielt JavaScript eine Rolle?

        3.) Es soll vor SQL-Injections gesichert werden, dabei sollen aber Anführungszeichen.

        Dieser Satz kein Verb.

        Meine Überlegung war:

        ad.1+2) strip_tags für die ersten beiden Punkte
        ad.3) mysql_real_escape_string(); für den 3ten.

        Ja. Aber jeweils zum richtigen Zeitpunkt, denn jeder andere als der richtige Zeitpunkt ist der falsche Zeitpunkt.

        Cheatah

        --
        X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
        X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes
  2. hi,

    Was könnt Ihr mir zwecks Sicherheit empfehlen?

    Lesen :-)

    PHP Manual, Kapitel 27. Datenbank - Sicherheit

    Speziell bezogen auf MySQL benutze zum Absichern von Daten vor dem Einfügen in eine Query die dafür vorgesehene Funktion, mysql_real_escape_string.

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }