thom: CMS und Sicherheit

Guten Abend!

Habe ein kleines CMS programmiert und wollte euch bezüglich Sicherheit etwas fragen.
1.) Die User des CMS müssen sich authentifizieren, das Passwort steht als md5-hash in der Datenbank.
2.) Damit nur registrierte User das CMS benutzen können, wird eine Session verwendet, die Session-ID wird über Cookies oder die URL übergeben.
3.) GET-Parameter an einen SQL-Query werden mit mysql_real_escape_string() behandelt, um gegen SQL-Injections geschützt zu sein.
4.) Die session_id wird mit strip_tags() gegen XSS-Angriffe behandelt.

Wenn mir jemand mit Ergänzungen, Verbesserungen oder Kommentaren zu meinen Sicherheitsvorkehrungen helfen kann, bin ich dankbar.

Schönen Abend noch, thom

  1. moin,

    3.) GET-Parameter an einen SQL-Query werden mit mysql_real_escape_string() behandelt, um gegen SQL-Injections geschützt zu sein.

    Verdächtig. Unabhängig von "mysql_real_escape_string()" solltest Du selbst die Kontrolle darüber haben, welche Parameter es geben darf und welche Werte diese annehmen dürfen.

    Ich hatte diesbezüglich vor vielen Jahren, als PERL-Anfänger, einmal ein Sicherheitsproblem, das war zwar nicht weiter tragisch, aber lehrreich.

    --roro

    1. Hallo Rolf,

      Verdächtig. Unabhängig von "mysql_real_escape_string()" solltest Du selbst die Kontrolle darüber haben, welche Parameter es geben darf und welche Werte diese annehmen dürfen.

      Nein, mysql_real_escape_string() ist schon die richtige Funktion für MySQL-Querys.

      Gruß,

      Johannes

      1. Hell-O!

        Verdächtig. Unabhängig von "mysql_real_escape_string()" solltest Du selbst die Kontrolle darüber haben, welche Parameter es geben darf und welche Werte diese annehmen dürfen.
        Nein, mysql_real_escape_string() ist schon die richtige Funktion für MySQL-Querys.

        Das hat Rolf ja auch nicht bestritten, ihm ging es eher darum, dass im Script vor einer Verarbeitung der Daten geprüft werden sollte, welche Parameter übermittelt wurden, ob sie zulässig sind und ob sie einen gültigen Wert enthalten. Und dabei hilft mysql_real_escape_string kein Stück weiter.

        Siechfred

        --
        Ich bin strenggenommen auch nur interessierter Laie. (molily)
        Zitat des Tages || Falle Aufteilungsbescheid || RT 221 Erfurt-Altstadt i.V.
  2. echo $begrüßung;

    4.) Die session_id wird mit strip_tags() gegen XSS-Angriffe behandelt.

    Warum dieses? An welchen Stellen gelangt die Session-ID in andere Kontexte? An diesen Stellen soll sie kontextgerecht maskiert werden. Das gilt für alle Arten von Daten.

    • Das was deine Benutzer eingeben muss für den Kontextwechsel nach SQL SQL-gerecht maskiert werden (mysql_real_escape_string() im Falle von MySQL).
    • Das was auf eine Webseite ausgegeben werden soll, muss HTML-gerecht maskiert werden (htmlspecialchars()).
    • Daten, die in eine URL gelangen sollen, müssen URL-gerecht kodiert werden (urlencode()). Soll diese URL im HTML-Code auftauchen, muss sie anschließend noch HTML-gerecht behandelt werden (htmlspecialchars()).

    Natürlich ist es auch nicht verkehrt, bereits bei der Entgegennahme der Daten diese auf gültige Werte zu prüfen. Die Behandlung beim Kontextwechsel sollte aber unabhängig von dieser Prüfung nicht vergessen werden.

    echo "$verabschiedung $name";

  3. Hallo thom,

    Wenn mir jemand mit Ergänzungen, Verbesserungen oder Kommentaren zu meinen Sicherheitsvorkehrungen helfen kann, bin ich dankbar.

    Es ist gut, dass du dir Gedanken über die Sicherheit deiner Software machst. Aber Sicherheit erzielt man nicht dadurch, dass man Checklisten von konkreten Problemen abarbeitet. Wenn du eine sichere Anwendung schreiben willst, musst du den Sicherheitsgedanken bei _allen_ Sachen, die du implementierst im Hinterkopf behalten und beim Entwickeln fortwährend mit bedenken, ob deine Lösungen aus Sicherheitssicht problematisch sein könnten.

    Viele Grüße,

    Johannes