[PHP] Abgesicherter Bereich

Dieses Thema im Forum "Webentwicklung" wurde erstellt von Blackb!rd, 6. September 2009 .

  1. 6. September 2009
    Abgesicherter Bereich

    Hey Leute,

    ich arbeite gerade an einem System zur Rechnugsverwaltung von Kunden. Dieses System soll auf PHP basieren und natürliche eine nötige Sicherheit bieten. Könnt ihr mir ein paar Ansätze geben worauf ich achten sollte um das System sicher zu bekommen?

    Meine bisherigen Absicherungen:
    • Mysql-Escape-String
    • User-Login, ID in Session - Passwort als MD5 Hash gespeichert
    • Bei jeder Seite zusätzlich ID und Zugriffsrechte prüfen



    Gruß Blackbird
     
  2. 6. September 2009
    AW: Abgesicherter Bereich

    naja hast im großen und ganzen alles.. würde halt noch, wenn du formulardaten abschickst etc. für einen bestimmten kunden, leitest du sicher mit der ID per get oder so weiter.. würde daher in den formularen, die id in ein hidden-input packen und dann beim auswerten der daten überprüfen, ob die id per get oder session = der id ist, die vom formular abgesendet wurde.

    formular daten vorher durch strip_tags laufen lassen (wird auch schon möglicher schadcode entfernt)

    mysql_dumps machen.. am besten per cronjob..

    joa das wäres erstmal, wenn mir noch was einfällt, poste ich nochmal.
     
  3. 7. September 2009
    AW: Abgesicherter Bereich

    sie dir mal session_regenerate_id(true) an.
    damit können sessions in einer neue session übertragen werden.
    dabei wird die alte session gelöscht (wenn true).
    das soll verhindern, dass sessions von fremden übernommen werden können.
     
  4. 7. September 2009
    AW: Abgesicherter Bereich

    Sieht nice aus, habs mir grad mal angeguckt...scheint ne sinnvolle Sache zu sein. Werde es in meinem Script mit einbauen.

    Hat noch wer weitere Sicherheitsvorkehrungen?


    Gruß Blackbird
     
  5. 9. September 2009
    AW: Abgesicherter Bereich

    ip, cookies, proxy, host, browser und vieles mehr. dein programm muss besucherverhalten auswerten und gegen unerwünschte bots/roboter schützen!

    ich könnte dir vieles aufschreiben... doch du musst dir selbst überlegen was und wie du es absichern willst.
     
  6. 10. September 2009
    AW: Abgesicherter Bereich

    Guter Punkt, ich sollte die fehlgeschlagenen Logins zählen und die IP nach x falschen Versuchen für xx Miunten sperren. Das sollte ausreichen denke ich.


    Gruß Blackbird
     
  7. 10. September 2009
    AW: Abgesicherter Bereich

    id's immer intval() setzten, sind ja nur zahlen
    bruteforce: ip sperre wie du schreibst
    scripte die einzeln nicht aufgerufen werden müssen, auch "verschließen" <?php if (!$in_der_mainphp_festgelegt) die('Kein direkter Aufruf'); ?>
    mysql_real_escape, stripslashes, htmlentities
    cookies verschlüsseln
    passwörter und co immer verschlüsselt in die db: z.b. md5($salt.md5($password));

    das deckt bestimmt schon 99% ab, denke ich.

    Ansonsten Buch-Tipp: PHP Sicherheit von Stefan Esser
     
  8. 14. September 2009
    AW: Abgesicherter Bereich

    Hallo,

    soll das Rechnungssystem denn im Internet laufen oder in einem Intranet ?

    Bei Internet wäre TLS (SSL / HTTPS) sicher ein Thema.

    BG MaxDev
     
  9. 14. September 2009
    AW: Abgesicherter Bereich

    Hier noch meine Ansätze für eine gute Sicherheit (zusätzlich zu den bereits bekannten hier):
    - Statt md5() kannst du alternativ auch sha1() benutzen (sha erzeugt 40bit, md5 (nur) 32bit-strings)... sind aber beide nich umkehrbar... naja, aber sag das mal den chinesen^^
    - Wie oben angesprochen, Salting verwenden (Passwörter salzen ). Dazu einen dynamischen, sowie statischen Salt. Der statische steht irgendwo hard im Quellcode... der dynamische wird für jeden Benutzer seperat erzeugt => schützt aber ned vor Bruteforcing... aber stellt sicher, das Leute selbst bei gehackten Datenbanken nicht ans Passwort kommen
    - Das abfangen des Datentyps in Formularfeldern oder das alleinige strippen reicht nicht aus. Man erwartet in einem Formularfeld konkrete Werte, die man nach konkreten Kriterien beurteilen soll. Dazu empfiehlt es sich, eigene Validatoren zu schreiben, die eine Eingabe auf ein verwendetes Muster hinüberprüfen, String-Längen checken usw. Zum validieren kannst du auch Zend_Validate verwenden (Bestandteil des Zend Frameworks, kannst du aber auch lose verwenden)
    - Eine möglichst kurze Session Lifetime setzen und das Login-Formular über https senden lassen... und natürlich auch session_regenerate_id() verwenden
    - Parameter von irgendwelchen globalen Variablen ($_POST, $_GET etc.) nicht direkt für includes verwenden, bspw: include($_GET['site'].'php'); <<= is tödlich^^
    - Menü sowie die einzelnen Seiten mit einer Permission-Abfrage austatten... am besten über eine boolsche Abfrage mit Typ-Abfrage (drei Gleichzeitszeichen => MyAuthControl::hasPermission('customer.profile.edit') === true) ... so als Beispiel.

    Dann ist deine Webseite bereits ziemlich sicher. Nur musst du auch deinen Apache absichern. Wenn du SSH hast, den root sperren, Passwörter für den DB-Zugriff generieren etc.
     
  10. 2. Oktober 2009
    AW: Abgesicherter Bereich

    man md5 als auch sha1 verwenden, ist eigentlich egal. sind auch beide entschlüsselbar ^^mit ein paar kleinen tricks kannst du dein passwort so generieren, dass du dir keine sorgen um die machen musst:
    PHP:
    <? php
    $pass 
    "test" ;
    $md5  md5 ( $pass );  // len: 32
    $arr  str_split ( $md5 );  // array
    $new  "" // neues pass
    foreach( $arr  as  $key $new  .=  substr ( md5 ( $key ), 0 , 10 );
    $new  substr ( $new , 0 , 32 // neuer hash
    ?>
    das thema salt: keine statische salt-werte verwenden, es sei dem beim einloggen ist nur das passwort gefragt ohne namen. ansonsten erstellt man salt so z.b.:
    PHP:
    <? php
    $name 
    "Peter" ;
    $pass  "test" ;
    $salt  substr ( $name , 0 , 2 );  // Pe
    $hash  md5 ( $salt . $pass );  // der hash mit salt
    ?>
    auswerten von post oder get am besten mit regulären ausdrücken. diese ganzen zend frame... sind einfach viel zu lahm.
    PHP:
    <? php
    if( preg_match ( $string , $muster )) echo  "ok" ;
    ?>
    sessions brauchen ein vernünftiges management und ein paar sicherheitsmechanismen. es ist möglich die session_id zu beinflüssen, doch ich würde die finger davon lassen, da es etwas aufwendig ist. aber dafür lassen sich viele andere session-werte beinflüssen. ein paar wichtige punkte:
    - prüfen ob der benutzer überhaupt eine session benutzen darf (ip/host/verhalten)
    - session-inhalt ($_SESSION) so klein wie möglich halten

    datenbanken
    unbedingt cache verwenden bzw. basteln um den server zu entlasten. natürlich darf man auch nicht die sql-injectionen vergessen. aber dazu gibts genug bei google

    kleine sicherheitsmechanismen
    z.b. wie bei phpclasses.org: nach einer gewisser zeit kommt captcha-abfrage und verschwindet nach der eingabe wieder. finde ich besser als bei jeder seite bzw. jedem formular abzufragen.

    so das wars erstmal
     
  11. 2. Oktober 2009
    AW: Abgesicherter Bereich

    Die PHP-Einstellung open_basedir wär eventuell noch interessant. Die Einstellung verhindert, dass ein PHP-Script auf Dateien außerhalb des erlaubten Bereichs zulässt.

    Angenommen in /var/www liegt deine test.php und hast über open_basedir dieses Verzeichnis zur Ausführung freigegeben. Dann hat jemand, weil dein Script war, per inject versucht an die /etc/passwd heranzukommen. Wurde aber nix drauß, weil der Vorgang mit einer Fehlermeldung (open_basedir restricted access...) abgebrochen wurde, da /etc/passwd ja außerhalb von /var/www liegt.
    Man könnte das als mehr oder weniger passives "jail" bezeichnen.
     
  12. 2. Oktober 2009
    AW: Abgesicherter Bereich

    wäre mir neu oO außerdem ist imho md5 schneller als sha1
     
  13. 2. Oktober 2009
    AW: Abgesicherter Bereich

    wenn du darauf hinaus willst, dass man zu hashes nur kollisionen finden kann, dann hast du absolut recht.

    hashes = one-way... klartext ist für immer und ewig verloren. rein theoretisch könnte eine zeichenkette "abalajkdshkjasjdvn...." den gleichen hash erzeugen wie "a".

    afaik sind aktuelle vorgehen bei der suche nach kollisionen bei md5 in der tat schneller als sha1. beim hashen unterscheiden sich die funktionen in ihrer geschwindigkeit nur unwesentlich...

    so viel zur kryptografischen seite...

    btt: sinnvoll würde ich finden, diverse vorgänge zu protokollieren. so z.b. das einloggen eines nutzers (ip, uhrzeit, evtl. fehlversuche der gleichen ip etc.)
     
  14. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.