Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: SESSION ja välilehdet

Sivun loppuun

manninen [27.05.2011 02:20:43]

#

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ää?

The Alchemist [27.05.2011 07:31:14]

#

"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.

Lebe80 [27.05.2011 13:41:35]

#

Enemmän kuulostaa siltä, että mannisella on kirjautumis-sivustot samalla (omalla) palvelimella, mistä tuo johtuisi.

Metabolix [27.05.2011 15:11:17]

#

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();
}

manninen [29.05.2011 06:26:29]

#

Kiitoksia!!

Grez [29.05.2011 11:59:24]

#

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.

The Alchemist [29.05.2011 12:33:08]

#

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.

manninen [29.05.2011 12:49:28]

#

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.

Grez [29.05.2011 16:02:23]

#

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.

Metabolix [29.05.2011 16:19:31]

#

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);
  }
}

manninen [29.05.2011 18:23:58]

#

Nyt kun alettiin puhumaan tarkistuksista niin mitä muitaa tarkistuksia olisi hyvä tehdä, ettei istuntoa kaapattaisi ja siirrettäisi vain toiseen.

Metabolix [29.05.2011 18:33:04]

#

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.

manninen [29.05.2011 19:50:05]

#

Juu näin käsittänytkin aikaisemmasta keskustelusta, tietoturvan suhteen.

manninen [30.05.2011 00:36:13]

#

Tuossa tuon polun on varmaan tarkoitus viitata palvelimen juureen?

Metabolix [30.05.2011 14:33:27]

#

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/".


Sivun alkuun

Vastaus

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

Tietoa sivustosta