int setcookie (virknes nosaukums [, virknes vērtība [, int derīguma termiņš [, virknes ceļš [, virknes domēns [, int safe]]]]])

Setcookie() norāda sīkfailu, kas jānosūta kopā ar pārējo galvenes informāciju. Sīkfaili ir jānosūta pirms tam jebkuras citas galvenes (šis ir sīkfailu ierobežojums, nevis PHP). Tas prasa, lai šī funkcija tiktu izsaukta pirms atzīmes vai. Visi argumenti, izņemot nosaukumu, nav obligāti. Ja ir norādīts tikai nosaukuma arguments, sīkfails ar šādu nosaukumu tiks dzēsts no attālā klienta. Varat arī aizstāt jebkuru argumentu ar tukšu virkni (""), lai šo argumentu izlaistu. Derīguma termiņš un droši argumenti ir veseli skaitļi /integer, un tos nevar izlaist, izmantojot tukšu rindu. Tajos izmantojiet nulli (0). Derīguma termiņa arguments ir parasts Unix laika vesels skaitlis, ko atgriež time() vai mktime() . Drošais arguments norāda, ka šis sīkfails ir jānosūta tikai, izmantojot drošu HTTPS savienojumu. Kad sīkfaili ir iestatīti, tiem var piekļūt, ielādējot nākamo lapu, izmantojot $_COOKIE masīvu (kuru PHP versijās pirms 4.1.0 sauc par $HTTP_COOKIE_VARS). Bieži sastopamās kļūdas: sīkfaili nebūs redzami, kamēr netiks ielādēta nākamā lapa. Sīkfaili ir jāizdzēš ar tiem pašiem iestatījumiem, ar kuriem tie tika iestatīti. PHP 3 versijā vairākus setcookie() izsaukumus vienā un tajā pašā skriptā var veikt apgrieztā secībā. Ja mēģināt dzēst vienu sīkfailu, pirms ievietojat citu, pirms dzēšanas tas ir jāizdara. PHP 4 versijā vairāki setcookie() izsaukumi tiek izpildīti tādā secībā, kādā tie tiek izsaukti. Tālāk ir sniegti sīkfailu nosūtīšanas piemēri:
Ņemiet vērā, ka sīkfaila vērtības daļa tiks automātiski urlencoded, kad sīkfails tiek nosūtīts, un, kad tas ir saņemts, tas tiek automātiski atšifrēts un piešķirts mainīgajam ar tādu pašu nosaukumu kā sīkfaila nosaukumam. Lai skatītu mūsu testa sīkfaila saturu skriptā, vienkārši izmantojiet vienu no šiem piemēriem: Papildinformāciju par sīkfailiem skatiet Netscape specifikācijā: http://www.netscape.com/newsref/std/cookie_spec.html. Microsoft Internet Explorer 4 ar 1. servisa pakotni nedarbojas pareizi ar sīkfailiem, kuriem ir iestatīts ceļa parametrs. Netscape Communicator 4.05 un Microsoft Internet Explorer 3.x neapstrādā sīkfailus pareizi, ja nav iestatīts ceļš un laiks.

Pēdējā atjaunināšana: 1.11.2015

Sīkdatnes ir nelielas datu kopas (ne vairāk kā 4 kB), ar kurām tīmekļa vietne var saglabāt jebkādu informāciju lietotāja datorā. Izmantojot sīkfailus, jūs varat izsekot lietotāja aktivitātēm vietnē: vai lietotājs ir pieteicies vietnē vai nav, izsekot viņa apmeklējumu vēsturei utt.

Sīkdatņu saglabāšana

Lai saglabātu sīkfailus lietotāja datorā, izmantojiet funkciju setcookie(). Tam ir šāda definīcija:

Bool setcookie (virkne $nosaukums, virkne $vērtība, int $beigšanās, virkne $ceļš, virkne $domēns, bool $secure, bool $http tikai);

Funkcija setcookie() var pieņemt šādus parametrus:

    nosaukums: sīkfaila nosaukums, kas tiks izmantots, lai piekļūtu tā vērtībai

    vērtība: sīkfaila vērtība vai saturs - jebkurš burtciparu teksts, kas nav lielāks par 4 kB

    beigties (pēc izvēles): derīguma termiņš, pēc kura sīkfaili tiek iznīcināti. Ja šis parametrs nav iestatīts vai ir vienāds ar 0, sīkfails tiek iznīcināts pēc pārlūkprogrammas aizvēršanas.

    ceļš (neobligāti): ceļš uz servera direktoriju, kuram būs pieejami sīkfaili. Ja norādāt "/", sīkfaili būs pieejami visā vietnē. Ja iestatāt, piemēram, "/mydir/" , sīkfaili būs pieejami tikai no direktorija /mydir/" un visi tā apakšdirektoriji. Noklusējuma vērtība ir pašreizējais direktorijs, kurā ir instalēti sīkfaili.

    domēns (neobligāti): norāda domēnu, kuram būs pieejami sīkfaili. Piemēram, ja tas ir otrā līmeņa domēns, localhost.com, tad sīkfaili ir pieejami visai vietnei localhost.com, ieskaitot tās apakšdomēnus, piemēram, blog.localhost.com.

    Ja ir norādīts apakšdomēns blog.localhost.com, sīkfaili ir pieejami tikai šajā apakšdomēnā.

    drošs (neobligāti): norāda, ka sīkfaila vērtība ir jānosūta, izmantojot HTTPS. Ja iestatīts uz True , sīkfails no klienta tiks nosūtīts serverim tikai tad, ja ir izveidots drošs savienojums. Noklusējuma vērtība ir false .

    Tikai http (neobligāti): ja taisnība, sīkfaili būs pieejami tikai, izmantojot http protokolu. Tas nozīmē, ka sīkfaili šajā gadījumā nebūs pieejami skriptu valodām, piemēram, JavaScript. Pēc noklusējuma parametrs ir nepatiess

Saglabāsim sīkfailus:

$value1 = "Singapūra"; $vērtība2 = "ķīniešu"; setcookie("pilsēta", $vērtība1); setcookie("valoda", $vērtība2, laiks()+3600); // derīguma termiņš 1 stunda

Šeit ir iestatīti divi sīkfaili: "pilsēta" un "valoda". Pirmais sīkfails tiek iznīcināts pēc pārlūkprogrammas aizvēršanas, bet otrais pēc 3600 sekundēm, tas ir, pēc stundas

Sīkdatņu saņemšana

Lai iegūtu sīkfailu, varat izmantot globālo asociatīvo masīvu $_COOKIE, piemēram, $_COOKIE["pilsēta"] . Tātad, mēs iegūstam iepriekš saglabātos sīkfailus:

If (isset($_COOKIE["pilsēta"]) atbalso "Pilsēta: " . $_COOKIE["pilsēta"] . "
"; if (isset($_COOKIE["valoda"])) echo "Valoda: " . $_COOKIE["valoda"];

Masīvu glabāšana sīkfailos

Masīvu saglabāšanai sīkfailos ir dažas īpašas funkcijas. Piemēram, saglabāsim šādu masīvu:

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

Tagad mēs to iegūstam un parādām lapā:

If (isset($_COOKIE["lan"])) ( foreach ($_COOKIE["lan"] kā $name => $value) ($name = htmlspecialchars($name); $value = htmlspecialchars($value) ); echo "$name. $value
"; } }

Sīkdatņu noņemšana

Lai dzēstu sīkfailu, kā derīguma termiņš ir jānorāda kāds pagātnes laiks:

Setcookie("pilsēta", "", laiks() - 3600);

Turpinām iepazīties ar tīmekļa programmēšanas pamatprincipiem. Šodien mēs runāsim par t.s cepumi(cepums). Sīkfails ir dati, ko klientam nosūta tīmekļa serveris un kas tiek glabāti klienta pusē.

Jebkurš tīmekļa skripts, piemēram, PHP skripts, parasti tiek palaists sekundes daļā, atgriežot informāciju tīmekļa serverim tālākai nosūtīšanai. Pēc skripta pabeigšanas visi dati, kas izveidoti operatīvajā atmiņā tā darbības laikā, tiek iznīcināti. Dažreiz šos datus nevar pazaudēt. Pieņemsim, ka vietnes galvenajā lapā ir HTML veidlapa, kurā tiek lūgts izvēlēties vēlamo fona krāsu. Pēc tam visās lapās tiek izmantota lietotāja izvēlēta krāsa. Krāsas vērtība ir kaut kas tāds, ko var saglabāt konkrēta uzdevuma kontekstā, izmantojot sīkfailu.

Lai sīkāk izprastu sīkdatņu mehānisma darbību PHP, jums ir jāizlasa raksts "PHP Interpreter. Pamati, darbības principi", jo īpaši, kas skar tā sauktās "pirmās izejas" jēdzienu. Tātad jūs varat izmantot mehānismu HTTP atbildes ģenerēšanas stadijā uz pieprasījumu. Lai uzdotu tīmekļa klientam saglabāt kādu parametru, HTTP atbildei tiek pievienota galvene ar formas vērtību nosaukums=vērtība(parametra nosaukums, parametra vērtība), piemēram:

Set-Cookie: myname=john

Ja nepieciešams saglabāt vairāk nekā vienu parametru, šādas galvenes var būt vairākas. Saņemot HTTP atbildi, tīmekļa pārlūkprogramma pārbauda Set-Cookie galvenes un, ja tādas ir, saglabā to vērtības savos iekšējos pakalpojumu failos. Sīkfaili pēc noklusējuma ir saistīti ar vietnes domēnu. Sagatavojot HTTP pieprasījumu, tīmekļa pārlūkprogramma pārbauda, ​​vai tajā nav saglabāti sīkfaili, kas saistīti ar domēnu, kuram tiek nosūtīts pieprasījums. Ja tāda ir, HTTP pieprasījumam tiek pievienota galvene

Sīkfails: nosaukums=vērtība

katram atrastajam saglabātajam parametram. Tādējādi tīmekļa serveris, kas ir uzdevis tīmekļa klientam saglabāt noteiktus parametrus kā sīkfailu, saņems šos parametrus atpakaļ visos turpmākajos HTTP pieprasījumos no šī klienta. Aizverot pārlūkprogrammu, saglabātie sīkfaili tiek dzēsti.

Sīkdatnē varat norādīt sīkdatnes kalpošanas laiku. Šim nolūkam tiek pievienots īpašs atribūts beidzasšādā veidā:

Set-Cookie: nosaukums=vērtība; beidzas = datums

Kur datums ir datums un laiks, kad pārlūkprogrammai ir jāizdzēš šis sīkfails, piemēram:

Pievērsiet uzmanību atribūta beigu termiņš formātam.

Izmantojot atribūtu ceļš Jūs varat ierobežot sīkdatņu apjomu. Pēc noklusējuma sīkfaili tiek lietoti visiem konkrēta domēna pieprasījumiem, kas atbilst vērtībai ceļš=/. Ja, piemēram, nosakām ceļš=/doc/, tad sīkfaili attieksies tikai uz pieprasījumiem direktorijā /doc/, kā arī visiem tā apakšdirektorijiem un dokumentiem, piemēram, /doc/images/. Piemērs ar ceļa atribūtu:

Varat arī ignorēt domēna saistīšanu, izmantojot atribūtu domēns. Pēc noklusējuma sīkfails ir saistīts ar tā dokumenta domēnu, kura pieprasījums ierosināja sīkfaila izveidi. Ja norādāt .domain.ru, tad sīkfails attieksies uz domēna domain.ru pieprasījumiem, kā arī uz visiem tā apakšdomēniem. Varat ierobežot darbību ar noteiktu apakšdomēnu, piemēram, www.domain.ru. Piemērs, izmantojot derīguma termiņa, ceļa un domēna atribūtus:

Ir pienācis laiks izdomāt, kā strādāt ar sīkfailiem PHP. Lai iestatītu sīkfailus, ir PHP funkcija setcookie:

Bool ( virkne $name [ , virkne $value [ , int $expire = 0 [ , string $path [ , string $domain [ , bool $secure = false [ , bool $httponly = false ] ] ] ] ] )

Lielākā daļa funkciju parametru nav obligāti. Apskatīsim reālu piemēru (iepriekš piedāvātā lapa ar fona krāsas izvēli):

"#090" , "zils" => "#009" , "sarkans" => // Noklusējuma fona krāsa (balta). Krāsa tiks ņemta no sīkfaila, ja atbilstošā sīkdatne pastāv (tiks ieviesta vēlāk) ?>
">
Vēlamais fons:

Šajā piemērā sīkfailu mehānisms vēl nav aktivizēts, ir izveidots tikai lapas rāmis. Ja esat lasījis iepriekšējos rakstus un nodarbības, tad jums vajadzētu būt iespējai saprast šo kodu. Masīvā tiek saglabāts iespējamo krāsu saraksts (jūs varat pievienot savu), krāsas tiek parādītas HTML formā kā nolaižamais saraksts. Tagad no veidlapas jāraksta datu apstrādātājs. Tradicionāli mēs to ievietojam augšpusē pēc datu deklarēšanas:

"#090" , "zils" => "#009" , "sarkans" => "#900" ) ; $bgcolor = "#fff" ; // Noklusējuma fona krāsa (balta). Krāsa tiks ņemta no sīkfaila, ja pastāv atbilstošais sīkfails (īstenots nākamajā piemērā) //--Saglabājiet fona krāsas vērtību sīkfailā. Sīkāka informācija zemāk rakstā } ?>

Apdarinātājs iegūst lietotāja izvēlētās krāsas vērtību un saglabā to sīkfailā, izmantojot setcookie PHP funkciju. Setcookie funkcija ģenerētajai HTTP atbildei pievienos Set-Cookie galveni no mūsu sīkfaila. To, tāpat kā galvenes funkciju, var izmantot tikai pirms izvades, tas ir, pēc iespējas augstāk kodā.

Lieliski, mēs saglabājām cepumus. Tagad mums tie ir jāizmanto. Virs apdarinātāja pievienojiet kodu fona krāsas vērtības iegūšanai no sīkfaila, ja tas tur ir saglabāts:

if ( isset ([ "bgcolor" ] ) && in_array ([ "bgcolor" ] , $colors ) ) ( $bgcolor = [ "bgcolor" ] ; )

Viss ir ļoti vienkārši. Ja kopā ar skripta pieprasījumu tika nosūtīti sīkfaili, PHP ievieto tos globālajā $_COOKIE masīvā. Tādējādi darbs ar pieņemtajiem sīkfailiem neatšķiras no, piemēram, darba ar pieņemtajiem GET vai POST parametriem. Pilns skriptu saraksts:

"#090" , "zils" => "#009" , "sarkans" => "#900" ) ; $bgcolor = "#fff" ; // Noklusējuma fona krāsa (balta) //--Pārbaudiet, vai bgcolor jau ir saglabāts sīkfailos (pārbaudām arī pareizību, jo sīkfailus ir viegli nomainīt) if ( isset ([ "bgcolor" ] ) && in_array ([ "bgcolor" ] , $colors ) ) ( //--Ja ir, izmantojiet saglabāto vērtību$bgcolor = [ "bgcolor"] ; ) //--Pārbaudiet, vai GET parametrs bgcolor ir nodots un vai tas ir mūsu masīvā. Citādi, ziniet, viņi var jums nodot, kas zina, ko, un tad mums tas būs jāsakārto;) if ( isset ($_GET [ "bgcolor" ] ) && in_array ($_GET [ "bgcolor" ] , $colors ) ) ( $bgcolor = $_GET [ "bgcolor" ] ; //--Šis būs mūsu jaunais lapas fons("bgcolor" , $bgcolor ) ; ) ?> Iespēja izvēlēties lapas fonu
">
Vēlamais fons:

Apskatiet, kā darbojas skripts; ja jums ir kādi jautājumi, lūdzu, komentējiet. Fona krāsa tiek saglabāta t.s pagaidu sīkfails, kas tiks dzēsta, aizverot pārlūkprogrammu. Izmantosim pastāvīgo sīkfailu Lai to izdarītu, funkcijā setcookie ir jādefinē trešais parametrs - sīkfailu dzēšanas laiks, kas tiks pārveidots par Set-Cookie HTTP galvenes atribūtu expires. Parametrs norāda laikspiedolu Unix formātā. Visbiežāk šādas atzīmes ģenerēšanai tiek izmantota PHP funkcija time(), kas atgriež pašreizējo laiku Unix formātā, pievienojot tam sekunžu skaitu, pēc kura sīkfails ir jāizdzēš. Piemēram, laiks()+3600- pēc stundas izdzēst sīkfailus. Padarīsim mūsu cepumu aktīvu vienu nedēļu:

("bgcolor" , $bgcolor , laiks () + 3600 * 24 * 7 ); //--Saglabājiet fona krāsas vērtību sīkfailā

Tas arī viss, tagad vietne “atceras” izvēlēto fona krāsu pat pēc pārlūkprogrammas aizvēršanas. Starp citu, lai izdzēstu sīkfailus, vienkārši norādiet, piemēram, pēdējo datumu kā derīguma termiņu laiks()-3600. Pārbaudot piemērus, neaizmirstiet apskatīt HTTP galvenes.

Drošība ir svarīga katras vietnes panākumu sastāvdaļa. Tomēr nepareiza drošības uzlabošana var palielināt izmaksas un vispārēju lietotāju kairinājumu. Šajā rokasgrāmatā mēs apskatīsim izplatītākās problēmas, kas rodas, strādājot ar sesijas failiem un sīkfailiem.

Sīkdatnes

Sīkdatnes ir veids, kā identificēt lietotāju pēc vietnes. Piemēram, vietne izveido sīkfailu ar nosaukumu “favorite_color” un vērtību: “red”. Turpmāk ikreiz, kad apmeklējat vietni, tiks lejupielādēts sīkfails, un tiks iestatīta jūsu iecienītākā krāsa sarkanā krāsā (“favorite_color” ir “sarkana”). Tas ir diezgan ērti, jo lietotājam nav jāreģistrējas sistēmā katru reizi, kad viņš apmeklē vietni. Šī metode tiek izmantota arī opcijā “Atcerēties mani”, kas ir atrodama daudzās vietnēs. Tomēr šī metode var arī radīt nopietnus caurumus vietnes drošības sistēmā.

Viens piemērs neapstiprina, kurš sīkfails tiks atgriezts jūsu vietnē. Pēc vienkāršas meklēšanas es atradu vietni ar lietotāja paneļa skriptu. Šis skripts izvadīja visu manu pieteikšanās informāciju sīkfailos un ielādēja vērtības katru reizi, kad darbība tika izpildīta. Piemēram, ja es atstāju komentāru, sistēma atgrieztu jebkuru no maniem vārdiem no sīkfailu nosaukumu mainīgā. Tālāk, izmantojot firebug paplašinājumu un pāris citas ierīces, es varēju ne tikai apskatīt šos failus, bet arī tos rediģēt. Tādējādi ikreiz, kad es rediģēju sīkfailu, kurā ir mans vārds, vietne neapstiprināja nosaukuma pareizību, bet gan rādīja datus. Es varētu arī mainīt savu ID. Galu galā es varēju atrast administratora ID (001) un iegūt administratora piekļuvi.

Sesijas

Sesijas ir lietotāja identifikācijas mainīgie, kas tiek glabāti jūsu serverī. Atšķirībā no sīkfailiem lietotāji nevar tās tieši mainīt, taču tajā pašā laikā risks joprojām pastāv. Sesijām ir divi galvenie draudi: sesijas fiksācija un sesijas nolaupīšana.

Sesijas ierakstīšana

Sesijas fiksācija notiek, kad lietotāji pieslēdzas jau izveidotai sesijai un augšupielādē tajā savu informāciju. Piesakoties jau izveidotā sesijā, uzbrucējs var apmeklēt šo sesiju un iegūt lietotāju ievadīto informāciju. Vienkāršs piemērs ir sekot saitei uz vietni ar jau iestatītu sesijas ID. Piemēram, http://www.example.com/?PHPSESSID=1234. Uzbrucējs tagad izmanto to pašu PHPSESSID, lai skatītu jūsu informāciju.

Sesijas nolaupīšana

Sesijas nolaupīšana ir otrais uzbrukuma veids, pret kuru ir daudz grūtāk aizsargāties. Šādā gadījumā uzbrucējs var pārņemt jūsu sesijas identifikatoru, izmantojot pakešu (datu) analīzi un citas dažādas metodes. Piemēram, uzbrucējs, kas ir savienots ar jūsu tīklu, var filtrēt visus jūsu maršrutētājam nosūtītos datus. Pēc jūsu sesijas ID saņemšanas uzbrucējs var apmeklēt šo ID, lai piekļūtu visai jūsu informācijai.

Efektīva sesiju izmantošana

Šī rokasgrāmata neaptver reģistrācijas skripta kodēšanas procesu. Tomēr es mēģināšu parādīt, kā padarīt jūsu pašreizējo pieteikšanās skriptu drošāku.

Kopumā sesiju izmantošana ir drošāka nekā sīkfailu izmantošana. Tas ir tāpēc, ka lietotāji nevar mainīt sesijas vērtības tik vienkārši, kā viņi var mainīt sīkfailu vērtības. Tāpēc man patīk visus lietotāja mainīgos glabāt sesijas mainīgajos. Vēl viens svarīgs punkts ir nekad neuzticēties lietotāja ievadei. Vienmēr pārbaudiet lietotāja informāciju, salīdzinot ar vērtībām MYSQL datubāzē, un pēc tam attiecīgi izvadiet sesijā. Apsveriet iespēju veikt izmaiņas reģistrācijas funkcijā, piemēram:

funkcijas pieteikšanās($lietotājvārds, $parole)
$sql = mysql_query("SELECT id, lietotāja_līmenis NO lietotājiem WHERE parole = "" . $parole . "" UN lietotājvārds = "" . $lietotājvārds . "" 1. IEROBEŽOJUMS");
// Ja nav atbilstības, lietotājvārds un parole nesakrīt
if($sql === false)
{
return false;
}
cits
{
while($u = mysql_fetch_array($sql))
{
session_regenerate_id(true);
$sesijas_id = $u;
$session_username = $lietotājvārds;
$session_level = $u;

$_SESIJA["lietotāja_id"] = $sesijas_id;
$_SESSION["lietotāja_līmenis"] = $sesijas_līmenis;
$_SESSION["lietotāja_vārds"] = $sesijas_lietotājvārds;
$_SESSION["lietotāja_pēdējais"] = laiks ();
atgriezt patiesu;
}
}

Analizēsim šo kodu. Tas pieprasa lietotājvārdu un paroli un pārbauda, ​​vai ir kāds lietotājs, kas atbilst abiem šiem kritērijiem. Ja rezultāta nav, tiek ģenerēta nederīga lietotājvārda/paroles kombinācija un tiek ģenerēta kļūda. Pretējā gadījumā tiek izveidoti sesijas mainīgie: user_id, user_level, user_name un user_lastactive. Šīs vērtības ir aizpildītas ar datiem no mysql saraksta.

Jums var rasties jautājums, ko nozīmē funkcija “session_regenerate_id(true)”. Iepriekš mēs runājām par sesijas fiksāciju. Šis risinājums ir paredzēts, lai aizsargātu pret šāda veida uzbrukumiem. Funkcija izveido jaunu sesijas ID katru reizi, kad lietotājs piesakās. Tādā veidā, ja lietotājs noklikšķina uz saites ar iestatītu sesijas vērtību, tiks izveidots jauns sesijas ID un lietotāja informācija tiks pievienota jaunajai, nevis vecajai sesijai. Kad pareizais parametrs (true) tiek nodots caur šo funkciju, tā dzēš veco sesiju un izdzēš visu informāciju.

Funkcijas “Atcerēties mani” rakstīšana

Sīkfaili vai sesijas faili nedrīkst saturēt lietotāja paroles. Tas ir ļoti svarīgi, jo, ja tiek pārtverts sesijas fails vai sīkfails, uzbrucējs var iegūt pilnīgu kontroli pār visiem kontiem. Ir zināms, ka daudzi lietotāji izmanto vienu un to pašu paroli dažādos kontos, un tas ļaus uzbrucējam iegūt kontroli pār lietotāju kontiem citās vietnēs. Kā mēs varam izkļūt no šīs nepatīkamās situācijas?

Šīs problēmas risinājums ir piekļuves autorizācijas atslēga (auth_key). Piekļuves autorizācijas atslēga var būt lietotājvārda, paroles un nejaušas rakstzīmju kopas kombinācija, kas ir apvienota un šifrēta. Katram lietotājam ir jābūt savai unikālai piekļuves autorizācijas atslēgai. Tādējādi, kad sīkfails ir iestatīts, vērtība tiek iestatīta uz piekļuves autorizācijas atslēgu. Pēc tam piekļuves autorizācijas atslēgas vērtība tiek salīdzināta ar vērtību jūsu pievienotajā MySQL sarakstā. Apskatīsim, kā mainīsies lietotāja pieteikšanās funkcija.

account_active = patiess; // Pārbaudiet, vai lietotājs vēlas, lai konts tiktu saglabāts sīkfailā if($remember) ( // Ģenerēt jaunu autentifikācijas atslēgu katrai pieteikšanās vietai (tāpēc sīkfailu nolaupīšanas gadījumā veco autentifikācijas atslēgu nevar izmantot vairākas reizes) $cookie_auth= rand_string(10) . $lietotājvārds; $auth_key = session_encrypt($cookie_auth); $auth_query = mysql_query("ATJAUNINĀT lietotājus SET auth_key = "" . $auth_key . "" WHERE lietotājvārds = "" . $lietotājvārds . """); setcookie("auth_key", $auth_key, time() + 60 * 60 * 24 * 7, "/", "example.com", false, true) ) // Piešķirt mainīgos sesijai session_regenerate_id(true); $sesijas_id = $u; $session_username = $lietotājvārds; $session_level = $u; $_SESIJA["lietotāja_id"] = $sesijas_id; $_SESSION["lietotāja_līmenis"] = $sesijas_līmenis; $_SESSION["lietotāja_vārds"] = $sesijas_lietotājvārds; $_SESSION["lietotāja_pēdējais"] = laiks (); atgriezt patiesu; ) ) ) ?>

Tagad tas pārbauda, ​​vai parametrs “true” ir ticis cauri pieteikšanās funkcijas atcerēšanās parametram. Ja jā, piekļuves autorizācijas atslēgai ir iestatīts sīkfails. Funkcija Rand_string izveido virkni ar tai caurgājušo rakstzīmju skaitu. Funkcija Session_encrypt pievieno ķēdei patvaļīgus datus un šifrē visu informāciju, izmantojot md5. Šī ķēde ir unikāla, jo tā izmanto lietotājvārdu, kas ir unikāls katram lietotājam. Pēc tam piekļuves autorizācijas atslēga mysql sarakstā tiek iestatīta uz sīkfailā ievadīto vērtību. Tomēr ar šo aizsardzību jūsu vietnei var nepietikt. Apsveriet iespēju pievienot vairākas piekļuves autorizācijas atslēgas un vairākus sīkfailus. Atkal šī funkcija neatbilst funkcijas “atcerēties mani” prasībām. Jums arī jāpievieno inicializācijas funkcija.

Šai funkcijai ir jāpiekļūst katrā lapā. Tās mērķis ir pārbaudīt sīkfaila piekļuves autorizācijas atslēgu (“auth_key”). Ja sīkdatnē tiek izmantota isset funkcija, tiks parādīts atbilstošais lietotājs. Vēlreiz atkārtoju, ka šai funkcijai ir jāpiekļūst katrā lapā.

Šis kods pārbauda, ​​vai tiek izmantota funkcija isset. Ja šo funkciju izmanto sīkfails, tiks veikta pārbaude, lai piekļuves autorizācijas atslēga atbilstu lietotājam. Ja tiek veikta sakritība, fails izvilks nepieciešamo informāciju un reģistrēs lietotāju. Pretējā gadījumā sīkfails tiks dzēsts, jo tas ir nederīgs.

Citas funkcijas

= $currenttime)( // Iestatīt jaunu lietotāju pēdējo aktīvo laiku $_SESSION["user_lastactive"] = $currenttime; ) else ( // Ja sesija ir bijusi neaktīva pārāk ilgi logout logout(); ) ) ) ) ?>

Atteikšanās funkcija ir pašsaprotama. Šī funkcija izdzēš visus sesijas mainīgos un sīkfailus un iestata lietotāja piekļuves autorizācijas atslēgu uz 0. Pēc tam piekļuves autorizācijas atslēgu vairs nevar izmantot. Jāņem vērā, ka lietotājs var iestatīt sīkfailu uz 0 un joprojām pieteikties ar savu lietotājvārdu. Lai to labotu, pārbaudiet visu informāciju, kas saņemta no sīkfailiem. Izmantojot funkciju regexp, pārliecinieties, vai virknē ir derīgs rakstzīmju skaits, derīgas rakstzīmes utt. Funkcija keepalive() uztur sesiju dzīvu. Šai funkcijai jābūt katrā lapā.

Secinājums un sesijas nolaupīšana

Ir ārkārtīgi grūti aizsargāties pret sesiju nolaupīšanu. Iespējams, esat izlasījis dažus padomus par lietotāja IP adreses kombināciju vai lietotāja aģenta procesu, lai izveidotu identifikācijas tagus. Tomēr tas nav efektīvs jūsu faktiskajiem lietotājiem. Lietotāju IP adreses pastāvīgi mainās. Lielākie interneta pakalpojumu sniedzēji, piemēram, AOL, tos maina ik pēc dažām minūtēm. Tas radīs milzīgu problēmu. Mainās arī User Agent procesi – IE7 ir atklājis, ka lietotāju aģenti periodiski mainās. Labākais veids, kā aizsargāties pret pārtveršanu, ir izveidot zizļu sistēmu. Šī sistēma katrā ielādes lapā izvada sīkfailu un arī saglabā šo vērtību jūsu mysql sarakstā. Pēc tam sīkfaila vērtība tiek salīdzināta ar MySQL tabulas vērtību. Ja tie atšķiras, sesija būs nederīga.

Šīs ir pamatfunkcijas darbam ar sesijas failiem un sīkfailiem. Protams, lai uzlabotu drošību, ir nepieciešams pievienot vairāk sīkfailu, lai pārbaudītu datu derīgumu. Ar šo aizsardzības līmeni nepietiek, lai aizsargātu sensitīvu informāciju, taču kaut kur ir jāsāk! Un noslēgumā:

Lūdzu, pārliecinieties, vai sīkfailu vērtības ir derīgas.
Nekad neizvadiet sesijas paroli vai sīkfaila mainīgo.

Lai novērstu sesijas fiksāciju, izmantojiet identifikatoru
session_regenerate_id.

Līdz nākamajām nodarbībām!

P.S. Komentārus kodā iztulkos 24 stundu laikā :)

Šodienas apmācībā mēs runāsim par darbu ar sīkfailiem PHP. Sāksim ar to, kas tas ir, kāpēc tas ir vajadzīgs un kāpēc tas vispār parādījās.

Kam tiek izmantoti sīkfaili?

Kā jūs un es jau zinām, PHP mēs varam strādāt ar GET un POST pieprasījumiem. Tie ļauj mums pārsūtīt datus uz serveri, lai kaut kā ietekmētu koda darbību. Mēs varam piešķirt skriptam pieteikumvārdu un paroli, tas tos pārbaudīs un ļaus mums piekļūt jebkurai informācijai. Tomēr tas neļaus izveidot sesiju starp mums un serveri. Tas ir, serveris nevar mūs “atcerēties”, un katru reizi, kad mēs vēlamies teikt, ka tie esam mēs, mums būs jānosūta atsevišķs jauns pieprasījums ar pieteikumvārdu un paroli.

Sīkdatnes tika izgudrotas kā risinājums. Tie ir ieraksti ar atslēgas vērtības tipu, piemēram, PHP masīvs, taču tie tiek glabāti vietnes lietotāja pārlūkprogrammā. Sīkdatnes katrai vietnei tiek glabātas atsevišķi. Katru reizi, kad lietotājs iesniedz pieprasījumu vietnei, pārlūkprogramma pārbauda, ​​vai šai vietnei šie ieraksti pastāv. Un, ja tādi ir, tā nosūta tos katra pieprasījuma galvenē uz šo vietni.

No kurienes nāk cepumi?

Sīkfaili tiek izveidoti pārlūkprogrammā pēc servera “pieprasījuma”. Kādā brīdī mēs nolemjam, ka apmeklētāja pārlūkprogrammā mums ir jāizveido sīkfails ar noteiktu vērtību. Lai to izdarītu, serverim klientam atbildē ir jānosūta īpaša galvene, kas norāda, kāds ieraksts ir jāizveido šīs vietnes pārlūkprogrammā.

Tas viss notiek fonā un lietotājam nav pamanāms. Autorizācija jebkurā tīmekļa vietnē darbojas saskaņā ar šo principu. Vienkāršākajā gadījumā, kad vietnē esat ievadījis savu pieteikumvārdu un paroli, serveris pārbauda, ​​vai tie ir pareizi. Un, ja tā, tad serveris var lūgt pārlūkprogrammai saglabāt šos datus sīkfailā un nosūtīt tos ar katru pieprasījumu.

Tas ir, serveris aptuveni saka: “Ei, pārlūkprogramma, izveido man ierakstu ar atslēgu “login” un vērtību “admin”, un vēl vienu ar atslēgu “password” un vērtību “123”. Pēc tam pārlūkprogramma sāk sūtīt papildu datus, piemēram:

Pieteikšanās: administratora parole: 123

