Ferdinand: Wie sichere Downloadseite programmieren?

Hallo,

für einen kleinen Auftrag soll ich einem Auftraggeber eine
Downloadseite programmieren, auf der sich seine Kunden
mit ihrer Kundennummer und PW einloggen und dann irgendwelche
Artikel und Dateien runterladen können.

Der download soll beschränkt sein auf die Dateien, für die
sie freigeschaltet sind (und bezahlt haben).

Mein Auftraggeber, technisch wenig versiert, hat panische
Angst vor Hackern, deswegen soll alles möglichst so sicher
wie Fort Knox sein.

Diese Panik, muss ich zugeben, verunsichert mich ein wenig,
deswegen wollte ich mal Eure Meinung hören wie Ihr das angehen
würdet. Mein Vorschlag wäre einfach https und PHP, Passworte in
MySQL. Alles andere wird aufwendiger und teurer. Oder spricht
da was dagegen.

Danke für Euren Rat.

Gruss
Ferdinand

  1. Hallo,

    Diese Panik, muss ich zugeben, verunsichert mich ein wenig,
    deswegen wollte ich mal Eure Meinung hören wie Ihr das angehen
    würdet. Mein Vorschlag wäre einfach https und PHP, Passworte in
    MySQL. Alles andere wird aufwendiger und teurer. Oder spricht
    da was dagegen.

    Vom Konzept her ist das sicherlich eine gute Idee. HTTPS mit 128bit-Verschlüsselung ist so gut wie abhörsicher (naja - der Aufwand wäre so groß und es würde so lange dauern, dass sich die betreffende Person den Download warscheinlich 100mal kaufen können *g*) Ob Du jetzt PHP oder Perl, MySQL oder PostgreSQL oder flat files nimmst, ist egal. Worauf es ankommt: Du musst Die Scripte sicher programmieren.

    Daher:

    1. Passwörter mindestens 8 Zeichen lang (sonst lohnt sich evtl. noch eine Brute-Force-Attacke)
    2. _ALLE_ Benutzereingaben müssen validiert werden
    3. Übergebe niemals wichtige Informationen für das Script an den User
    4. Security through obscurity does not work - mach' dein System so sicher, dass selbst wenn er DB-Struktur (aber nicht Inhalt) und Script-Quelltext kennt, er es trotzdem nicht knacken könnte
    5. Sei noch paranoischer als Dein Auftraggeber und überlege Dir, an welchen stellen ein Einbrecher Angriffsmöglichkeiten hätte
    6. Lieber einmal zuviel die Rechte überprüft, als einmal zu wenig.
    7. Speziell zu Dir: Speichere die Downloads außerhalb des DocumentRoots und arbeite mit fpassthru(), sobald die Rechteüberprüfung fertig ist.
    8. Wenn Du PHP nimmst, dann nimm mindestens 4.2.3 - alles andere hat Sicherheitslücken
    9. Verzichte bei PHP auf register_globals, damit Du immer genau weißt, woher die Variable kommt
    10. Wieder PHP: Nimm $_SESSION statt session_(un|is)register(ed), letztere sind ein Krampf bei register_globals = off

    Zu 3: Der Punkt ist etwas "unscharf" beschrieben, daher jetzt ein Beispiel: Wenn Du z.B. verschiedene Dateien include()en willst, je nachdem, was der User machen will, dann übergib' niemals den Dateinamen in der URI oder im Formular. Du könntest diesen zwar überprüfen, aber das ist mühsehlig. Speichere den Dateinamen lieber irgendwo ab und ordne ihm eine ID zu (entweder Array oder DB, je nachdem, ob es statisch oder dynamisch ist) und übergebe diese ID.

    Grüße,

    Christian

    1. Vielen Dank!

      Hallo,

      Diese Panik, muss ich zugeben, verunsichert mich ein wenig,
      deswegen wollte ich mal Eure Meinung hören wie Ihr das angehen
      würdet. Mein Vorschlag wäre einfach https und PHP, Passworte in
      MySQL. Alles andere wird aufwendiger und teurer. Oder spricht
      da was dagegen.

      Vom Konzept her ist das sicherlich eine gute Idee. HTTPS mit 128bit-Verschlüsselung ist so gut wie abhörsicher (naja - der Aufwand wäre so groß und es würde so lange dauern, dass sich die betreffende Person den Download warscheinlich 100mal kaufen können *g*) Ob Du jetzt PHP oder Perl, MySQL oder PostgreSQL oder flat files nimmst, ist egal. Worauf es ankommt: Du musst Die Scripte sicher programmieren.

      Daher:

      1. Passwörter mindestens 8 Zeichen lang (sonst lohnt sich evtl. noch eine Brute-Force-Attacke)
      2. _ALLE_ Benutzereingaben müssen validiert werden
      3. Übergebe niemals wichtige Informationen für das Script an den User
      4. Security through obscurity does not work - mach' dein System so sicher, dass selbst wenn er DB-Struktur (aber nicht Inhalt) und Script-Quelltext kennt, er es trotzdem nicht knacken könnte
      5. Sei noch paranoischer als Dein Auftraggeber und überlege Dir, an welchen stellen ein Einbrecher Angriffsmöglichkeiten hätte
      6. Lieber einmal zuviel die Rechte überprüft, als einmal zu wenig.
      7. Speziell zu Dir: Speichere die Downloads außerhalb des DocumentRoots und arbeite mit fpassthru(), sobald die Rechteüberprüfung fertig ist.
      8. Wenn Du PHP nimmst, dann nimm mindestens 4.2.3 - alles andere hat Sicherheitslücken
      9. Verzichte bei PHP auf register_globals, damit Du immer genau weißt, woher die Variable kommt
      10. Wieder PHP: Nimm $_SESSION statt session_(un|is)register(ed), letztere sind ein Krampf bei register_globals = off

      Zu 3: Der Punkt ist etwas "unscharf" beschrieben, daher jetzt ein Beispiel: Wenn Du z.B. verschiedene Dateien include()en willst, je nachdem, was der User machen will, dann übergib' niemals den Dateinamen in der URI oder im Formular. Du könntest diesen zwar überprüfen, aber das ist mühsehlig. Speichere den Dateinamen lieber irgendwo ab und ordne ihm eine ID zu (entweder Array oder DB, je nachdem, ob es statisch oder dynamisch ist) und übergebe diese ID.

      Grüße,

      Christian