int setcookie (merkkijonon nimi [, merkkijonon arvo [, int expire [, merkkijonopolku [, merkkijonoverkkotunnus [, int suojattu]]]]])

Setcookie() määrittää lähetettävän evästeen muiden otsikkotietojen kanssa. Evästeet on lähetettävä ennen muut otsikot (tämä on evästerajoitus, ei PHP). Tämä edellyttää, että kutsut tätä toimintoa ennen tai -tageja. Kaikki argumentit nimeä lukuun ottamatta ovat valinnaisia. Jos vain nimiargumentti annetaan, tämänniminen eväste poistetaan etäasiakkaasta. Voit myös ohittaa argumentin korvaamalla minkä tahansa argumentin tyhjällä merkkijonolla (""). suojatut argumentit ovat kokonaislukuja /kokonaisluku, eikä niitä voi ohittaa tyhjällä rivillä. Käytä niissä nollaa (0). Expire-argumentti on normaali Unix-aikakokonaisluku, jonka palauttaa time() tai mktime() . Secure-argumentti määrittää, että tämä eväste tulee lähettää vain suojatun HTTPS-yhteyden kautta. Kun evästeet on asetettu, niitä voidaan käyttää ladattaessa seuraava sivu $_COOKIE-taulukon kautta (jota kutsutaan nimellä $HTTP_COOKIE_VARS PHP-versiossa 4.1.0:a vanhemmissa versioissa). Yleisiä sudenkuoppia: Evästeet eivät näy ennen kuin seuraava sivu on ladattu. Evästeet on poistettava samoilla asetuksilla, joilla ne on asetettu. PHP 3:ssa useita kutsuja setcookie():lle samassa skriptissä voidaan tehdä käänteisessä järjestyksessä. Jos yrität poistaa yhden evästeen ennen toisen lisäämistä, sinun on tehtävä lisäys ennen poistamista. PHP 4:ssä useat kutsut setcookie():lle suoritetaan siinä järjestyksessä, jossa niitä kutsutaan. Seuraavassa on esimerkkejä evästeiden lähettämisestä:
Huomaa, että evästeen arvo-osa urlencode-koodataan automaattisesti, kun eväste lähetetään, ja kun se vastaanotetaan, se puretaan automaattisesti ja liitetään muuttujaan, jolla on sama nimi kuin evästeen nimi. Jos haluat tarkastella testievästeemme sisältöä komentosarjana, käytä jotakin seuraavista esimerkeistä: Lisätietoja evästeistä on Netscapen eritelmissä osoitteessa: http://www.netscape.com/newsref/std/cookie_spec.html. Microsoft Internet Explorer 4 Service Pack 1:llä ei toimi oikein evästeiden kanssa, joiden polkuparametri on asetettu. Netscape Communicator 4.05 ja Microsoft Internet Explorer 3.x eivät käsittele evästeitä oikein, jos polkua ja aikaa ei ole asetettu.

Viimeisin päivitys: 1.11.2015

Evästeet ovat pieniä tietojoukkoja (enintään 4 kilotavua), joiden avulla verkkosivusto voi tallentaa mitä tahansa tietoa käyttäjän tietokoneelle. Evästeiden avulla voit seurata käyttäjien toimintaa sivustolla: onko käyttäjä kirjautunut sivustolle vai ei, seurata hänen vierailunsa historiaa jne.

Evästeiden tallentaminen

Käytä toimintoa tallentaaksesi evästeet käyttäjän tietokoneelle setcookie(). Sillä on seuraava määritelmä:

Bool setcookie(merkkijono $nimi, merkkijono $arvo, int $vanheneminen, merkkijono $polku, merkkijono $verkkotunnus, bool $suojattu, bool $http vain);

Setcookie()-funktio voi hyväksyä seuraavat parametrit:

    nimi: sen evästeen nimi, jota käytetään sen arvon saamiseen

    arvo: evästeen arvo tai sisältö - mikä tahansa aakkosnumeerinen teksti, joka on enintään 4 kilotavua

    vanheneminen (valinnainen): Viimeinen voimassaolopäivä, jonka jälkeen evästeet tuhotaan. Jos tätä parametria ei ole asetettu tai se on yhtä kuin 0, eväste tuhoutuu selaimen sulkemisen jälkeen.

    polku (valinnainen): polku palvelimen hakemistoon, jolle evästeet ovat saatavilla. Jos määrität "/", evästeet ovat käytettävissä koko sivustolla. Jos asetat esimerkiksi "/mydir/" , evästeet ovat käytettävissä vain hakemistosta /mydir/" ja kaikki sen alihakemistot. Oletusarvo on nykyinen hakemisto, johon evästeet on asennettu.

    domain (valinnainen): Määrittää verkkotunnuksen, jolle evästeet ovat käytettävissä. Jos kyseessä on toisen tason verkkotunnus, esim. localhost.com, silloin evästeet ovat saatavilla koko sivustolle localhost.com, mukaan lukien sen aliverkkotunnukset, kuten blog.localhost.com.

    Jos aliverkkotunnus on määritetty blog.localhost.com, evästeet ovat saatavilla vain kyseisessä aliverkkotunnuksessa.

    suojattu (valinnainen): Määrittää, että evästearvo lähetetään HTTPS:n kautta. Jos arvoksi asetetaan tosi, asiakkaalta lähetetään eväste palvelimelle vain, jos suojattu yhteys on muodostettu. Oletusarvo on false.

    vain http (valinnainen): jos tosi, evästeitä voidaan käyttää vain http-protokollan kautta. Toisin sanoen evästeet eivät tässä tapauksessa ole saatavilla komentosarjakielille, esimerkiksi JavaScriptille. Oletuksena parametri on epätosi

