Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Kirjautumisen turvallisuus (php)

Jarzka [08.02.2011 00:29:07]

#

Hei

Olen harjoitusmielessä tehnyt php:llä sivuston, jolle voi tehdä tunnuksen ja kirjautua sisään. Tunnukset ovat MySQL-tietokannassa ja kirjautuminen tapahtuu php:n session_start():lla. Kun käyttäjä kirjautuu sisään, asetetaan eväste tähän tyyliin:
$_SESSION["user"] = @mysql_result($mysql_query , 0, "name");

Mietin tuossa kuitenkin, että onkohan käyttäjällä mahdollisuus luoda selaimeen oma eväste jollain kikalla? Siinä tapauksessahan salasanan tarkistuksen voisi kiertää helposti asettamalla tuollaisen user-evästeen ja sen arvoksi jonkin käyttäjän nimi? Siitä ei käsittääkseni ole mitään puhuttu näissä Ohjelmointiputkan oppaissa?

Oli mahdollista tai ei, ihan turvallisuussyistä ratkaisuksi tähän ajattelin, että kirjautuessa asetetaan myös toinen eväste, jonka nimi on password ja siihen otetaan mukaan käyttäjän salasanan md5-hashi. Näin ollen käyttäjänimi ja salasana kuljetetaan mukana koko ajan sivustoa selatessa ja vaikka käyttäjä onnistuisikin luomaan oman evästeen, pitäisi salasana silti tietää.

Toisaalta eikös tuo salasana ole mahdollista yrittää selvittää brute forcella (luomalla jatkuvasti tuota password-evästettä ja kokeilemalla millä pääsee sisään)? Ja vaikka käyttäjän tilin laittaisi palvelimelle lukkoon liian monen epäonnistuneen kirjautumisen seurauksena, joku voisi tahallaan yrittää pommittaa tunnusta ja pitää sen koko ajan lukittuna. Onko tähän mitään ratkaisua?

Grez [08.02.2011 00:37:28]

#

Saanen huomauttaa, että käyttäjän eväste luodaan tarvittaessa session_startilla. Tuo $_SESSION -taulukkoon tallentaminen tallentaa tiedon omalle palvelimellesi ja se kohdistetaan oikeaan käyttäjään käyttäjän evästeessä olevan istuntotunnisteen perusteella.

Jos haluat lisäturvallisuutta, niin ei todellakaan kannata laittaa mitään tiivistettä (miksi nämä tiivisteet onkin niin kivoja että kaikki aloittelijat aina väärinkäyttää niitä) vaan ihan vaan generoit haluamasi pituisen satunnaismerkkijonon ja talletat sen tuonne $_SESSION-taulukkoon. Sitten jatkossa vertaat että ne täsmää.

Näköjään mitä tuote PHP:n dokumentaatiota luin, niin sielläkin tuo session id muodostetaan MD5:llä. Näköjään sama tauti vaivaa PHP:n kehittäjiä - tosin eipä ole läheskään eka PHP:n WTF. Harmi ettei missään kerrota mitä sillä hash-funktiolle syötetään. Täytyy varmaan jossain välissä tarkistaa sorsista.

Eli siis ilman mitään lisäviritystä jos sinulla on 1000 aktiivista istuntoa ja käyttäjä pystyy käymään 1000 istuntotunnusta läpi sekunnissa, niin odotusarvo että tärppää on noin 10 000 000 000 000 000 000 000 000 vuotta.

Tämä siis sillä oletuksella että MD5-tiivisteen koko 128 bittinen "avaruus" oikeasti käytetään PHP:ssä.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta