int setcookie (stringi nimi [, stringi väärtus [, int expire [, stringi tee [, stringdomeen [, int turvaline]]]]])

Setcookie() määrab küpsise, mis saadetakse koos ülejäänud päise teabega. Küpsised tuleb saata enne muud päised (see on küpsisepiirang, mitte PHP). See eeldab, et helistate sellele funktsioonile enne silte või. Kõik argumendid, välja arvatud nimi, on valikulised. Kui esitatakse ainult nimeargument, kustutatakse selle nimega küpsis kaugkliendist. Selle argumendi vahelejätmiseks võite ka mis tahes argumendi asendada tühja stringiga (""). turvalised argumendid on täisarvud /täisarv ja neid ei saa tühja reaga vahele jätta. Kasutage nendes nulli (0). Aegumise argument on tavaline Unixi ajatäisarv, mille tagastab time() või mktime() . Turvaargument määrab, et seda küpsist tuleks saata ainult turvalise HTTPS-ühenduse kaudu. Kui küpsised on seadistatud, pääseb neile juurde järgmise lehe laadimisel massiivi $_COOKIE kaudu (mida PHP versioonides enne 4.1.0 nimetatakse $HTTP_COOKIE_VARSiks). Levinud lõkse: küpsiseid ei kuvata enne, kui järgmine leht on laaditud. Küpsised tuleb kustutada samade sätetega, millega need olid määratud. PHP 3-s saab samas skriptis teha mitu väljakutset setcookie()-le vastupidises järjekorras. Kui proovite kustutada ühte küpsist enne teise sisestamist, peate selle sisestama enne kustutamist. PHP 4-s käivitatakse mitu setcookie() väljakutset nende kutsumise järjekorras. Järgmised näited on küpsiste saatmise kohta:
Pange tähele, et küpsise väärtuse osa kodeeritakse automaatselt küpsise saatmisel ja vastuvõtmisel dekodeeritakse see automaatselt ja määratakse muutujale, mille nimi on sama nimega kui küpsise nimi. Meie testküpsise sisu vaatamiseks skriptis kasutage lihtsalt ühte järgmistest näidetest: Küpsiste kohta lisateabe saamiseks vaadake Netscape'i spetsifikatsiooni aadressil: http://www.netscape.com/newsref/std/cookie_spec.html. Microsoft Internet Explorer 4 koos hoolduspaketiga Service Pack 1 ei tööta õigesti küpsistega, mille tee parameeter on määratud. Netscape Communicator 4.05 ja Microsoft Internet Explorer 3.x ei töötle küpsiseid õigesti, kui tee ja aeg pole määratud.

Viimati värskendatud: 1.11.2015

Küpsised on väikesed andmekogumid (mitte rohkem kui 4 kB), mille abil veebisait saab salvestada mis tahes teavet kasutaja arvutisse. Küpsiste abil saate jälgida kasutaja tegevust saidil: kas kasutaja on saidile sisse logitud või mitte, jälgida tema külastuste ajalugu jne.

Küpsiste salvestamine

Küpsiste salvestamiseks kasutaja arvutisse kasutage funktsiooni setcookie (). Sellel on järgmine määratlus:

Bool setcookie(string $nimi, string $väärtus, int $aegumine, string $tee, string $domeen, bool $turvaline, bool $httponly);

Funktsioon setcookie() võib aktsepteerida järgmisi parameetreid:

    nimi: küpsise nimi, mida kasutatakse selle väärtusele juurdepääsuks

    väärtus: küpsise väärtus või sisu – mis tahes tähtnumbriline tekst, mis ei ületa 4 kBaiti

    aeguma (valikuline): aegumiskuupäev, pärast mida küpsised hävitatakse. Kui seda parameetrit ei määrata või see võrdub 0-ga, hävitatakse küpsis pärast brauseri sulgemist.

    tee (valikuline): tee selle serveri kataloogi, mille jaoks on saadaval küpsised. Kui määrate "/", on küpsised saadaval kogu saidil. Kui määrate näiteks "/mydir/" , on küpsistele juurdepääs ainult kataloogist /mydir/" ja kõik selle alamkataloogid. Vaikeväärtus on praegune kataloog, kuhu küpsised installitakse.

    domeen (valikuline): määrab domeeni, mille jaoks on küpsised saadaval. Kui see on näiteks teise taseme domeen, localhost.com, siis on küpsised saadaval kogu saidi localhost.com, sealhulgas selle alamdomeenide jaoks blog.localhost.com.

    Kui on määratud alamdomeen blog.localhost.com, siis on küpsised saadaval ainult selles alamdomeenis.

    turvaline (valikuline): määrab, et küpsise väärtus tuleks saata HTTPS-i kaudu. Kui see on seatud väärtusele Tõene , saadetakse kliendi küpsis serverisse ainult siis, kui on loodud turvaline ühendus. Vaikimisi on vale.

    Ainult http (valikuline): kui see on tõene, on küpsistele juurdepääs ainult http-protokolli kaudu. See tähendab, et küpsised pole sel juhul saadaval skriptikeeltele, näiteks JavaScriptile. Vaikimisi on parameeter väär

Salvestame küpsised:

$väärtus1 = "Singapur"; $väärtus2 = "hiina keel"; setcookie("linn", $väärtus1); setcookie("keel", $väärtus2, aeg()+3600); // kehtivusaeg 1 tund

Siin on seatud kaks küpsist: "linn" ja "keel". Esimene küpsis hävitatakse pärast brauseri sulgemist ja teine ​​3600 sekundi pärast, see tähendab tunni pärast

Küpsiste vastuvõtmine

Küpsise saamiseks võite kasutada globaalset assotsiatiivset massiivi $_COOKIE, näiteks $_COOKIE["linn"] . Seega saame varem salvestatud küpsised:

If (isset($_COOKIE["linn"]) kordab "Linn: " . $_COOKIE["linn"] . "
"; if (isset($_COOKIE["keel"])) echo "Keel: " . $_COOKIE["keel"];

Massiivide salvestamine küpsistesse

Massiivide salvestamisel küpsistesse on mõned eripärad. Näiteks salvestame järgmise massiivi:

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

Nüüd saame selle kätte ja kuvame selle lehel:

If (isset($_COOKIE["lan"])) ( foreach ($_COOKIE["lan"] kui $nimi => $väärtus) ($name = htmlspecialchars($name); $value = htmlspecialchars($value ); echo "$nimi. $väärtus
"; } }

Küpsiste eemaldamine

Küpsise kustutamiseks peate lihtsalt määrama aegumiskuupäevaks mõne aja minevikus:

Setcookie("linn", "", kellaaeg() - 3600);

Jätkame veebiprogrammeerimise aluspõhimõtetega tutvumist. Täna räägime nn küpsised(küpsis). Küpsis on andmed, mille veebiserver saadab kliendile ja salvestatakse kliendi poolel.

Iga veebiskript, näiteks PHP skript, käivitub tavaliselt sekundi murdosa jooksul, tagastades teabe veebiserverisse edasiseks saatmiseks. Pärast skripti valmimist hävitatakse kõik selle töö ajal RAM-is loodud andmed. Mõnikord ei saa neid andmeid kaotada. Oletame, et saidi avalehel on HTML-vorm, mis palub teil valida eelistatud taustavärvi. Järgmiseks kasutavad kõik lehed kasutaja valitud värvi. Värviväärtus on midagi, mida saab küpsise abil antud ülesande kontekstis salvestada.

Küpsiste mehhanismi toimimise paremaks mõistmiseks PHP-s peate lugema artiklit "PHP Interpreter. Põhialused, tööpõhimõtted", mis puudutab nn "esimese väljundi" mõistet. Seega saate mehhanismi kasutada päringule HTTP-vastuse genereerimise etapis. Selleks, et anda veebikliendile käsk mõne parameetri salvestamiseks, lisatakse HTTP vastusele päis vormi väärtusega nimi=väärtus(parameetri nimi, parameetri väärtus), näiteks:

Set-Cookie: minunimi=john

Selliseid päiseid võib olla mitu, kui on vaja salvestada rohkem kui üks parameeter. HTTP-vastuse saamisel kontrollib veebibrauser Set-Cookie päiste olemasolu ja salvestab nende väärtused oma sisemistesse teenusefailidesse, kui neid on. Küpsised on vaikimisi seotud saidi domeeniga. HTTP päringu koostamisel kontrollib veebibrauser, kas ta on salvestanud küpsiseid, mis on seotud päringu tegemise domeeniga. Kui see on olemas, lisatakse HTTP päringule päis

Küpsis: nimi=väärtus

iga leitud salvestatud parameetri kohta. Seega saab veebiserver, mis on andnud veebikliendile korralduse teatud parameetrid küpsisena salvestada, need parameetrid tagasi kõigis järgnevates selle kliendi HTTP päringutes. Kui sulgete brauseri, kustutatakse salvestatud küpsised.

Küpsises saate määrata küpsise eluea. Selleks lisatakse spetsiaalne atribuut aegub järgmisel viisil:

Set-Cookie: nimi=väärtus; aegub = kuupäev

Kus kuupäev on kuupäev ja kellaaeg, millal brauser peaks selle küpsise kustutama, näiteks:

Pöörake tähelepanu atribuudi expires vormingule.

Atribuudi kasutamine tee Saate piirata küpsiste ulatust. Vaikimisi rakendatakse küpsiseid kõikidele antud domeeni päringutele, mis vastavad väärtusele tee =/. Kui me näiteks seame path=/doc/, rakenduvad küpsised ainult kataloogi /doc/ ning selle kõikidele alamkataloogidele ja dokumentidele (nt /doc/images/) suunatud päringutele. Näide tee atribuudiga:

Samuti saate atribuudi abil domeeni sidumise alistada domeeni. Vaikimisi on küpsis seotud selle dokumendi domeeniga, mille päring algatas küpsise loomise. Kui täpsustate .domain.ru, rakendub küpsis domeeni domain.ru taotlustele, aga ka kõikidele selle alamdomeenidele. Saate toimingu piirata konkreetse alamdomeeniga, näiteks www.domain.ru. Näide aegumiskuupäeva, tee ja domeeni atribuutide kasutamisest:

On aeg välja mõelda, kuidas PHP-s küpsistega töötada. Küpsiste seadmiseks on PHP funktsioon setcookie:

Bool (string $name [ , string $value [ , int $expire = 0 [ , string $tee [ , string $domeen [ , bool $secure = vale [ , bool $httponly = false ] ] ] ] ] )

Enamik funktsiooniparameetreid on valikulised. Vaatame tõelist näidet (varem pakutud leht taustavärvi valikuga):

"#090" , "sinine" => "#009" , "punane" => // Tausta vaikevärv (valge). Värv võetakse küpsisest, kui vastav küpsis on olemas (rakendatakse hiljem) ?>
">
Soovitud taust:

Selles näites pole küpsiste mehhanism veel aktiveeritud, loodud on ainult leheraam. Kui olete varasemaid artikleid ja õppetükke lugenud, peaksite sellest koodist aru saama. Massiiv salvestab võimalike värvide loendi (saate lisada oma), värvid kuvatakse HTML-vormingus rippmenüüna. Nüüd tuleb vormilt kirjutada andmetöötleja. Traditsiooniliselt asetame selle pärast andmete deklareerimist ülaossa:

"#090" , "sinine" => "#009" , "punane" => "#900" ) ; $bgcolor = "#fff" ; // Tausta vaikevärv (valge). Värv võetakse küpsisest, kui vastav küpsis on olemas (rakendatud järgmises näites) //--Salvesta taustavärvi väärtus küpsisesse. Üksikasjad allpool artiklis } ?>

Töötleja saab kasutaja valitud värvi väärtuse ja salvestab selle küpsisesse, kasutades setcookie PHP funktsiooni. Funktsioon setcookie lisab loodud HTTP vastusele meie küpsisest Set-Cookie päise. Seda, nagu päise funktsiooni, saab kasutada ainult enne väljundit, st võimalikult kõrgel koodis.

Suurepärane, päästsime küpsised. Nüüd peame neid kasutama. Lisage töötleja kohale kood küpsisest taustavärvi väärtuse saamiseks, kui see on sinna salvestatud:

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

Kõik on väga lihtne. Kui koos skriptipäringuga saadeti küpsiseid, paigutab PHP need globaalsesse massiivi $_COOKIE. Seega ei erine aktsepteeritud küpsistega töötamine näiteks aktsepteeritud GET- või POST-parameetritega töötamisest. Täielik skripti loend:

"#090" , "sinine" => "#009" , "punane" => "#900" ) ; $bgcolor = "#fff" ; // Tausta vaikevärv (valge) //--Kontrollige, kas bgcolor on juba küpsistesse salvestatud (kontrollime ka õigsust, kuna küpsiseid on lihtne asendada) if ( isset ([ "bgcolor" ] ) && in_array ([ "bgcolor" ] , $värvid ) ) ( //--Kui on, kasutage salvestatud väärtust$bgcolor = [ "bgcolor"] ; ) //--Kontrollige, kas parameeter GET bgcolor on edasi antud ja kas see on meie massiivis. Muidu, teate, võivad nad sulle üle anda, kes teab mida, ja siis peame asja korda ajama;) if ( isset ($_GET [ "bgcolor" ] ) && in_array ($_GET [ "bgcolor" ] , $colors ) ) ( $bgcolor = $_GET [ "bgcolor" ] ; //--See on meie lehe uus taust("bgcolor" , $bgcolor ) ; ) ?> Võimalus valida lehe tausta
">
Soovitud taust:

Vaadake, kuidas skript töötab; kui teil on küsimusi, kommenteerige julgelt. Taustavärv salvestatakse nn ajutine küpsis, mis brauseri sulgemisel kustutatakse. Kasutame püsiküpsist, selleks peame setcookie funktsioonis defineerima kolmanda parameetri – küpsise kustutamise aja, mis teisendatakse Set-Cookie HTTP päise expires atribuudiks. Parameeter määrab Unixi vormingus ajatempli. Kõige sagedamini kasutatakse sellise märgi genereerimiseks PHP funktsiooni time(), mis tagastab praeguse kellaaja Unixi formaadis, lisades sellele sekundite arvu, mille möödudes tuleks küpsis kustutada. Näiteks, aeg()+3600- kustutage küpsised tunni pärast. Teeme oma küpsise üheks nädalaks aktiivseks:

("bgcolor" , $bgcolor , aeg () + 3600 * 24 * 7 ) ; //--Salvesta taustavärvi väärtus küpsisesse

See on kõik, nüüd "mäletab" sait valitud taustavärvi isegi pärast brauseri sulgemist. Muide, küpsiste kustutamiseks määrake näiteks aegumise kuupäev aeg()-3600. Ärge unustage näidete testimisel vaadata HTTP päiseid.

Turvalisus on iga veebisaidi edu oluline osa. Turvalisuse ebaõige parandamine võib aga kaasa tuua kulude suurenemise ja kasutajate üldise ärrituse. Selles juhendis vaatleme seansifailide ja küpsistega töötamisel esinevaid levinumaid probleeme.

Küpsised

Küpsised on viisid kasutaja tuvastamiseks saidi järgi. Näiteks loob sait küpsise nimega "lemmik_värv" ja väärtusega "punane". Edaspidi laaditakse iga kord, kui külastate saiti, alla küpsis ja teie lemmikvärviks määratakse punane ("lemmikvärv" on "punane"). See on üsna mugav, kuna kasutaja ei pea iga kord, kui ta seda saiti külastab, süsteemis registreeruma. Seda meetodit kasutatakse ka valikus „Jäta mind meelde”, mida leidub paljudel saitidel. See meetod võib aga tekitada ka tõsiseid auke saidi turvasüsteemis.

Üks näide ei kinnita, milline küpsis teie saidile tagastatakse. Pärast lihtsat otsimist leidsin veebisaidi kasutajapaneeli skriptiga. See skript väljastas kogu minu sisselogimisteabe küpsistesse ja laadis väärtused iga kord, kui toimingut tehti. Näiteks kui jätan kommentaari, tagastaks süsteem küpsisenimede muutujast mis tahes minu nimed. Järgmisena sain firebugi laienduse ja paari muu seadme abil neid faile mitte ainult vaadata, vaid ka redigeerida. Seega, kui muutsin oma nime sisaldavat küpsist, ei kinnitanud sait nime õigsust, vaid kuvas andmed. Sain ka oma ID-d ära vahetada. Lõpuks suutsin leida administraatori ID (001) ja saada administraatori juurdepääsu.

Seansid

Seansid on teie serverisse salvestatud kasutaja tuvastamise muutujad. Erinevalt küpsistest ei saa kasutajad neid otse muuta, kuid samas on risk siiski olemas. Seanssidel on kaks peamist ohtu: seansi fikseerimine ja seansi kaaperdamine.

Seansi salvestamine

Seansi fikseerimine toimub siis, kui kasutajad loovad ühenduse juba loodud seansiga ja laadivad sinna üles oma teabe. Juba loodud seanssi sisse logides saab ründaja seda seanssi külastada ja hankida kasutajate sisestatud teavet. Lihtne näide on järgida linki veebisaidile, mille seansi ID on juba määratud. Näiteks http://www.example.com/?PHPSESSID=1234. Ründaja kasutab nüüd teie teabe vaatamiseks sama PHPSESSID-d.

Seansi kaaperdamine

Seansikaaperdamine on teist tüüpi rünnak, mille vastu on palju keerulisem kaitsta. Sel juhul võib ründaja pakett- (andme)analüüsi ja muude erinevate meetodite abil teie seansi identifikaatori enda valdusesse võtta. Näiteks võib teie võrguga ühendatud ründaja filtreerida kõik teie ruuterile saadetud andmed. Pärast teie seansi ID saamist saab ründaja seda ID-d külastada, et pääseda juurde kogu teie teabele.

Seansside tõhus kasutamine

See juhend ei hõlma registreerimisskripti kodeerimise protsessi. Siiski proovin näidata, kuidas muuta teie praegune sisselogimisskript turvalisemaks.

Üldiselt on seansside kasutamine turvalisem kui küpsiste kasutamine. Selle põhjuseks on asjaolu, et kasutajad ei saa muuta seansi väärtusi sama lihtsalt kui küpsiste väärtusi. Seetõttu meeldib mulle salvestada kõik kasutajamuutujad seansimuutujatesse. Teine oluline punkt on mitte kunagi usaldada kasutaja sisendit. Kontrollige alati kasutajateavet MYSQL-i andmebaasi väärtustega ja seejärel väljastage vastavalt seansile. Kaaluge registreerimisfunktsioonis muudatuste tegemist järgmiselt.

funktsiooni sisselogimine ($kasutajanimi, $parool)
$sql = mysql_query("SELECT id, kasutajatase FROM kasutajatest WHERE parool = "" . $parool . "" JA kasutajanimi = "" . $kasutajanimi . "" LIMIT 1");
// Kui vasteid pole, siis kasutajanimi ja parool ei ühti
if($sql === false)
{
tagastama vale;
}
muidu
{
while($u = mysql_fetch_array($sql))
{
session_regenerate_id(true);
$seansi_id = $u;
$session_username = $kasutajanimi;
$seansi_tase = $u;

$_SESSION["kasutaja_id"] = $seansi_id;
$_SESSION["kasutaja_tase"] = $seansi_tase;
$_SESSION["kasutaja_nimi"] = $seansi_kasutajanimi;
$_SESSION["kasutaja_viimane"] = aeg();
tagasta tõene;
}
}

Analüüsime seda koodi. See küsib kasutajanime ja parooli ning kontrollib, kas leidub kasutajat, kes vastab mõlemale kriteeriumile. Kui tulemust pole, genereeritakse vale kasutajanime/parooli kombinatsioon ja genereeritakse viga. Vastasel juhul luuakse seansi muutujad: user_id, user_level, user_name ja user_lastactive. Need väärtused on täidetud andmetega mysql-i loendist.

Teil võib tekkida küsimus, mida funktsioon „session_regenerate_id(true)” tähendab. Varem rääkisime seansi fikseerimisest. See lahendus on loodud kaitsma seda tüüpi rünnakute eest. Funktsioon loob uue seansi ID iga kord, kui kasutaja sisse logib. Sel viisil, kui kasutaja klõpsab seansi väärtusega lingil, luuakse uus seansi ID ja kasutajateave lisatakse uuele seansile, mitte vanale. Kui selle funktsiooni kaudu edastatakse õige parameeter (tõene), kustutab see vana seansi ja kogu teabe.

Funktsiooni "Mäleta mind" kirjutamine

Küpsised või seansifailid ei tohi sisaldada kasutaja paroole. See on väga oluline, sest kui seansifail või küpsis pealtkuulatakse, saab ründaja täieliku kontrolli kõigi kontode üle. On teada, et paljud kasutajad kasutavad erinevatel kontodel sama parooli ja see võimaldab ründajal saada kontrolli teiste saitide kasutajakontode üle. Kuidas saaksime sellest kitsikusest välja tulla?

Selle probleemi lahendus on juurdepääsu lubamise võti (auth_key). Juurdepääsu autoriseerimisvõti võib olla kombinatsioon kasutajanimest, paroolist ja juhuslikust märgikomplektist, mis kombineeritakse ja krüpteeritakse. Igal kasutajal peab olema oma kordumatu juurdepääsu autoriseerimisvõti. Seega, kui küpsis on seatud, määratakse selle väärtuseks juurdepääsu autoriseerimisvõti. Pärast seda võrreldakse juurdepääsu autoriseerimisvõtme väärtust teie lisatud MySQL-i loendis oleva väärtusega. Vaatame, kuidas muutub kasutaja sisselogimisfunktsioon.

konto_aktiivne = tõene; // Kontrollige, kas kasutaja soovib, et konto salvestataks küpsisesse if($remember) ( // Loo iga sisselogimise jaoks uus autentimisvõti (nii et vana autentimisvõtit ei saa küpsise kaaperdamise korral // mitu korda kasutada) $cookie_auth= rand_string(10) . $kasutajanimi; $auth_key = session_encrypt($cookie_auth); $auth_query = mysql_query("UPDATE kasutajad SET auth_key = "" . $auth_key . "" WHERE kasutajanimi = "" . $kasutajanimi . """); setcookie("auth_key", $auth_key, time() + 60 * 60 * 24 * 7, "/", "example.com", false, true) ) // Muutujate määramine seansile session_regenerate_id(true); $seansi_id = $u; $session_username = $kasutajanimi; $seansi_tase = $u; $_SESSION["kasutaja_id"] = $seansi_id; $_SESSION["kasutaja_tase"] = $seansi_tase; $_SESSION["kasutaja_nimi"] = $seansi_kasutajanimi; $_SESSION["kasutaja_viimane"] = aeg(); tagasta tõene; ) ) ) ?>

Nüüd kontrollib see, kas parameeter “true” on läbinud sisselogimisfunktsiooni meelespidamise parameetri. Kui jah, seatakse juurdepääsu autoriseerimisvõtmele küpsis. Funktsioon Rand_string loob stringi selle läbinud märkide arvuga. Funktsioon Session_encrypt lisab ahelasse suvalised andmed ja krüpteerib kogu teabe md5 abil. See kett on ainulaadne, kuna see kasutab iga kasutaja jaoks ainulaadset kasutajanime. Seejärel seatakse mysql-loendis ligipääsu lubamise võtmeks küpsisesse sisestatud väärtus. Sellest kaitsest ei pruugi aga teie saidi jaoks piisata. Kaaluge mitme juurdepääsu autoriseerimisvõtme ja mitme küpsise lisamist. Jällegi, see funktsioon ei vasta funktsiooni "mäleta mind" nõuetele. Samuti peate lisama lähtestamisfunktsiooni.

Seda funktsiooni tuleb kasutada igal lehel. Selle eesmärk on kontrollida küpsise juurdepääsu autoriseerimisvõtit (“auth_key”). Kui küpsis kasutab isset funktsiooni, ilmub vastav kasutaja. Taaskord tuleb seda funktsiooni kasutada igal lehel.

See kood kontrollib, kas funktsiooni isset kasutatakse. Kui seda funktsiooni kasutab küpsis, kontrollitakse juurdepääsu autoriseerimisvõtme ja kasutaja vastavust. Kui leitakse vaste, eraldab fail nõutud teabe ja registreerib kasutaja. Vastasel juhul kustutatakse küpsis, kuna see on kehtetu.

Teised omadused

= $currenttime)( // Määra uus kasutaja viimane aktiivne aeg $_SESSION["user_lastactive"] = $currenttime; ) else ( // Kui seanss on olnud passiivne liiga kaua väljalogi väljalogout(); ) ) ) ) ?>

Väljalogimisfunktsioon on iseenesestmõistetav. See funktsioon kustutab kõik seansimuutujad ja küpsised ning seab kasutaja juurdepääsu autoriseerimisvõtme väärtuseks 0. Pärast seda ei saa juurdepääsu autoriseerimisvõtit enam kasutada. Tuleb märkida, et kasutaja saab määrata oma küpsise väärtuseks 0 ja olla endiselt sisse logitud oma kasutajanimega. Selle parandamiseks kontrollige kogu küpsistest saadud teavet. Funktsiooni regexp abil veenduge, et string sisaldab õiget arvu märke, kehtivaid märke jne. Funktsioon keepalive() hoiab seansi elus. See funktsioon peaks olema igal lehel.

Järeldus ja seansi kaaperdamine

Seansikaaperdamise eest on äärmiselt raske kaitsta. Võib-olla olete lugenud nõuandeid kasutaja IP-aadressi või kasutajaagendi protsessi kombinatsiooni kasutamise kohta identifitseerimismärgendite loomiseks. See ei ole aga teie tegelike kasutajate jaoks tõhus. Kasutajate IP-aadressid muutuvad pidevalt. Suuremad Interneti-teenuse pakkujad, nagu AOL, muudavad neid iga paari minuti järel. See tekitab tohutu probleemi. Samuti muutuvad kasutajaagendi protsessid – IE7 on leidnud, et kasutajaagendid vahetuvad perioodiliselt. Parim viis pealtkuulamise eest kaitsmiseks on luua võlukepisüsteem. See süsteem väljastab küpsise igal laadimislehel ja salvestab selle väärtuse ka teie mysql-i loendisse. Seejärel võrreldakse küpsise väärtust MySQL-i tabeli väärtusega. Kui need erinevad, on seanss kehtetu.

Need on seansifailide ja küpsistega töötamise põhifunktsioonid. Loomulikult on turvalisuse parandamiseks vaja lisada rohkem küpsiseid, et kontrollida andmete õigsust. Sellest kaitsetasemest ei piisa tundliku teabe kaitsmiseks, kuid kuskilt tuleb alustada! Ja kokkuvõtteks:

Veenduge, et küpsiste väärtused oleksid kehtivad.
Ärge kunagi väljasta seansi parooli ega küpsise muutujat.

Seansi fikseerimise vältimiseks kasutage identifikaatorit
session_regenerate_id.

Järgmiste tundideni!

P.S. Koodis olevad kommentaarid tõlgin 24 tunni jooksul :)

Tänases õpetuses räägime küpsistega töötamisest PHP-s. Alustame sellest, mis see on, miks seda vaja on ja miks see üldse ilmus.

Milleks küpsiseid kasutatakse?

Nagu teie ja mina juba teame, saame PHP-s töötada GET- ja POST-päringutega. Need võimaldavad meil andmeid serverisse edastada, et koodi toimimist kuidagi mõjutada. Saame anda skriptile sisselogimise ja parooli, see kontrollib neid ja võimaldab meil juurdepääsu mis tahes teabele. See aga ei võimalda meie ja serveri vahel seanssi luua. See tähendab, et server ei suuda meid "mäletada" ja iga kord, kui tahame öelda, et see oleme meie, peame saatma eraldi uue päringu koos sisselogimise ja parooliga.

Lahendusena leiutati küpsised. Need on võtmeväärtuse tüübiga kirjed, nagu PHP massiiv, kuid need salvestatakse saidi kasutaja brauseris. Küpsiseid salvestatakse iga saidi jaoks eraldi. Iga kord, kui kasutaja esitab saidile päringu, kontrollib brauser, kas need kirjed on selle saidi jaoks olemas. Ja kui neid on, saadab see need sellele saidile iga päringu päises.

Kust tulevad küpsised?

Küpsised luuakse brauseris serveri palvel. Mingil hetkel otsustame, et peame külastaja brauseris looma teatud väärtusega küpsise. Selleks peab server saatma kliendile vastuses spetsiaalse päise, mis näitab, milline kirje tuleb selle saidi brauseris luua.

Kõik see toimub taustal ja pole kasutajale märgatav. Selle põhimõtte kohaselt toimib autoriseerimine mis tahes veebisaidil. Lihtsamal juhul kontrollib server pärast saidile sisselogimise ja parooli sisestamist, kas need on õiged. Ja kui jah, siis võib server paluda brauseril need andmed küpsisesse salvestada ja iga päringuga talle saata.

See tähendab, et server ütleb laias laastus: "Hei, brauser, loo mulle kanne võtmega "login" ja väärtusega "admin" ning veel üks võtmega "parool" ja väärtusega "123". Pärast seda hakkab brauser saatma täiendavaid andmeid, näiteks:

Sisselogimine: administraatori parool: 123

Pärast seda on saidi muudes kohtades, kus on nõutav autoriseerimine, nüüd võimalik neid andmeid küpsisest kontrollida, ilma et peaks kasutajat vormi uuesti täitma. Ja kui need on õige kasutajanimi ja parool, siis andke kasutajale juurdepääs millelegi.

Eluajast

Samal ajal on küpsisel TTL (Time To Live). See tähendab, et need kirjed võivad olla ajutised. Selle eluea näitab server ka siis, kui küpsis on brauserisse installitud. Tänu sellele saad seansi kestma pool tundi. Ja pärast seda aega peab kasutaja uuesti sisse logima. Tõenäoliselt olete märganud seda paljudel veebisaitidel.

Kuidas PHP-s küpsistega töötada

Seega on meil põhiteadmised küpsiste toimimisest. Vaatame nüüd, kuidas saate nendega PHP-s töötada.

Loome oma projektis faili nimega viewCookies.php. Paneme sellesse järgmise koodi.

Nagu te juba arvasite, $_COOKIE on PHP-s veel üks globaalne massiiv, mis sarnaneb massiividega $_GET Ja $_POST. Ainult see salvestab kõik küpsised, mille brauser praeguse päringu osana saatis.

Vaatame, kuidas see skript töötab, avades brauseris lehe: http://myproject.loc/viewCookies.php

Nagu näeme, on see massiiv praegu tühi. Täidame ära :) Selleks peame brauserisse installima mingisuguse küpsise. PHP-s kasutatakse selleks funktsiooni setcookie ($nimi, $väärtus, $ttl, $tee)

Läbitud parameetrid:

  • $nimi – küpsise nimi
  • $value – selle väärtus
  • $ttl – eluaegne. Kui määrate 0, installitakse küpsis igaveseks (kuni see kustutatakse).
  • $path – tee aadressiribal. Kui määrate "/", on küpsised saadaval kõigist saidi kataloogidest. Näiteks nii http://myproject.loc/ kui ka http://myproject.loc/posts/ . Kui määrate "/posts/", on küpsistele juurdepääs ainult kataloogist http://myproject.loc/posts/ ja kõigist selle alamkataloogidest (näiteks http://myproject.loc/posts/new/). Vaikeväärtus on praegune kataloog, kuhu küpsis on installitud. Kui tahame, et küpsis oleks saadaval kogu saidil, peame määrama selle väärtuseks "/".

Parameetreid on veel mitmeid, nende kohta saate lugeda ametlikust dokumentatsioonist.

Nüüd proovime seda funktsiooni töös. Loome faili nimega setCookies.php ja kirjutame sellesse järgmise koodi:

Pärast seda minge aadressile http://myproject.loc/setCookies.php, kus näeme tühja lehte. Nagu me juba ütlesime, pole küpsistega töötamine kasutajale nähtav.

Seda tööd on aga alati näha Google Chrome'i arendajakonsoolis. Avame selle (vajutades klahvi F12), läheme vahekaardile Võrk, värskendame lehte brauseris ja leiame selle allalaaditud andmete loendist (see on seal ainus).

Klõpsake sellel kirjel ja valige paremal avanevas aknas vahekaart Päised. Siin, jaotises Vastuste päised, näeme päist Set-Cookie koos meie määratud andmetega.

Seega said küpsised brauserisse edukalt installitud. Läheme nüüd meie lehele, kus kuvatakse massiiv $_COOKIE – http://myproject.loc/viewCookies.php

Nagu näeme, saadetakse varem brauserisse installitud küpsised nüüd serverisse. Näete neid ka taotluses, vaadates arendajakonsooli jaotist Taotluse päised.

Kui teil on vaja näha kõiki antud saidi brauseris saadaolevaid küpsiseid, saate neid vaadata samas Google Chrome'i arendajakonsoolis. Selleks minge vahekaardile Rakendus, valige vasakpoolses loendis üksus Küpsised ja selle sees meie sait.

Kõik küpsised kuvatakse mugavas loendis.

Mida veel peate küpsiste kohta teadma

Selle õppetunni lõpetuseks peame lisama, et küpsised seatakse serveri vastuses HTTP kaudu päise abil. HTTP-protokoll on loodud nii, et päis peab alati olema andmete ees ja mitte midagi muud. Seetõttu tuleb enne väljundi väljastamist välja kutsuda funktsioon setcookie ja kõik muud PHP-vastuse päist muutvad funktsioonid.

Saate esmalt seada küpsise ja seejärel kuvada teksti.

Kõik saab suurepäraselt hakkama.

Kuid te ei saa printida teksti (mis on HTTP vastuse põhiosa) ja seejärel proovida küpsist seadistada.

Nagu näeme, toob see kaasa vea. Nii töötab HTTP-protokoll. Esiteks - pealkiri, seejärel - keha. Ainult nii ja mitte teisiti.

Mitme küpsise seadmine

Pole midagi lihtsamat kui mõne küpsise seadmine. Selleks peate lihtsalt mitu korda kutsuma funktsiooni setcookie.

Need kantakse edukalt üle kliendile.

Järgmises õppetükis vaatleme näidet täielikust kasutaja interaktsioonist küpsiste kaudu. Seniks teeme kodutööd.