Tallennetaan evästeet:

$arvo1 = "Singapore"; $arvo2 = "kiinalainen"; setcookie("kaupunki", $arvo1); setcookie("kieli", $arvo2, aika()+3600); // voimassaoloaika 1 tunti

Tässä asetetaan kaksi evästettä: "kaupunki" ja "kieli". Ensimmäinen eväste tuhoutuu selaimen sulkemisen jälkeen ja toinen 3600 sekunnin kuluttua eli tunnin kuluttua

Evästeiden vastaanottaminen

Evästeen saamiseksi voit käyttää globaalia assosiatiivista taulukkoa $_COOKIE, esimerkiksi $_COOKIE["kaupunki"] . Joten saamme aiemmin tallennetut evästeet:

If (isset($_COOKIE["kaupunki"]) toistaa "Kaupunki: " . $_COOKIE["kaupunki"] . "
"; if (isset($_COOKIE["kieli"])) echo "Kieli: " . $_COOKIE["kieli"];

Arrayiden tallentaminen evästeisiin

Evästeisiin tallentamisessa on joitain erikoisominaisuuksia. Tallennetaan esimerkiksi seuraava taulukko:

Setcookie("lan", "PHP"); setcookie("lan", "C#"); setcookie("lan", "Java");

Nyt saamme sen ja näytämme sen sivulla:

If (isset($_COOKIE["lan"])) ( foreach ($_COOKIE["lan"] muodossa $nimi => $arvo) ($nimi = htmlerikoismerkit($nimi); $arvo = htmlerikoismerkit($arvo ); echo "$nimi. $arvo
"; } }

Evästeiden poistaminen

Evästeen poistamiseksi sinun on vain määritettävä vanhenemispäiväksi jonkin aikaa menneisyydestä:

Setcookie("kaupunki", "", aika() - 3600);

Jatkamme tutustumista web-ohjelmoinnin perusperiaatteisiin. Tänään puhumme ns keksit(keksi). Eväste on dataa, jonka verkkopalvelin lähettää asiakkaalle ja joka tallennetaan asiakaspuolelle.

Mikä tahansa web-skripti, esimerkiksi PHP-skripti, suoritetaan yleensä sekunnin murto-osassa ja palauttaa tiedot web-palvelimelle edelleen lähetettäväksi. Kun komentosarja on valmis, kaikki sen toiminnan aikana RAM-muistiin luodut tiedot tuhoutuvat. Joskus näitä tietoja ei voi menettää. Oletetaan, että sivuston pääsivulla on HTML-lomake, jossa sinua pyydetään valitsemaan haluamasi taustaväri. Seuraavaksi kaikki sivut käyttävät käyttäjän valitsemaa väriä. Väriarvo on jotain, joka voidaan tallentaa tietyn tehtävän yhteydessä evästeen avulla.

Ymmärtääksesi paremmin PHP:n evästemekanismin toimintaa, sinun tulee lukea artikkeli "PHP-tulkki. Perusteet, toimintaperiaatteet", joka käsittelee ns. "ensimmäisen lähdön" käsitettä. Joten voit käyttää mekanismia HTTP-vastauksen luomisen vaiheessa pyyntöön. Web-asiakasohjelman ohjeistamiseksi tallentamaan jokin parametri, HTTP-vastaukseen lisätään otsikko muodon arvolla nimi=arvo(parametrin nimi, parametrin arvo), esimerkiksi:

Set-Cookie: myname=john

Tällaisia ​​otsikoita voi olla useita, jos useampi kuin yksi parametri on tallennettava. HTTP-vastauksen saatuaan verkkoselain tarkistaa Set-Cookie-otsikoiden olemassaolon ja tallentaa mahdolliset arvot sisäisiin palvelutiedostoihinsa. Evästeet on oletuksena sidottu sivuston verkkotunnukseen. HTTP-pyyntöä valmistellessaan verkkoselain tarkistaa, onko se tallentanut evästeitä, jotka liittyvät siihen verkkotunnukseen, johon pyyntö tehdään. Jos sellainen on, HTTP-pyyntöön lisätään otsikko

Eväste: nimi=arvo

jokaiselle löydetylle tallennetulle parametrille. Siten verkkopalvelin, joka on ohjeistanut verkkoasiakasta tallentamaan tietyt parametrit evästeenä, vastaanottaa nämä parametrit takaisin kaikissa myöhemmissä HTTP-pyynnöissä kyseiseltä asiakkaalta. Kun suljet selaimesi, tallennetut evästeet poistetaan.

Voit määrittää evästeen käyttöiän evästeessä. Tätä tarkoitusta varten lisätään erityinen attribuutti päättyy seuraavalla tavalla:

Set-Cookie: nimi=arvo; päättyy = päivämäärä

Missä päivämäärä on päivämäärä ja aika, jolloin selaimen tulee poistaa tämä eväste, esimerkiksi:

Kiinnitä huomiota expires-attribuutin muotoon.

Attribuutin käyttö polku Voit rajoittaa evästeiden laajuutta. Oletuksena evästeitä käytetään kaikkiin tietyn verkkotunnuksen pyyntöihin, mikä vastaa arvoa polku =/. Jos esimerkiksi asetamme polku=/doc/, silloin evästeet koskevat vain pyyntöjä /doc/-hakemistoon sekä sen kaikkiin alihakemistoihin ja asiakirjoihin, esimerkiksi /doc/images/. Esimerkki polun attribuutilla:

Voit myös ohittaa toimialueen sitomisen attribuutilla verkkotunnus. Oletuksena eväste on sidottu sen asiakirjan verkkotunnukseen, jonka pyyntö aloitti evästeen luomisen. Jos määrittelet .domain.ru, eväste koskee domain.ru-verkkotunnuksen pyyntöjä sekä kaikkia sen aliverkkotunnuksia. Voit rajoittaa toiminnon tiettyyn aliverkkotunnukseen, esimerkiksi www.domain.ru. Esimerkki expires-, polku- ja verkkotunnuksen attribuuttien käytöstä:

On aika selvittää, kuinka käyttää evästeitä PHP:ssä. Evästeiden asettamiseen on PHP-toiminto setcookie:

Bool ( merkkijono $nimi [ , merkkijono $arvo [ , int $expire = 0 [ , merkkijono $polku [ , merkkijono $domain [ , bool $secure = false [ , bool $httponly = false ] ] ] ] ] )

Useimmat toimintoparametrit ovat valinnaisia. Katsotaanpa todellista esimerkkiä (aiemmin ehdotettu sivu taustavärin valinnalla):

"#090" , "sininen" => "#009" , "punainen" => // Taustan oletusväri (valkoinen). Väri otetaan evästeestä, jos vastaava eväste on olemassa (otetaan käyttöön myöhemmin) ?>
">
Haluttu tausta:

Tässä esimerkissä evästemekanismia ei ole vielä aktivoitu, vain sivukehys on luotu. Jos olet lukenut aiempia artikkeleita ja oppitunteja, sinun pitäisi pystyä ymmärtämään tämä koodi. Taulukko tallentaa luettelon mahdollisista väreistä (voit lisätä omia), värit näytetään HTML-muodossa avattavana luettelona. Nyt sinun on kirjoitettava lomakkeesta tietojenkäsittelijä. Perinteisesti asetamme sen yläosaan tietojen ilmoittamisen jälkeen:

"#090" , "sininen" => "#009" , "punainen" => "#900" ) ; $bgcolor = "#fff" ; // Taustan oletusväri (valkoinen). Väri otetaan evästeestä, jos vastaava eväste on olemassa (toteutettu seuraavassa esimerkissä) //--Tallenna taustavärin arvo evästeeseen. Yksityiskohdat alla artikkelissa } ?>

Käsittelijä saa käyttäjän valitseman värin arvon ja tallentaa sen evästeeseen setcookie PHP -toiminnolla. Setcookie-toiminto lisää Set-Cookie-otsikon evästeestämme luotuun HTTP-vastaukseen. Sitä, kuten otsikkofunktiota, voidaan käyttää vain ennen tulostusta, eli niin korkealla koodissa kuin mahdollista.

Hienoa, säästimme keksit. Nyt meidän on käytettävä niitä. Lisää käsittelijän yläpuolelle koodi taustaväriarvon saamiseksi evästeestä, jos se on tallennettu sinne:

if ( isset ([ "bgcolor" ] ) && in_array ([ "bgcolor" ] , $värit ) ) ( $bgcolor = [ "bgcolor" ] ; )

Kaikki on hyvin yksinkertaista. Jos komentosarjapyynnön mukana lähetettiin evästeitä, PHP sijoittaa ne globaaliin $_COOKIE-taulukkoon. Siten työskentely hyväksyttyjen evästeiden kanssa ei eroa esimerkiksi hyväksytyillä GET- tai POST-parametreilla työskentelemisestä. Koko käsikirjoituslistaus:

"#090" , "sininen" => "#009" , "punainen" => "#900" ) ; $bgcolor = "#fff" ; // Taustan oletusväri (valkoinen) //--Tarkista, onko bgcolor jo tallennettu evästeisiin (tarkistamme myös oikeellisuuden, koska evästeet on helppo vaihtaa) if ( isset ([ "bgcolor" ] ) && in_array ([ "bgcolor" ] , $värit ) ) ( //--Jos on, käytä tallennettua arvoa$bgcolor = [ "bgcolor" ] ; ) //--Tarkista, onko GET-parametri bgcolor välitetty ja onko se taulukossamme. Muuten he voivat luovuttaa sinulle kuka tietää mitä, ja sitten meidän on järjestettävä se;) if ( isset ($_GET [ "bgcolor" ] ) && in_array ($_GET [ "bgcolor" ] , $värit ) ) ( $bgcolor = $_GET [ "bgcolor" ] ; //--Tämä on uusi taustamme sivulle("bgcolor" , $bgcolor ) ; ) ?> Mahdollisuus valita sivun tausta
">
Haluttu tausta:

Katso, miten käsikirjoitus toimii; jos sinulla on kysyttävää, kommentoi. Taustaväri tallennetaan ns väliaikainen eväste, joka poistetaan, kun suljet selaimen. Käytetään pysyvää evästettä Tätä varten meidän on määritettävä setcookie-funktiossa kolmas parametri - evästeen poistoaika, joka muunnetaan Set-Cookie HTTP-otsikon expires-attribuutiksi. Parametri määrittää aikaleiman Unix-muodossa. Useimmiten tällaisen merkin luomiseen käytetään PHP-funktiota time(), joka palauttaa nykyisen ajan Unix-muodossa lisäämällä siihen sekuntimäärän, jonka jälkeen eväste tulee poistaa. Esimerkiksi, aika()+3600- poista evästeet tunnin kuluttua. Tehdään evästeemme aktiiviseksi viikoksi:

("bgcolor" , $bgcolor , aika () + 3600 * 24 * 7 ); //--Tallenna taustavärin arvo evästeeseen

Siinä kaikki, nyt sivusto "muistaa" valitun taustavärin jopa selaimen sulkemisen jälkeen. Muuten, jos haluat poistaa evästeet, määritä esimerkiksi viimeinen päivämäärä vanhentuneeksi aika()-3600. Muista katsoa HTTP-otsikot, kun testaat esimerkkejä.

Tietoturva on tärkeä osa jokaisen verkkosivuston menestystä. Turvallisuuden parantaminen väärin voi kuitenkin johtaa kustannusten nousuun ja yleiseen käyttäjien ärsytykseen. Tässä oppaassa tarkastellaan yleisiä istuntotiedostojen ja evästeiden käsittelyssä esiintyviä ongelmia.

Keksit

Evästeet ovat tapoja tunnistaa käyttäjä sivuston perusteella. Sivusto luo esimerkiksi evästeen, jonka nimi on "suosikkiväri" ja arvo "punainen". Tästä lähtien aina, kun vierailet sivustolla, eväste ladataan, ja se asettaa suosikkivärisi punaiseksi ("favorite_color" on "punainen"). Tämä on varsin kätevää, koska käyttäjän ei tarvitse rekisteröityä järjestelmään joka kerta, kun hän vierailee sivustolla. Tätä menetelmää käytetään myös "Muista minut" -vaihtoehdossa, joka löytyy monilta sivustoilta. Tämä menetelmä voi kuitenkin myös luoda vakavia aukkoja sivuston turvajärjestelmään.

Yksi esimerkki ei vahvista, mikä eväste palautetaan sivustollesi. Pienen etsimisen jälkeen löysin verkkosivuston, jossa oli käyttäjäpaneelin komentosarja. Tämä skripti tuotti kaikki kirjautumistietoni evästeisiin ja latasi arvot joka kerta, kun toiminto suoritettiin. Jos esimerkiksi jätän kommentin, järjestelmä palauttaa minkä tahansa nimeni evästeiden nimet -muuttujasta. Seuraavaksi käyttämällä firebug-laajennusta ja paria muuta laitetta en voinut vain tarkastella näitä tiedostoja, vaan myös muokata niitä. Siten aina kun muokkasin nimeni sisältävää evästettä, sivusto ei vahvistanut nimen oikeellisuutta, mutta näytti tiedot. Voisin myös vaihtaa henkilöllisyystodistukseni. Lopulta löysin järjestelmänvalvojan tunnuksen (001) ja sain järjestelmänvalvojan käyttöoikeudet.

Istunnot

Istunnot ovat käyttäjän tunnistusmuuttujia, jotka on tallennettu palvelimellesi. Toisin kuin evästeet, käyttäjät eivät voi muuttaa niitä suoraan, mutta samalla riski on edelleen olemassa. Istuntoihin liittyy kaksi pääuhkaa: istunnon kiinnitys ja istunnon kaappaus.

Istunnon tallentaminen

Istunnon kiinnittäminen tapahtuu, kun käyttäjät muodostavat yhteyden jo muodostettuun istuntoon ja lataavat tietonsa sinne. Kirjautumalla jo muodostettuun istuntoon hyökkääjä voi käydä tässä istunnossa ja saada käyttäjien syöttämiä tietoja. Yksinkertainen esimerkki on seurata linkkiä verkkosivustolle, jonka istuntotunnus on jo asetettu. Esimerkiksi http://www.example.com/?PHPSESSID=1234. Hyökkääjä käyttää nyt samaa PHPSESSID-tunnusta tietojesi tarkasteluun.

Istuntokaappaus

Istuntokaappaus on toinen hyökkäystyyppi, jota vastaan ​​on paljon vaikeampi puolustaa. Tässä tapauksessa hyökkääjä voi ottaa istuntotunnuksesi haltuunsa paketti- (data)-analyysin ja muiden eri menetelmien avulla. Esimerkiksi verkkoosi yhdistetty hyökkääjä voi suodattaa kaikki reitittimellesi lähetetyt tietosi. Saatuaan istuntotunnuksesi hyökkääjä voi käydä tässä tunnuksessa päästäkseen käsiksi kaikkiin tietoihisi.

Tehokas istuntojen käyttö

Tämä opas ei kata rekisteröintiohjelman koodausprosessia. Yritän kuitenkin näyttää, kuinka voit tehdä nykyisestä kirjautumisskriptistäsi turvallisemman.

Yleisesti ottaen istuntojen käyttäminen on turvallisempaa kuin evästeiden käyttäminen. Tämä johtuu siitä, että käyttäjät eivät voi muuttaa istuntoarvoja yhtä helposti kuin evästearvoja. Tästä syystä haluan tallentaa kaikki käyttäjämuuttujat istuntomuuttujiin. Toinen tärkeä seikka on, että älä koskaan luota käyttäjän syötteisiin. Tarkista aina käyttäjätiedot MYSQL-tietokannan arvoista ja tulosta sitten istuntoon vastaavasti. Harkitse muutosten tekemistä rekisteröintitoimintoon seuraavasti:

funktion kirjautuminen ($käyttäjänimi, $salasana)
$sql = mysql_query("SELECT id, käyttäjätaso käyttäjiltä WHERE salasana = "" . $salasana . "" AND käyttäjätunnus = "" . $käyttäjänimi . "" RAJA 1");
// Jos osumia ei löydy, käyttäjätunnus ja salasana eivät täsmää
if($sql === false)
{
palauttaa väärä;
}
muu
{
while($u = mysql_fetch_array($sql))
{
session_regenerate_id(true);
$istunnon_tunnus = $u;
$session_username = $käyttäjänimi;
$istunnon_taso = $u;

$_SESSION["käyttäjätunnus"] = $istunnon_tunnus;
$_SESSION["käyttäjätaso"] = $istunnon_taso;
$_SESSION["käyttäjänimi"] = $istunnon_käyttäjänimi;
$_SESSION["user_lastactive"] = aika();
palauttaa tosi;
}
}

Analysoidaan tämä koodi. Se pyytää käyttäjätunnusta ja salasanaa ja tarkistaa, onko käyttäjä, joka täyttää molemmat kriteerit. Jos tulosta ei löydy, virheellinen käyttäjätunnus/salasana-yhdistelmä luodaan ja virheilmoitus. Muussa tapauksessa luodaan istuntomuuttujat: user_id, user_level, user_name ja user_lastactive. Nämä arvot on täytetty mysql-luettelon tiedoilla.

Saatat ihmetellä, mitä "session_regenerate_id(true)"-funktio tarkoittaa. Aiemmin puhuimme istunnon kiinnittämisestä. Tämä ratkaisu on suunniteltu suojaamaan tämän tyyppisiltä hyökkäyksiltä. Toiminto luo uuden istuntotunnuksen aina, kun käyttäjä kirjautuu sisään. Tällä tavalla, jos käyttäjä napsauttaa linkkiä, jolla on istunnon arvo asetettu, luodaan uusi istuntotunnus ja käyttäjätiedot lisätään uuteen istuntoon vanhan sijaan. Kun oikea parametri (true) välitetään tämän toiminnon kautta, se poistaa vanhan istunnon ja poistaa kaikki tiedot.

"Muista minut" -toiminnon kirjoittaminen

Evästeet tai istuntotiedostot eivät saa sisältää käyttäjien salasanoja. Tämä on erittäin tärkeää, koska jos istuntotiedosto tai eväste siepataan, hyökkääjä voi saada täyden hallinnan kaikkiin tileihin. Tiedetään, että monet käyttäjät käyttävät samaa salasanaa eri tileillä, ja tämä antaa hyökkääjälle mahdollisuuden saada hallintaansa muiden sivustojen käyttäjätilit. Kuinka voimme päästä eroon tästä ahdingosta?

Ratkaisu tähän ongelmaan on käyttöoikeusavain (auth_key). Pääsyn valtuutusavain voi olla yhdistelmä käyttäjätunnusta, salasanaa ja satunnaisia ​​merkkejä, jotka yhdistetään ja salataan. Jokaisella käyttäjällä on oltava oma yksilöllinen käyttöoikeusavain. Siten, kun eväste asetetaan, arvoksi asetetaan pääsyn valtuutusavain. Tämän jälkeen käyttöoikeusavaimen arvoa verrataan lisäämäsi MySQL-luettelon arvoon. Katsotaan kuinka käyttäjän kirjautumisominaisuus muuttuu.

tili_aktiivinen = tosi; // Tarkista, haluaako käyttäjä tilin tallennettavan evästeeseen if($remember) ( // Luo uusi todennusavain jokaiselle sisäänkirjautumiselle (joten vanhaa todennusavainta ei voida käyttää useita kertoja, jos // evästeen kaappaus) $cookie_auth= rand_string(10) . $käyttäjänimi; $auth_key = session_encrypt($cookie_auth); $auth_query = mysql_query("PÄIVITYS käyttäjät SET auth_key = "" . $auth_key . "" WHERE käyttäjätunnus = "" . $käyttäjänimi . """); setcookie("auth_key", $auth_key, time() + 60 * 60 * 24 * 7, "/", "example.com", false, true) ) // Määritä muuttujat istuntoon session_regenerate_id(true); $istunnon_tunnus = $u; $session_username = $käyttäjänimi; $istunnon_taso = $u; $_SESSION["käyttäjätunnus"] = $istunnon_tunnus; $_SESSION["käyttäjätaso"] = $istunnon_taso; $_SESSION["käyttäjänimi"] = $istunnon_käyttäjänimi; $_SESSION["user_lastactive"] = aika(); palauttaa tosi; ) ) ) ?>

Nyt se tarkistaa, onko parametri "true" kulkenut sisäänkirjautumistoiminnon muistamisparametrin läpi. Jos kyllä, käyttöoikeusavaimelle asetetaan eväste. Rand_string-funktio luo merkkijonon, jossa on sen läpi kulkeneiden merkkien määrä. Session_encrypt-toiminto lisää mielivaltaisia ​​tietoja ketjuun ja salaa kaikki tiedot md5:llä. Tämä ketju on ainutlaatuinen, koska se käyttää käyttäjätunnusta, joka on yksilöllinen jokaiselle käyttäjälle. Mysql-luettelon käyttöoikeusavain asetetaan sitten evästeeseen syötettyyn arvoon. Tämä suojaus ei kuitenkaan välttämättä riitä sivustollesi. Harkitse useiden käyttöoikeusavainten ja useiden evästeiden lisäämistä. Tämä toiminto ei täytä "muista minut" -toiminnon vaatimuksia. Sinun on myös lisättävä alustustoiminto.

Tätä toimintoa on käytettävä jokaisella sivulla. Sen tarkoituksena on tarkistaa evästeen käyttöoikeusavain ("auth_key"). Jos eväste käyttää isset-toimintoa, vastaava käyttäjä tulee näkyviin. Jälleen kerran, tämä toiminto on käytettävä joka sivulla.

Tämä koodi tarkistaa, onko isset-toimintoa käytetty. Jos eväste käyttää tätä toimintoa, käyttäjä tarkistaa käyttöoikeusavaimen. Jos osuma löytyy, tiedosto purkaa vaaditut tiedot ja rekisteröi käyttäjän. Muussa tapauksessa eväste poistetaan, koska se on virheellinen.

Muut ominaisuudet

= $currenttime)( // Aseta uusi käyttäjä viimeksi aktiivinen aika $_SESSION["user_lastactive"] = $currenttime; ) else ( // Jos istunto on ollut epäaktiivinen liian kauan uloskirjautuminen uloskirjautuminen(); ) ) ) ) ?>

Uloskirjautuminen on itsestään selvää. Tämä toiminto poistaa kaikki istuntomuuttujat ja evästeet ja asettaa käyttäjän käyttöoikeusavaimen arvoon 0. Tämän jälkeen pääsylupaavainta ei voi enää käyttää. On huomattava, että käyttäjä voi asettaa evästeensä arvoksi 0 ja silti kirjautua sisään käyttäjätunnuksellaan. Voit korjata tämän tarkistamalla kaikki evästeistä saadut tiedot. Varmista regexp-funktiolla, että merkkijono sisältää kelvollisen määrän merkkejä, sisältää kelvollisia merkkejä jne. Keepalive()-funktio pitää istunnon elossa. Tämän toiminnon tulisi olla joka sivulla.

Johtopäätös ja istunnon kaappaus

Istuntokaappaukselta on erittäin vaikea suojautua. Olet ehkä lukenut neuvoja käyttäjän IP-osoitteen tai User Agent -prosessin yhdistelmän käyttämisestä tunnistustunnisteiden luomiseen. Tämä ei kuitenkaan ole tehokas todellisille käyttäjillesi. Käyttäjien IP-osoitteet muuttuvat jatkuvasti. Suuret Internet-palveluntarjoajat, kuten AOL, vaihtavat niitä muutaman minuutin välein. Tämä luo valtavan ongelman. Myös User Agent -prosessit muuttuvat – IE7 on havainnut, että käyttäjäagentit muuttuvat ajoittain. Paras tapa suojautua sieppaukselta on luoda sauvajärjestelmä. Tämä järjestelmä tulostaa evästeen jokaiselle lataussivulle ja tallentaa myös tämän arvon mysql-luetteloosi. Evästeen arvoa verrataan sitten MySQL-taulukon arvoon. Jos ne ovat erilaisia, istunto on virheellinen.

Nämä ovat istuntotiedostojen ja evästeiden käytön perustoimintoja. Tietysti turvallisuuden parantamiseksi on tarpeen lisätä evästeitä tietojen oikeellisuuden tarkistamiseksi. Tämä suojaustaso ei riitä suojaamaan arkaluontoisia tietoja, mutta jostain on aloitettava! Ja lopuksi:

Varmista, että evästearvot ovat voimassa.
Älä koskaan anna istunnon salasanaa tai evästemuuttujaa.

Käytä tunnistetta estääksesi istunnon kiinnittymisen
session_regenerate_id.

Seuraaviin oppitunteihin asti!

P.S. Käännän koodin kommentit 24 tunnin sisällä :)

Tämän päivän opetusohjelmassa puhumme evästeiden käytöstä PHP:ssä. Aloitetaan siitä, mikä se on, miksi sitä tarvitaan ja miksi se alun perin ilmestyi.

Mihin evästeitä käytetään?

Kuten sinä ja minä jo tiedämme, PHP:ssä voimme työskennellä GET- ja POST-pyyntöjen kanssa. Niiden avulla voimme siirtää tietoja palvelimelle, jotta voimme jollakin tavalla vaikuttaa koodin toimintaan. Voimme antaa skriptille kirjautumistunnuksen ja salasanan, se tarkistaa ne ja antaa meille pääsyn kaikkiin tietoihin. Tämä ei kuitenkaan salli istunnon luomista meidän ja palvelimen välille. Toisin sanoen palvelin ei voi "muistaa" meitä, ja joka kerta kun haluamme sanoa, että se on me, meidän on lähetettävä erillinen uusi pyyntö sisäänkirjautumalla ja salasanalla.

Evästeet keksittiin ratkaisuksi. Nämä ovat tietueita, joilla on avainarvotyyppi, kuten PHP:n taulukko, mutta ne tallennetaan sivuston käyttäjän selaimeen. Evästeet tallennetaan erikseen jokaiselle sivustolle. Joka kerta kun käyttäjä tekee pyynnön sivustolle, selain tarkistaa, onko kyseiselle sivustolle olemassa näitä tietueita. Ja jos niitä on, se lähettää ne jokaisen pyynnön otsikossa tälle sivustolle.

Mistä evästeet tulevat?

Evästeet luodaan selaimeen palvelimen "pyynnöstä". Jossain vaiheessa päätämme, että meidän on luotava vierailijan selaimeen eväste, jolla on arvoa. Tätä varten palvelimen on lähetettävä vastauksessa asiakkaalle erityinen otsikko, joka osoittaa, mikä tietue on luotava selaimeen tälle sivustolle.

Kaikki tämä tapahtuu taustalla, eikä käyttäjä huomaa sitä. Valtuutus millä tahansa verkkosivustolla toimii tämän periaatteen mukaisesti. Yksinkertaisimmassa tapauksessa, kun olet syöttänyt käyttäjätunnuksesi ja salasanasi sivustolle, palvelin tarkistaa, ovatko ne oikein. Ja jos on, palvelin voi pyytää selainta tallentamaan nämä tiedot evästeeseen ja lähettämään ne sille jokaisen pyynnön yhteydessä.

Toisin sanoen palvelin sanoo karkeasti: "Hei, selain, luo minulle merkintä avaimella "login" ja arvolla "admin" ja toinen avaimella "salasana" ja arvolla "123". Tämän jälkeen selain alkaa lähettää lisätietoja, kuten:

Kirjautuminen: järjestelmänvalvojan salasana: 123

Tämän jälkeen muissa sivuston paikoissa, joissa vaaditaan lupa, on nyt mahdollista tarkistaa nämä tiedot evästeestä ilman, että käyttäjän on pakko täyttää lomaketta uudelleen. Ja jos ne ovat oikea käyttäjätunnus ja salasana, anna käyttäjälle pääsy johonkin.

Elinajasta

Samaan aikaan evästeellä on TTL (Time To Live). Toisin sanoen nämä tietueet voivat olla väliaikaisia. Palvelin ilmoittaa tämän käyttöiän myös, kun eväste on asennettu selaimeen. Tämän ansiosta saat istunnosta puolen tunnin mittaisen. Ja tämän ajan kuluttua käyttäjän on kirjauduttava sisään uudelleen. Olet luultavasti huomannut tämän toiminnassa monilla verkkosivustoilla.

Kuinka työskennellä evästeiden kanssa PHP:ssä

Meillä on siis perusymmärrys evästeiden toiminnasta. Katsotaanpa nyt, kuinka voit työskennellä niiden kanssa PHP:ssä.

Luodaan projektiimme tiedosto viewCookies.php. Laitetaan seuraava koodi siihen.

Kuten olisit jo arvannut, $_COOKIE on toinen PHP:n globaali taulukko, joka on samanlainen kuin taulukot $_GET Ja $_POST. Vain se tallentaa kaikki selaimen osana nykyistä pyyntöä lähettämät evästeet.

Katsotaan kuinka tämä komentosarja toimii avaamalla sivu selaimessa: http://myproject.loc/viewCookies.php

Kuten näemme, tämä joukko on tällä hetkellä tyhjä. Täytetään :) Tätä varten meidän on asennettava selaimeen jonkinlainen eväste. PHP:ssä funktiota käytetään tähän setcookie($nimi, $arvo, $ttl, $polku)