Pēc tam citās vietnes vietās, kur nepieciešama autorizācija, tagad būs iespējams pārbaudīt šos datus no sīkfaila, nepiespiežot lietotāju vēlreiz aizpildīt veidlapu. Un, ja tie ir pareizais pieteikumvārds un parole, dodiet lietotājam piekļuvi kaut kam.

Par dzīves laiku

Tajā pašā laikā sīkfailam ir TTL (Time To Live). Tas nozīmē, ka šie ieraksti var būt īslaicīgi. Šo kalpošanas laiku norāda arī serveris, kad sīkfails ir instalēts pārlūkprogrammā. Pateicoties tam, jūs varat padarīt sesiju ilgstošu pusstundu. Un pēc šī laika lietotājam būs jāpiesakās vēlreiz. Jūs, iespējams, pamanījāt to darbībā daudzās vietnēs.

Kā strādāt ar sīkfailiem PHP

Tātad mums ir pamatzināšanas par sīkfailu darbību. Tagad redzēsim, kā jūs varat strādāt ar tiem PHP.

Izveidosim mūsu projektā failu viewCookies.php. Ieliksim tajā šādu kodu.

Kā jau tev vajadzēja uzminēt, $_COOKIE ir vēl viens globāls masīvs PHP, kas līdzīgs masīviem $_GET Un $_POST. Tikai tajā tiek saglabāti visi sīkfaili, kurus pārlūkprogramma nosūtīja kā daļu no pašreizējā pieprasījuma.

