Sokat gondolkodtam már rajta, hogy mi lehet a legjobb megoldás biztonsági szempontból a felhasználók bejelentkeztetésénél. Olvastam angol oldalakon róla, és én a következőket vontam le:
- A login formban mindig használd a Zend_Form_Elements_Hash -t ( és úgy egyébként minden formban, nyugodtan )
- Személy szerint utálom a captcha és társait, van erre egy jobb, számomra jobb megoldás. Ha egy bizonyos mennyiségnél többszőr elrontotta a jelszavát a felhasználó akkor kitiltom x időre. Elég itt mondjuk 20 mp is, vagy 1 perc, a brute force tipusú támadásokat ez megállítja ( kurvára lelassítja, értelmét veszti ).
Amikor egy létező felhasznál névvel sikertelen a bejelentkezés ( rossz jelszó miatt ) egy számlálót az adatbázisban növelek egyel, legyen ez faildnum, és egy másikba elmentem az aktuális időpontot, legyen ez lastfaild.
Ha a lastfaild óta eltelt egy meghatározott idő intervallum, akkor a faildnum -ot 0 -ra állítom.
Ha a faildnum elért egy bizonyos mennyiséget egy másik értéket, legyen ban, beállítom az aktuális idő + a ban idejére.
Bejelentkezéskor figyelem, hogy a ban mezőben szereplő időpont kisebb egyenlő, vagy nagyobb e a mostani időpontnál.
- Vigyázz, hogy a beviteli mezőkön keresztül ne lehessen sql kódot bejuttatni az adatbázisodba, mindig escapeld (mysql_real_escape_string) az sql-be átadott paramétereket, SŐT! A legjobb ha a Doctrine -t használod. Ha megtanultad a használatát, nagyon megtudja gyorsítani a munkádat, és ha helyesen használod, nem lesz gondod a mysql inject támadásokkal. Itt egy példa:
Doctrine_Manager::connection() ->gettable('users') ->findByDql(' name = ? AND password = ? ', array( $name , $password ) );
A fenti példában a felhasználó neve és jelszava autómatikussan escepelve lesz.
- Másik fontos támadási mód, ha valamilyen módon ellopják a session-öd, ehez elég csak megtudni a cookiekat, amik a gépedre vannak mentve. Ezellen védelmi módszer:
A bejelentkezés során, a felhasználó böngészőjébe ments egy cookiet, ami tartalmazza md5-ölve a felhasználó ip -jét, és némi plussz karaktereket előtte és utánna is, lényeg hogy visszafejteni nehéz legyen. pl.:
$ip=$_SERVER['REMOTE_ADDR']; $cookie = md5( $salt1 . $ip . $salt2); setcookie( 'myauth' , $cookie , 0 , '/' , null , false , true );
Minden oldal letöltésnél, ugyanezzel a módszerrel generáld le a cookie-t, de a setcookie részt hagyd ki! és vesd össze a böngészőben tárolt cookie-val.
Ha nem egyeznek meg, akkor ip cím változás volt, azaz a session-t lehet hogy ellopták és egy másik gépről próbálják használni. Itt van a hátránya is ennek a módszernek, ha a felhasználó olyan internet kapcsolatot használ ( pl. egy tűzfal, aminek 2 vagy több internet kapcsolata van és auto ballancing van beállítva rajta ) aminél nem állandóan ugyanaz az ip címe, így nem fogja tudni használni az oldalt.
Emiatt a probléma miatt, ezt a megoldást csak különössen fontos helyeken használom, pl az admin felhasználóknál.
- Ne használj olyan megoldásokat a jelszó tárolásnál, vagy az előző pontban a cookie létrehozásánál, mint pl.: md5( $salt1 . md5( $ip ) . md5( $salt2 ) );
Ettől nem lesz biztonságosabb, nehezebben visszafejthető, sőt, md5 -ön belüli md5 esetén még kevesebb lesz a lehetőségek száma, olvasd el a php oldalán az md5-höz tartozó hozzászólásokat itt.
- Minden oldalt körültekintően készíts, soha ne bízz a felhasználók által megadott adatokban! Ez minden programozási nyelvre igaz, anno ez volt az első amit megtanultam a tanárom révén :)