Hyväksytyt parametrit:

  • $nimi – evästeen nimi
  • $arvo – sen arvo
  • $ttl – elinikäinen. Jos määrität 0, eväste asennetaan pysyvästi (kunnes se poistetaan).
  • $polku – polku osoitepalkissa. Jos määrität "/", evästeet ovat saatavilla kaikista sivuston hakemistoista. Esimerkiksi sekä http://myproject.loc/ että http://myproject.loc/posts/ . Jos asetat "/posts/", evästeet ovat käytettävissä vain http://myproject.loc/posts/-hakemistosta ja kaikista sen alihakemistoista (esimerkiksi http://myproject.loc/posts/new/). Oletusarvo on nykyinen hakemisto, johon eväste on asennettu. Jos haluamme evästeen olevan käytettävissä koko sivustolla, meidän on asetettava arvoksi "/".

On olemassa useita muita parametreja, voit lukea niistä virallisesta dokumentaatiosta.

Kokeillaan nyt tätä toimintoa toiminnassa. Luodaan tiedosto setCookies.php ja kirjoitetaan siihen seuraava koodi:

Siirry sen jälkeen osoitteeseen http://myproject.loc/setCookies.php, jossa näemme tyhjän sivun. Kuten olemme jo sanoneet, evästeiden käyttö ei ole käyttäjälle näkyvissä.