Apskatīsim, kā darbojas šis skripts, pārlūkprogrammā atverot lapu: http://myproject.loc/viewCookies.php

Kā redzam, šis masīvs pašlaik ir tukšs. Aizpildīsim :) Lai to izdarītu, mums pārlūkprogrammā jāinstalē kaut kāds sīkfails. PHP šim nolūkam tiek izmantota funkcija setcookie($name, $value, $ttl, $path)

Nokārtotie parametri:

  • $name — sīkfaila nosaukums
  • $value – tā vērtība
  • $ttl – mūža garumā. Ja norādāt 0, sīkfails tiks instalēts uz visiem laikiem (līdz tas tiks izdzēsts).
  • $path – ceļš adreses joslā. Ja norādāt "/", sīkfaili būs pieejami no visiem vietnes direktorijiem. Piemēram, gan vietnē http://myproject.loc/, gan http://myproject.loc/posts/ . Ja iestatāt "/posts/", sīkfaili būs pieejami tikai no direktorija http://myproject.loc/posts/ un visiem tā apakšdirektorijiem (piemēram, http://myproject.loc/posts/new/). Noklusējuma vērtība ir pašreizējais direktorijs, kurā ir instalēts sīkfails. Ja vēlamies, lai sīkfails būtu pieejams visā vietnē, šī vērtība ir jāiestata uz "/".

