1 / 94

Istunnon hallinta PHP:llä

Istunnon hallinta PHP:llä. Istunnon hallinta, session control. Istunnolla tarkoitetaan sellaista toisiinsa yhteenkuuluvaa kokoelmaa HTTP-pyyntöjä ja –vastauksia, joille voidaan määritellä aloitus- ja lopetustapahtuma.

Télécharger la présentation

Istunnon hallinta PHP:llä

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Istunnon hallinta PHP:llä • Istunnon hallinta, session control. • Istunnolla tarkoitetaan sellaista toisiinsa yhteenkuuluvaa kokoelmaa HTTP-pyyntöjä ja –vastauksia, joille voidaan määritellä aloitus- ja lopetustapahtuma. • Usein istunto alkaa sisäänkirjautumisella, jonka yhteydessä käyttäjä autentikoituu saadakseen valtuutuksen niihin toimenpiteisiin, joita istunnon aikana on tarkoitus tehdä. • Tällainen istunto voi muodostua esim. asioinnista verkkopankissa: istunto alkaa sisäänkirjautumisesta ja päättyy uloskirjautumiseen. tMyn

  2. Autorisointi tarkoittaa valtuuttamista, kuten esim. käyttöoikeuksien antamista tiettyihin resursseihin. • Autentikoinnilla tarkoitetaan niitä menetelmiä, joilla tiettyihin resursseihin valtuutetut eli autorisoidut käyttäjät voidaan tunnistaa. • Web-sovelluksissa voidaan käyttää useita erilaisia autorisointi- ja autentikointimenetelmiä, ja usein näiden tekniikoiden käyttö kietoutuu toisiinsa. • HTTP-protokollan tilattomuuden seurauksena kaikissa autentikointimenetelmissä • Selain joutuu lähettämään autentikointitietonsa jokaisen pyynnön yhteydessä ja • Palvelin joutuu tarkistamaan autentikointitiedon oikeellisuuden jokaisella vastauskerralla. tMyn

  3. Ainoastaan HTTPS-protokollaa (SSL) käyttäen voidaan lähettää autentikointitiedot luotettavasti siten, ettei niitä voida verkkoa kuuntelemalla selvittää. • Aloitetaan yksinkertaisella esimerkillä. Tässä käyttäjätunnus ja salasana on suoraan koodattu skriptiin (ei kovin järkevää käytännössä…). Samaten, kun henkilö antaa salasanansa, niin se siirtyy selaimelta palvelimelle salaamattomana. bool empty ( mixed $var ) Determine whether a variable is considered to be empty. tMyn

  4. tMyn

  5. tMyn

  6. Jos annetaan oikea käyttäjätunnus ja salasana…: tMyn

  7. Niin kaikki onnistuu: tMyn

  8. Jos annat väärän käyttäjätunnuksen tai salasanan…: tMyn

  9. Niin mikään ei onnistuu: tMyn

  10. Jos jätät jommankumman kentän tyhjäksi, niin silloin jäät junnaamaan paikalle: tMyn

  11. tMyn

  12. Koodi olisi voitu myös kirjoittaa vanhaan tyyliin, eli tutkimalla aluksi onko lähetä-painiketta (submit) painettu: tMyn

  13. tMyn

  14. tMyn

  15. tMyn

  16. Muutetaan edellä esitettyä ratkaisua siten, että käydään tarkistamassa sisäänkirjautumisen oikeellisuus tietokannan taulusta. • Luodaan tietokanta sisaanKirjautuminen ja sinne taulu autorisoidutKayttajat: tMyn

  17. tMyn

  18. tMyn

  19. tMyn

  20. Lisätään pari autorisoitua käyttäjää järjestelmälle: • Aluksi siis salasanat ovat tietokannan taulussa suojaamattomassa, ei salatussa muodossa. tMyn

  21. tMyn

  22. Vastaava PHP-koodi näyttää tältä: tMyn

  23. tMyn

  24. tMyn

  25. tMyn

  26. tMyn

  27. Seuraavaksi testi selaimella: tMyn

  28. tMyn

  29. tMyn

  30. tMyn

  31. Äskeisessä sovelluksessa salasana oli suojaamattomana tietokannan taululla. Se on tarpeeton lisäriski. • Tehdään pieni muutos: käytetään SHA-1 –algoritmia (one-way cryptographic hash function) salasanan salaamiseen. • Koska kyseessä on yksisuuntainen salainalgoritmi, ei salattua merkkijonoa voida palauttaa alkuperäiseksi. • Siksi on tehtävä testi if tietokannanSalasana==sha1(annettuSalasana) tMyn

  32. Tehdään siis lisäys tietokannan tauluun: tMyn

  33. pseudo-random 40-character string tMyn

  34. string sha1 ( string $str [, bool $raw_output ] ) The sha1() function calculates the SHA-1 hash of a string. The sha1() function uses the US Secure Hash Algorithm 1. From RFC 3174 - The US Secure Hash Algorithm 1: "SHA-1 produces a 160-bit output called a message digest. The message digest can then, for example, be input to a signature algorithm which generates or verifies the signature for the message. Signing the message digest rather than the message often improves the efficiency of the process because the message digest is usually much smaller in size than the message. The same hash algorithm must be used by the verifier of a digital signature as was used by the creator of the digital signature." This function returns the calculated SHA-1 hash on success (default, 40 character hex number ), or FALSE on failure. tMyn

  35. Muutos PHP-koodissa on siis: • Huom! Nyt vain tuo viimeinen salasana on suojattu, tämä koodi ei siis toimisi kahden aiemman vaihtoehdon kanssa ennen kuin nekin salasanat olisi salattu! tMyn

  36. tMyn

  37. HTTP Basic Authentication on eräs yleisistä tavoista suorittaa autentikointi (ei edusta korkeata turvallisuustasoa!) web-sovelluksissa. • Se toimii seuraavalla tavalla: 1. Web-selain lähettää HTTP-pyynnön sellaiseen resurssiin (URL), jossa palvelin vaatii autentikointia. 2. Web-palvelin (tai palvelinskripti) yrittää lukea autentikointitiedot selaimen mahdollisesti lähettämästä Authorization-nimisestä otsakkeesta. Koska selain ei ole tällaista (vielä) lähettänyt, niin tMyn

  38. 3. Web-palvelin pyytää selainta lähettämään pyyntönsä mukana myös Authorization-nimisen otsakkeen arvonaan autentikointitiedot. Tämä tapahtuu lähettämällä seuraava HTTP-tilarivi ja HTTP-otsake: HTTP/1.0 401 Unauthorized WWW-Authenticate: Basic realm=”jotakinJärkevääTähän” 4. Vastaus otsakkeineen aiheuttaa selaimessa sen, että selain tarjoaa käyttäjälle ikkunan, jossa kysytään käyttäjätunnusta ja salasanaa. tMyn

  39. 5. Kysyttyään autentikointitiedot selain lähettää uuden HTTP-pyynnön lisättynä Authorization-otsakkeella: Authorization: Basic xyz… Jossa xyz… on BASE64-koodattu merkkijono muodossa tunnus:salasana. Selain tallentaa samalla tiedot muistiinsa siten, että URL:in alkuosa hakupolkuineen yhdessä realm-määritteen kanssa muodostaa tunnisteen tähän suojattuun alueeseen. Jatkossa autentikointitiedot lähetetään automaattisesti, jos tunniste vastaa pyyntöön. tMyn

  40. Normaalisti selaimet poistavat nämä autentikointitiedot muististaan, kun ne suljetaan. Koska selain lähettää autentikointitietonsa vain tietyllä tavalla alkaviin osoitteisiin (URL), käyttäjä voi selailla välillä muita sivuja palatakseen suojatulle alueelle myöhemmin ilman että autentikointitietoja kysytään uudelleen. tMyn

  41. 6. Web-selain (esim. palvelinskripti) purkaa BASE64-koodatun merkkijonon tunnukseksi ja salasanaksi ja yleensä vertaa tietoja joko ohjelmakoodiin, salasanatiedostoon tai tietokantaan tallennettuihin tietoihin. Jos tunnus ja sitä vastaava salasana täsmäävät, palvelin sallii käyttäjän päästä käsiksi niihin tietoihin, joita autentikointi koskee. 7. Jatkossa selain lähettää autentikointitietonsa jokaisen sellaisen HTTP-pyynnön yhteydessä, jossa tallennettu tunniste vastaa pyyntöä (URL:n alkuosa ja realm-määrite sama). Palvelin vastaavasti tarkistaa lähetetyt autentikointitiedot ennen jokaista HTTP-vastausta. tMyn

  42. Käytännössä edellä mainittu menettely voidaan toteuttaa: 1. Web-palvelimen konfiguraatiolla esim. käyttäen Apache-palvelimen .htaccess-tiedostossa annettavia määrittelyjä. Tällöin web-palvelin lähettää edellä kuvatut otsakkeet ja tarvittaessa hyväksyy käyttäjätunnuksen ja salasanan. Tällöin käytännössä palvelin selailee käytettyä salasanatiedostoa (usein nimetty .htpasswd) jokaisen pyynnön yhteydessä. 2. Itse ohjelmoidulla PHP-skriptillä. tMyn

  43. Kokeillaan tätä 2-vaihtoehtoa. • PHP purkaa selaimen Authorization-otsakkeessa lähettämän autentikointitiedoston globaaleihin muuttujiin seuraavasti: $_SERVER[’PHP_AUTH_USER’] – Käyttäjätunnus $_SERVER[’PHP_AUTH_PW’] – Salasana • Seuraavassa esimerkissä selaimelta ainoastaan pyydetään autentikointitietoja, mutta niitä ei mitenkään tarkisteta: tMyn

  44. Katsotaan miltä yllä oleva skripti näyttää selaimelta käynnistettynä: tMyn

  45. tMyn

  46. void header ( string $string [, bool $replace [, int $http_response_code ]] ) header() is used to send a raw HTTP header. See the » HTTP/1.1 specification for more information on HTTP headers. Remember that header() must be called before any actual output is sent, either by normal HTML tags, blank lines in a file, or from PHP. It is a very common error to read code with include(), or require(), functions, or another file access function, and have spaces or empty lines that are output before header() is called. The same problem exists when using a single PHP/HTML file. <html><?php/* This will give an error. Note the output * above, which is before the header() call */header('Location: http://www.example.com/');?> Parameters string tMyn

  47. The header string. • There are two special-case header calls. The first is a header that starts with • the string "HTTP/" (case is not significant), which will be used to figure out the • HTTP status code to send. For example, if you have configured Apache to use • a PHP script to handle requests for missing files (using the ErrorDocument • directive), you may want to make sure that your script generates the proper • status code. • <?phpheader("HTTP/1.0 404 Not Found");?> • The second special case is the "Location:" header. Not only does it send this • header back to the browser, but it also returns a REDIRECT (302) status • code to the browser unless some 3xx status code has already been set. • <?phpheader("Location: http://www.example.com/"); /* Redirect browser *//* Make sure that code below does not get executed when we redirect. */exit;?> tMyn

  48. Istunnon luominen web-sovellukseen on hankalaa, koska HTTP on tilaton protokolla, eikä sen avulla ole mahdollista pitää yllä tilatietoa peräkkäisten siirtotapahtumien välillä. HTTP on pyyntö-vastaus –protokolla, jossa siirtotapahtumat alkavat ainoastaan selaimen pyynnöstä. Koska palvelimen pitää pystyä tunnistamaan samaan istuntoon liittyvät pyynnöt, sen on ylläpidettävä sovelluksen tilatietoja asiakaspäässä. Tilanteesta riippuen tilatiedon ylläpito tapahtuu palvelinskriptin luomissa tai asettamissa 1. HTML-lomakkeen kenttien arvoissa tai hyperlinkeissä GET-metodilla palautettavana (hakulauseke, query string) 2. HTML-lomakkeen kenttien arvoissa POST-metodilla palautettavana (input type=”hidden”) tMyn

  49. 3. selaimen erityisissä muistialueissa (siis esim. HTTP Basic Authentication) 4. evästeissä (cookies). Istunto (session) hallitaan evästeiden kanssa. • Sovelluksen tyypistä riippuen tilatietojen suhteen voidaan menetellä seuraavasti: A. Jokaisen siirtotapahtuman yhteydessä kuljetetaan osa tai kaikki ylläpidettävästä datasta tai B. Generoidaan aluksi istuntokohtainen tunniste ja kuljetetaan vain sitä jokaisen siirtotapahtuman yhteydessä. tMyn

  50. Vaihtoehdossa B palvelinskripti vertaa jokaisen pyynnön yhteydessä selaimelta saamaansa tunnistetta palvelimelle tallennettuun vastineeseen ja liittää siihen mahdollisesti halutussa tietovarastossa (tekstitiedosto, tietokanta) säilytetyn muun datan. tMyn

More Related