Ajatellaan tilanne, että on kaksi eri ohjelmistoa mihin kirjaudutaan samalta koneelta eri välilehdille.
Molemmissa ohjelmissa kirjautumistiedot laitetaan sessiion. (tarkistus kirjautumisesta, sekä muuta hyödyllistä tietoa)
Kirjaudut ohjelmaan 1, avaat uuden välilehden ja kirjaudut ohjelmaan 2.
Hetkellisesti nämä ohjelman 1 session tiedot näkyvät ohjelmassa 2:si.
Onko tämä kuinka riskialtista, miten tämän voi välttää?
"2:si"???????????
Mutta itse asiaan. Miksi täysin toisilleen vieraiden ohjelmien/sivustojen sessiot näkyisivät toisilleen tuosta vain? Jos näin on, niin selaimessa on bugi, joka pitää korjata.
Enemmän kuulostaa siltä, että mannisella on kirjautumis-sivustot samalla (omalla) palvelimella, mistä tuo johtuisi.
Paras ratkaisu on laittaa ohjelmistot eri hakemistoihin ja asettaa funktiolla session_set_cookie_params istunnolle oikea polku. Toinen tapa (edellisen lisäksi tyylikkyyden vuoksi tai itsenäisenä purkkaratkaisuna) on asettaa eri ohjelmistoissa istunnoille eri nimet.
function my_session_start() { session_set_cookie_params(0, "/mannisoft/purkka/"); session_name("Mannisoft_oy_purkka_id"); session_start(); }
Kiitoksia!!
Mielestäni tietoturvan kannalta huono, jos järjestelmien istuntotiedot ei ole selkeeästi eroteltu. En tiedä pystyisikö käyttäjä edelleen muutosten jälkeen virittämään itsensä sisään järjestelmään 2 muokkaamalla järjestelmältä 1 tulevia tietoja (eli miten laajalti tuo session_name vaikuttaa).
Jos nuo Metabolixin mainitsemmat keinot ei itsessäään takaa tietojen erillään pysymistä, niin määritelisin lisäksi istuntotietojen tallennukseen erillisen hakemiston molemmille järjestelmille. Nythän ne käyttävät ilmeisesti oletushakemistoa.
Grez kirjoitti:
Mielestäni tietoturvan kannalta huono, jos järjestelmien istuntotiedot ei ole selkeeästi eroteltu. En tiedä pystyisikö käyttäjä edelleen muutosten jälkeen virittämään itsensä sisään järjestelmään 2 muokkaamalla järjestelmältä 1 tulevia tietoja (eli miten laajalti tuo session_name vaikuttaa).
Sehän nyt riippuu ihan siitä, että onko esim. kirjautumisen varmistus luokkaa "isset($_COOKIE['login'])" vai käytetäänkö jotain varmistetta.
Kirjautmisen varmistaminen on luokkaa
"isset($_SESSION['login']" sekä
tämän tarkistuksen jälkeen tarkistetaan, että määritetty $_SESSION['login'] on sama kuin session_tunniste, joka on tallessa tietokannassa. Tietokantaan session_tunniste muutetaan aina käyttäjän kirjautuessa järjestelmään.
The Alchemist kirjoitti:
Sehän nyt riippuu ihan siitä, että onko esim. kirjautumisen varmistus luokkaa "isset($_COOKIE['login'])" vai käytetäänkö jotain varmistetta.
Mielestäni keksien ei tarvitsisi omassa koodissa esiintyä millään tavalla, jos käytetään istuntoja. Eikä se, että istunnon voimassaolo tarkistetaan omalla virityksellä edes pelasta tilannetta mitä tulee mahdollisiin sessioon varastoitujen tietojen sekoamiseen järjestelmien kesken.
Grez on oikeassa tietoturvan suhteen. Jos tarkistus on todella tasoa isset($_SESSION["login"]), käyttäjä voi murtautua toiseen järjestelmään niin, että kirjautuu ensin yhteen ja kopioi sitten istuntotunnuksensa toiseen. Toki järjestelmäkohtainen tietokantatarkistus auttaa tähän. Toisaalta tarkistuksen voi (ja kannattaakin) lisätä myös yllä esittämääni aloitusfunktioon:
function my_session_start() { $nimi = "Mannisoft_oy_purkka_id"; $polku = "/mannisoft/purkka/"; // Aloitetaan istunto oikealla nimellä. session_set_cookie_params(0, $polku); session_name($nimi); session_start(); // Jos istunto on uusi, merkitään, mistä sovelluksesta on kyse. if (empty($_SESSION)) { $_SESSION[$nimi] = true; } // Tarkistetaan, että istuntoon merkitty sovellus on oikea. if (!isset($_SESSION[$nimi])) { session_destroy(); trigger_error("Viallinen istunto!", E_USER_ERROR); } }
Nyt kun alettiin puhumaan tarkistuksista niin mitä muitaa tarkistuksia olisi hyvä tehdä, ettei istuntoa kaapattaisi ja siirrettäisi vain toiseen.
Tuo tarkastus estää eri palveluiden istuntojen sekoittamisen. Jos pelottaa, että joku onnistuu varastamaan toisen käyttäjän istunnon, kannattaa yksinkertaisesti käyttää salattua yhteyttä (https:// ja niin edelleen, tämä tietenkin vaatii HTTP-palvelimen säätöä, SSL-avaimen ynnä muuta). Mitään purkkaviritelmiä IP-osoitteesta, selaimen versiosta tai vastaavista ei yleensä kannata kehitellä: näistä IP-osoite on ainoa edes jollain asteella luotettava, ja sekään ei välttämättä kaikilla pysy samana.
Juu näin käsittänytkin aikaisemmasta keskustelusta, tietoturvan suhteen.
session_set_cookie_params(0, $polku);
Tuossa tuon polun on varmaan tarkoitus viitata palvelimen juureen?
Polku on polku. Tällaiset asiat pitäisi kyllä jokaisen nettiohjelmoijan selvittää heti alkuun. Alla on Wikipediasta lainattu tiivistelmä URLin osista:
scheme://domain:port/path?query_string#fragment_id
Esimerkiksi jos Ohjelmointiputkaan pitäisi saada vain keskustelussa päteviä evästeitä, evästeen polku olisi "/keskustelu/".
Aihe on jo aika vanha, joten et voi enää vastata siihen.