Ir vēl vairāki parametri, par tiem varat lasīt oficiālajā dokumentācijā.

Tagad izmēģināsim šo funkciju darbībā. Izveidosim failu setCookies.php un ierakstīsim tajā šādu kodu:

Pēc tam dodieties uz http://myproject.loc/setCookies.php, kur mēs redzēsim tukšu lapu. Kā jau teicām, darbs ar sīkdatnēm lietotājam nav redzams.

Tomēr šo darbu vienmēr var redzēt Google Chrome izstrādātāja konsolē. Atveram to (nospiežot F12), dodamies uz cilni Tīkls, atsvaidzinām lapu pārlūkprogrammā un atrodam to lejupielādēto datu sarakstā (tas tur ir vienīgais).

Noklikšķiniet uz šī ieraksta un labajā pusē atvērtajā logā atlasiet cilni Galvenes. Šeit, sadaļā Atbilžu galvenes, mēs varam redzēt galveni Set-Cookie ar mūsu norādītajiem datiem.

Tādējādi sīkfaili tika veiksmīgi instalēti pārlūkprogrammā. Tagad dosimies uz mūsu lapu, kurā ir redzams $_COOKIE masīvs - http://myproject.loc/viewCookies.php

Kā redzam, pārlūkprogrammā iepriekš instalētās sīkdatnes tagad tiek nosūtītas uz serveri. Tos var redzēt arī pieprasījumā, apskatot izstrādātāja konsoles sadaļu Pieprasījumu galvenes.