Tämä työ näkyy kuitenkin aina Google Chromen kehittäjäkonsolissa. Avataan se (painamalla F12), siirrytään Verkko-välilehdelle, päivitetään sivu selaimessa ja etsitään se ladattujen tietojen luettelosta (se on ainoa siellä).

Napsauta tätä merkintää ja valitse oikealle avautuvasta ikkunasta Otsikot-välilehti. Täällä Response Headers -osiossa voimme nähdä Set-Cookie-otsikon määrittämiemme tietojen kanssa.

Siten evästeet asennettiin onnistuneesti selaimeen. Siirrytään nyt sivullemme, joka näyttää $_COOKIE-taulukon - http://myproject.loc/viewCookies.php

Kuten näemme, selaimeen aiemmin asennetut evästeet lähetetään nyt palvelimelle. Näet ne myös pyynnössä katsomalla kehittäjäkonsolin Pyyntöotsikot -osiota.

Jos haluat nähdä kaikki tietyn sivuston selaimessa saatavilla olevat evästeet, voit tarkastella niitä samassa Google Chrome -kehittäjäkonsolissa. Voit tehdä tämän siirtymällä Sovellus-välilehdelle, valitsemalla vasemmanpuoleisesta luettelosta Evästeet ja sen sisällä sivustomme.

