#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 + Multi-Zitat Zitieren
#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. + Multi-Zitat Zitieren
#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. + Multi-Zitat Zitieren
#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 + Multi-Zitat Zitieren
#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. + Multi-Zitat Zitieren
#6 9. September 2009 AW: Abgesicherter Bereich Wie bist du gegen Bruteforce geschützt? + Multi-Zitat Zitieren
#7 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 + Multi-Zitat Zitieren
#8 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 + Multi-Zitat Zitieren
#9 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 + Multi-Zitat Zitieren
#10 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. + Multi-Zitat Zitieren
#11 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 + Multi-Zitat Zitieren
#12 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. + Multi-Zitat Zitieren
#13 2. Oktober 2009 AW: Abgesicherter Bereich wäre mir neu oO außerdem ist imho md5 schneller als sha1 + Multi-Zitat Zitieren
#14 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.) + Multi-Zitat Zitieren