Sascha: Sicherheit bei XMLHttpRequest + MySQL über PHP

Ich habe mich gestern mal an das Thema XMLHttpRequest gesetzt. Das Grundprinzip habe ich soweit auch verstanden. Nun habe ich eine Frage zur Sicherheit.

Ich habe benutze Konstrukt:

Anwendung.PHP <> Funktionen.JS <> DB-Zugrif.PHP <> MySQL

Es läuft wie folgt ab: In der Anwendung löse ich bestimmte Ereignisse aus, die einen XMLHttpRequest starten. Mit diesem Request übergebe ich bestimmte POST Variablen (z.B. das SQL Statement) an die geladene DB-Zugriff.PHP. In dieser Datei befindet sich eigentlich eine PHP Funktion für den Zugriff auf die DB. Sollte aber eine bestimmte POST Variable gesetzt sein, wird diese Funktion "intern" aufgerufen und das Ergbenis wird über "Echo" ausgegeben.
Über eine selbsgebaute JavaScript Funktion wird XMLHttpRequest.responseText in ein JS Array umgewandelt.

Lange Rede kurzer Sinn: Über Tools wie FireBug (oder allgemein in Quellcode Ansicht) kann ich den SQL Befehl einsehen. Stellt es eine Sicherheitslücke dar, wenn potentielle Unruhestifter sehen wie meine Tabellen / Einträge benannt sind. Welche Sicherheitsrisiken gibt es allgemein beim XMLHttpRequest?

(Input- / Textboxen sind in dem Sinne geimpft, dass im Nachhinein über PHP (Beim Vorschaufenster JS) HTML Code maskiert wird.)