Kaikki evästeet esitetään kätevässä luettelossa.

Mitä muuta sinun tulee tietää evästeistä

Tämän oppitunnin päätteeksi meidän on lisättävä, että evästeet asetetaan HTTP:n kautta palvelimen vastauksessa olevan otsikon avulla. HTTP-protokolla on suunniteltu siten, että otsikon on aina oltava ennen dataa, eikä mitään muuta. Siksi setcookie-funktio ja kaikki muut PHP:n toiminnot, jotka muuttavat HTTP-vastauksen otsikkoa, on kutsuttava ennen tulosteen antamista.

Voit asettaa evästeen ensin ja näyttää sitten tekstin.

Kaikki onnistuu loistavasti.

Mutta et voi tulostaa tekstiä (joka on HTTP-vastauksen runko) ja yrittää sitten asettaa evästettä.

Kuten näemme, tämä johtaa virheeseen. Näin HTTP-protokolla toimii. Ensin - otsikko, sitten - runko. Vain näin eikä muuten.

Useiden evästeiden asettaminen

Mikään ei ole helpompaa kuin muutaman evästeen asettaminen. Tätä varten sinun tarvitsee vain kutsua setcookie-toiminto useita kertoja.

Ne siirretään onnistuneesti asiakkaalle.

Tarkastellaan seuraavalla oppitunnilla esimerkkiä täydellisestä käyttäjän vuorovaikutuksesta evästeiden avulla. Sillä välin tehdään läksymme.