Ja jums ir jāredz visi sīkfaili, kas ir pieejami konkrētas vietnes pārlūkprogrammā, varat tos skatīt tajā pašā Google Chrome izstrādātāja konsolē. Lai to izdarītu, atveriet cilni Lietojumprogramma, kreisajā sarakstā atlasiet vienumu Sīkfaili un tajā atrodiet mūsu vietni.

Visi sīkfaili tiks parādīti ērtā sarakstā.

Kas vēl jums jāzina par sīkdatnēm

Un, lai pabeigtu šo nodarbību, mums jāpiebilst, ka sīkfaili tiek iestatīti, izmantojot galveni servera atbildē, izmantojot HTTP. HTTP protokols ir izveidots tā, lai galvenei vienmēr jābūt pirms datiem, nevis citam. Tāpēc pirms izvades ir jāizsauc funkcija setcookie un visas citas PHP funkcijas, kas maina HTTP atbildes galveni.

Vispirms varat iestatīt sīkfailu un pēc tam parādīt tekstu.

Viss izdosies lieliski.

Bet jūs nevarat izdrukāt tekstu (kas ir HTTP atbildes pamatteksts) un pēc tam mēģināt iestatīt sīkfailu.

Kā redzam, tas radīs kļūdu. Šādi darbojas HTTP protokols. Vispirms - virsraksts, pēc tam - ķermenis. Tikai šādā veidā un ne citādi.

Vairāku sīkfailu iestatīšana

Nav nekā vieglāk, kā iestatīt dažus sīkfailus. Lai to izdarītu, jums tikai vairākas reizes jāizsauc funkcija setcookie.

Tie tiks veiksmīgi nodoti klientam.

Nākamajā nodarbībā aplūkosim piemēru pilnai lietotāja mijiedarbībai, izmantojot sīkfailus. Pa to laiku pildīsim mājasdarbus.