Grüße Sascha

  1. Hello,

    Stellt es eine Sicherheitslücke dar, wenn potentielle Unruhestifter sehen wie meine Tabellen / Einträge benannt sind.

    nun ja, du könntest den Zugang zu deiner MySQL-Installation auch direkt öffentlich machen, falls deine DB-Zugriff.php beliebige Statements von außen zulässt. Eine AJAX-Anfrage ist auch nichts anderes als eine normale Anfrage über das Web. Selbstverständlich solltest du bei beiden sehr genau kontrollieren, was ein Benutzer darf oder nicht. SQL-Statements gehören in aller Regel nicht dazu! Hinterlege Aufrufe die du überprüfen kannst, nicht einfach Statements - Bspw: Hinterlege eine ID, deren Daten ermittelt werden sollen. Du kannst prüfen, ob jemand das darf, ob die ID gültig ist, ..., und entsprechend reagieren.

    MfG
    Rouven

    --
    -------------------
    sh:| fo:} ch:? rl:( br:& n4:{ ie:| mo:} va:) js:| de:] zu:| fl:( ss:) ls:& (SelfCode)
    Eine Bilanz ist wie der Bikini einer Frau. Sie zeigt fast alles, aber verdeckt das Wesentliche  --  Günter Stotz, Regierungsdirektor des baden-württembergischen Wirtschaftsministeriums
    1. Ich hatte es extra mit POST probiert, weil mir GET auf den ersten Blick auf jeden Fall zu gefährlich erschien. Das Ziel war ein "dynamischer Datenbankzugriff". Deshalb will ich ungern auf eventuelle SQL-Baukasten Methoden zurückgreifen.

      du könntest den Zugang zu deiner MySQL-Installation auch direkt öffentlich machen, falls deine DB-Zugriff.php beliebige Statements von außen zulässt.

      Es kommt doch drauf an, wie man "von außen" definiert!?

      Laut Definition könnte man per XMLHTTPRequest nur auf Dateien, die innerhalb des gleichen Verzeichnisses bzw. der Domain liegen, zugreifen. Also könnte doch nach meinem Verständnis nur Derjenige, der Zugriff auf FTP / Webspace hat,die diese Requests beeinflussen ODER kann ich als Seitenbesucher diese Anfragen aktiv manipulieren (Über DebuggerTools wie z.B. FireBug)?
      ----------------------------
      Gut, ich dachte bisher, dass die Übergabe mit POST recht sauber und sicher wäre :(
      Aber so wie es hier http://php-faq.de/q-code-post.html beschrieben ist, könnte ich damit quasi "von Außen" meine DB-Datei auszutricksen...

      Schade, wenn es nicht so klappt wie ich mir das vorstelle :(

      1. Hi,

        Ich hatte es extra mit POST probiert, weil mir GET auf den ersten Blick auf jeden Fall zu gefährlich erschien.

        sich nackt von einer Klippe zu stürzen ist lebensgefährlich. Das Anziehen eines Nachthemdes mag zwar einen Schutz bieten, verbessert die Lage aber nicht wirksam.

        du könntest den Zugang zu deiner MySQL-Installation auch direkt öffentlich machen, falls deine DB-Zugriff.php beliebige Statements von außen zulässt.
        Es kommt doch drauf an, wie man "von außen" definiert!?

        Außerhalb des Servers.

        Laut Definition könnte man per XMLHTTPRequest nur auf Dateien, die innerhalb des gleichen Verzeichnisses bzw. der Domain liegen, zugreifen.

        Das ist eine Beschränkung, die den Client betrifft. Ein XmlHttpRequest ist dennoch nichts anderes als ein HTTP-Request - er kann von *jedem* in *beliebiger* Form hergestellt werden. Mit allen Daten, die Du erwarten kannst. Jeder Request ist fälschbar.

        Also könnte doch nach meinem Verständnis nur Derjenige, der Zugriff auf FTP / Webspace hat,die diese Requests beeinflussen

        Diejenigen, die ein (anderer) Besucher Deiner Website absetzt: Ja. Nicht jedoch die, die er selbst mit einem Client seiner Wahl erzeugt. Ob GET oder POST, ob mit oder ohne Referer, mit jedem User-Agent-String, und auch mit einer frisch gefälschten 300-Euro-Banknote. Dein Server wird's nicht bemerken.

        ODER kann ich als Seitenbesucher diese Anfragen aktiv manipulieren (Über DebuggerTools wie z.B. FireBug)?

        Traue *niemals* Daten, die von einem Client stammen. Nie.

        Gut, ich dachte bisher, dass die Übergabe mit POST recht sauber und sicher wäre :(

        "Sicher" als Positiv existiert nicht. Nur als Komparativ und (sehr selten) als Superlativ.

        Schade, wenn es nicht so klappt wie ich mir das vorstelle :(

        Willkommen im World Wide Web.

        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. Willkommen im World Wide Web.

          Cheatah

          Gut, dann muss ich wohl für meine Internet-Projekte umdisponieren, aber man wächst mit seinen Herausforderungen. :)

  2. Hallo

    Es läuft wie folgt ab: In der Anwendung löse ich bestimmte Ereignisse aus, die einen XMLHttpRequest starten. ...

    Bis hierher JavaScript

    Mit diesem Request übergebe ich bestimmte POST Variablen (z.B. das SQL Statement) an die geladene DB-Zugriff.PHP.

    Nein, die DB-Zugriff.PHP ist nicht geladen, sondern der Server, an den du deinen Request richtest, führt sie, in dem Moment, in dem du sie anforderst, aus. Allerdings ist die Übergabe eines SQL-Statements mit JavaScript, wie du selbst schon feststelltest, ein Sicherheitsloch.

    Lange Rede kurzer Sinn: Über Tools wie FireBug (oder allgemein in Quellcode Ansicht) kann ich den SQL Befehl einsehen. Stellt es eine Sicherheitslücke dar, wenn potentielle Unruhestifter sehen wie meine Tabellen / Einträge benannt sind.

    Übergebe dem PHP-Skript mit dem Request statt des fertigen Statements zusätzlich zu den Nutzdaten Parameter, mit dem es die gewünschte Aktion, z.B. ein SQL-Statement zusammenzubauen, auszuführen und dessen Ergebnis zurückzugeben, auswählt.

    Welche Sicherheitsrisiken gibt es allgemein beim XMLHttpRequest?

    Solange du nicht per HTTPS mit dem Server kommunizierst (egal ob per Ajax, dem Auslösen eines Links (mit Parametern) oder das Absenden eines Formulars), werden alle übermittelten Daten im Klartext verschickt und sind somit auslesbar.

    Tschö, Auge

    --
    Die deutschen Interessen werden am Liechtenstein verteidigt.
    Veranstaltungsdatenbank Vdb 0.2
  3. Hi,

    Stellt es eine Sicherheitslücke dar, wenn potentielle Unruhestifter sehen wie meine Tabellen / Einträge benannt sind.

    nein, das würde ich nicht als Sicherheitslücke bezeichnen. Eher als weit geöffnete Pforte, an die ein Abreißblock mit schriftlichen Einladungen genagelt wurde.

    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. Hallo,

      Stellt es eine Sicherheitslücke dar, wenn potentielle Unruhestifter sehen wie meine Tabellen / Einträge benannt sind.
      nein, das würde ich nicht als Sicherheitslücke bezeichnen. Eher als weit geöffnete Pforte, an die ein Abreißblock mit schriftlichen Einladungen genagelt wurde.

      wenn die Türen ordentlich verschlossen sind und die Alarmanlage in Ordnung ist, sehe ich kein Sicherheitsproblem darin, wenn ein Supermarkt im Schaufenster einen Lageplan der Regale mit der Plazierung Waren aushängt.

      Ciao,
       Martin

      --
      Wenn alle das täten, wass sie mich können,
      käme ich gar nicht mehr zum Sitzen.
  4. Hallo,

    Mit diesem Request übergebe ich bestimmte POST Variablen (z.B. das SQL Statement) an die geladene DB-Zugriff.PHP.

    Wieso schickt der Client SQL-Befehle an den Server? Wieso führt die serverseitige Software einfach so SQL-Befehle aus, die ihr von fremden Leuten zugerufen werden? Du führst dieses eingegebene SQL doch nicht etwa ungeprüft aus? Wenn nein, ist dir klar, dass diese POST-Eingaben beliebig manipuliert werden können?

    Über eine selbsgebaute JavaScript Funktion wird XMLHttpRequest.responseText in ein JS Array umgewandelt.

    Du brauchst nichts umwandeln, wenn du einfach JSON, also direkt JavaScript-Code als Ausgabeformat verwendest und die Serverantwort mit eval() ausführst.

    Lange Rede kurzer Sinn: Über Tools wie FireBug (oder allgemein in Quellcode Ansicht) kann ich den SQL Befehl einsehen. Stellt es eine Sicherheitslücke dar, wenn potentielle Unruhestifter sehen wie meine Tabellen / Einträge benannt sind.

    Na das ist das kleinste Problem. SQL-Befehle haben weder in deinem HTML noch in deinem JavaScript etwas zu suchen, es sei denn, du baust ein Admin-Interface zur Datenbank.

    Welche Sicherheitsrisiken gibt es allgemein beim XMLHttpRequest?

    Allgemein gilt: Problem Exists Between Keyboard And Chair (PEBKAC).

    Mathias

  5. Hi,

    Lange Rede kurzer Sinn: Über Tools wie FireBug (oder allgemein in Quellcode Ansicht) kann ich den SQL Befehl einsehen.

    Ich kann also z.B. sehen, welche Tabellen existieren.
    Und ich kann das SQL-Statement abändern, und daraus z.B. ein DROP TABLE machen ...

    Ist das ein Sicherheitsproblem?

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    O o ostern ...
    Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
    1. Hallo

      Ich kann also z.B. sehen, welche Tabellen existieren.
      Und ich kann das SQL-Statement abändern, und daraus z.B. ein DROP TABLE machen ...

      Ist das ein Sicherheitsproblem?

      Nur, wenn Sascha weiß, was "DROP TABLE" macht. ;-)

      Frei nach dem Motto: Wenn ich die Augen schließe und dich nicht sehe, siehst du mich auch nicht.

      Tschö, Auge

      --
      Die deutschen Interessen werden am Liechtenstein verteidigt.
      Veranstaltungsdatenbank Vdb 0.2
  6. Mahlzeit Sascha,

    Lange Rede kurzer Sinn: Über Tools wie FireBug (oder allgemein in Quellcode Ansicht) kann ich den SQL Befehl einsehen.

    Das ist prinzipiell schlecht.

    Stellt es eine Sicherheitslücke dar, wenn potentielle Unruhestifter sehen wie meine Tabellen / Einträge benannt sind.

    Prinzipiell ja.

    Welche Sicherheitsrisiken gibt es allgemein beim XMLHttpRequest?

    Da bin zumindest ich jetzt im Moment überfragt - aber allein schon die Tatsache, dass SQL-Abfragen im Klartext im ausgelieferten Code enthalten sind, ist IMHO ein ganz extremes Sicherheitsrisiko.

    MfG,
    EKKi

    --
    sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|