Olen nyt tässä duunaillut admin-paneelia pelilleni ja mieleeni nousi admin-paneelin turvallisuus, koska sitähän en halua, että muut käyttäjät pääsevät siihen käsiksi.
Miten juttu tällä hetkellä toimii: Tietokannassa Taso, joka on numero 1-3. 1 = Käyttäjä, 2 = Moderaattori, 3 = Administraattori. Käyttäjän kirjautuessa järjestelmään haetaan käyttäjän taso tietokannasta ja tallennetaan keksiin. Kun sitten käyttäjä kirjautuu sisään tarkistetaan onko taso isompi tai yhtäsuuri kuin 3, jos on, echotaan admin-valikko.
Sama koskee "itse" admin-paneelia. Jos käyttäjä yrittää päästä php-filuun johonka hänellä ei pitäisi olla käyttöoikeuksia tarkistetaan onko käyttäjä taas oikealla tasolla cookiesta.
Eli kysymys kuuluukin onko tämä tapa toimiva ja turvallinen?
Käyttäjätason tarkistus joka sivun alussa on hyvä ajatus. Mutta pelkkä tason tallennus evästeeseen ei riitä, sillä käyttäjä pystyy muuttamaan selaimen evästeitä.
Minä olen tehnyt niin, että evästeeseen tallennetaan käyttäjän tunnus ja salasana (MD5-muodossa). Sitten joka sivun alussa tarkistetaan, onko tietokannassa esim. tällaista riviä:
SELECT tunnus FROM kayttajat WHERE tunnus = '$tunnus' AND salasana = '$salasana' AND taso >= 3
Tässä $tunnus ja $salasana ovat evästeeseen tallennetut tiedot. Tarkistettava asia on, että tällainen rivi on tietokannassa, ei siis ole merkitystä, mikä kenttä haetaan.
Näin tehtynä käyttäjän tunnistus on luotettava ja turvallinen. Toinen vaihtoehto on käyttää evästeiden asemesta istuntoja.
Aivan. Täytyykin koittaa tätä tapaa ja kiitos avusta.
hmm.. heräsi vielä kysymys jos toteuttaisin asian sessioneilla, niin tekisinkö jokaiselle käyttäjäryhmälle oman session ja kirjautuessa annettaisiin esim. tason mukaan "Moderaattori", "Käyttäjä", tai "Administraattori" - sessio. Ja esimerkiksi admin-paneeliin koitettaessa tarkistetaan onko sessio, administraattori voimassa?
Istuntoja käyttämällä riittää, että joka sivun alussa kutsutaan funktiota session_start. Tämän jälkeen tietoja voi panna muistiin taulukkoon $_SESSION. Istunnon tiedot tallennetaan palvelimelle, joten käyttäjä ei pääse niitä näkemään. Esim. tässä tapauksessa tallennettavat tiedot ovat käyttäjän tunnus ja käyttäjätaso.
Lisää tietoa: https://www.ohjelmointiputka.net/oppaat/opas.
Ajattelin nyt lähteä liikenteeseen sessioiden kanssa hieman viisaanpana. Nyt sovellus toimii siis niin, että kirjautuessa laitetaan käyttäjätunnus ja muita tietoja sessioniin, jotta niitä ei myöskään tarvi joka kerta ladata aina tietokannasta.
Idea on periaatteessa sama kun keksien kanssa, mutta nyt toteutettu vain sessioneilla(en tiennyt että sessiot tallentuvat palvelimelle :() Eli tarkistetaan aina onko esims session["taso"] riittävän iso, jos on niin echotaan taas admin paneeli jne. Tällä tavalla järjestelmä on siis tietoturvallisempi kuin cookieiden kanssa pelattaessa?
Haluan vain olla varma asiasta :)
Ravver kirjoitti:
Tällä tavalla järjestelmä on siis tietoturvallisempi kuin cookieiden kanssa pelattaessa?
Juu, koska sen sijaan, että tallentaisit tiedon "taso=käyttäjä" käyttäjän koneelle, jossa ilkeä mustahattu voi sitä helposti muokata, tallennat sen palvelimelle, jolloin siihen suoraan ei pääse käsiksi kuin palvelimen ylläpitäjä. Käyttäjän koneelle annetaan vain ID, jonka kyllä voi teoriassa arvata, ja näin päästä käsiksi ylläpitäjän sessioon (session hijacking), mutta joka käytännössä on hyvin hankalaa. Etenkin kun ID on voimassa vain sen aikaa kun olet kirjautuneena sisään.
Selvä homma. Onneksi kysyin tästä tässä vaiheessa kun projekti on vasta aluillaan :)
Aihe on jo aika vanha, joten et voi enää vastata siihen.