Научи ме

Програмиране => PHP => Темата е започната от: infinity1305 в 03 Юни 2011, 21:38:52

Титла: Урок за бисквитки, кога?
Публикувано от: infinity1305 в 03 Юни 2011, 21:38:52
Здравейте,

Причината да съм тук е учителя gatakka. Благодарности, защото после неговите уроци набрах смелост да мигрирам към Ubuntu u вече втора година си перкам с него. В един момент осъзнах, че увлечението ми по сайтостроене не струва без пустото PHP. Купих книги, гледах чуждоезични уроци, но поднесеното от учителя gatakka направи нещата ясни и достъпни. Благодарности 2.

Чудесно, има уроци за сесии, но мисля, че е нужен урок за бисквитки. Това ще изясни тяхното ползване за конкретна задача и ще покаже плюсовете и минусите им. Един вид кога сесия и кога бисквитка.

Нямам права да публикувам нова тема в точния раздел, затова се намирам тук.
В момента слушам Salsa streem. Всички песни от него до края на деня са мои поздрави към екипа.
Титла: Re:Урок за бисквитки, кога?
Публикувано от: echeveria в 03 Юни 2011, 21:40:57
Бре, верно ли няма бе?
Титла: Re:Урок за бисквитки, кога?
Публикувано от: infinity1305 в 03 Юни 2011, 21:49:04
Истина няма и това ме учуди. Навсякъде се показва сесия, дори са посветени два урока на нея, но ни грам за бисквитките. Какво са, как се задават...няма, тъмна Индия.

Извинявам се за редакцията, но наскоро си залях клавиатурата с бира и някои копчета задържат...
Титла: Re:Урок за бисквитки, кога?
Публикувано от: Avalanche в 13 Юни 2011, 21:57:32
Истина няма и това ме учуди. Навсякъде се показва сесия, дори са посветени два урока на нея, но ни грам за бисквитките. Какво са, как се задават...няма, тъмна Индия.

Извинявам се за редакцията, но наскоро си залях клавиатурата с бира и някои копчета задържат...
Няма нищо сложно покрай бисквитките, сигурен съм, че дори и от документацията в php.net за тях може да ти стане напълно ясно какво са и как се ядат.
Понеже нещо не ми се получават видео уроците, може да драсна два-три реда, но само при проявено желание.
Титла: Re:Урок за бисквитки, кога?
Публикувано от: infinity1305 в 26 Юни 2011, 00:16:49
Ами драсни, но нека са повече от два три реда. Например, форума тук ми лепи бисквитка. Нещо, повече, искам да я видя отвътре.

(http://prikachi.com/images/614/3495614G.png)

От тази снимка, кое какво е? Защо толкова много?
Между документация и практическо приложение, за мен има голяма разлика, за това питам.
Колкото повече по въпроса, толкова по-добре за моето образование.
Титла: Re:Урок за бисквитки, кога?
Публикувано от: HD в 26 Юни 2011, 00:38:24
Бисквитките са малки текстови файлове, който се използват от браузърите за съхраняване на някакъв вид потребителска информация.  Разгледай този линк http://php.net/manual/bg/features.cookies.php
Титла: Re:Урок за бисквитки, кога?
Публикувано от: Avalanche в 26 Юни 2011, 02:45:05
Както HD цитира, бисквитките са просто едни файлчета, в които се записва определена информация (стринг). В бисквитките може да сложиш потребителско име, парола, поща, идентификатор, timestamp, каквото ти хрумне, сега вече е друг проблема със сигурността. Както гледам вече виждаш, че дори и човек който си няма понятие от бисквитките може да ги изтрие с едно кликване на мишката.

Трябва да знаеш, че бисквитките се изпращат от браузъра и се съхраняват на твоя компютър и се отварят само и единствено с браузъра, чрез който са били поставени. Мозила си складира бисквитките за нея, екслорера за него! Поради тая причина, бисквитките най-често се използват за разпознаване на даден потребител дали е бил в определен сайт (бутончето remember me). Пише се проверка дали съществува бисквитката, ако да - значи потребителя е бил вече в дадения сайт и може да му се спести писането на име и парола и директно да бъде логнат в системата.



(http://img171.imageshack.us/img171/7656/cookiefi.jpg)

Обърни внимание на ръчичките, които поставих.

Бисквитка в PHP се създава чрез функциите set_cookie, setrawcookie, както и със header функцията; премахва се със unset функцията.
Ще дам пример със set_cookie:
Код: PHP
  1. setcookie($name, $content #value, $expire, $path, $domain, $secure, $httponly);
  2.  

Надявам се, че ясно виждаш какво искам да ти покажа. Сега като знаеш как се поставя бисквитка и като сравниш твоята собствена снимка, мисля че става ясно кое къде отива. Но все пак ще обесня.

Първи параметър - име на бисквитката. С него може да видиш бисквитката чрез $_COOKIE масива, като му зададеш името на бисквиката като ключ - $_COOKIE['my_cookie'];

Втори параметър - стойност. Това е съдържанието на бисквитката, тук слагаш информацията, която ще видиш след отпечаташ на екрана $_COOKIE['my_cookie'];

Трети параметър - живот. Бисквитката не се пази постоянно на компютъра, тя има живот и ти може да го зададеш точно тук. Използва се unix timestamp, демек - към функцията time прибавяш колкото секунди искаш да живее бисквитката.

Четвърти параметър - път. Тук може да ограничиш бисквитката да важи само за определана папка (и нейните подпапки). Примерно nau4i.me/папка/бисквитена_папка - така бисквитката ще е валидна само за бисквитената папка (и папките в нея).

Пети параметър - домейн. Няма нужда от обяснение. Може да си го оставиш празно;

Шести параметър - "сигурност". Приема булева стойност (0 - false / 1 - true). Ако я оставиш на 1, бисквитката ще мине само ако сайта ти използва https (hypertext transfer protocol secure), а не редовното http;

Седми параметър - httponly. Също булева стойност. Aко му дадеш true, бисквитката ще бъде достъпна само чрез http протокол, а няма да бъде достъпен примерно за скриптови езици.



Да кажем, че имаме форма за регистрация и имаме бутон запомни ме.

Код: PHP
  1. if($_POST['fs'] == 1){//пращаме формата
  2.    if($username == $username && $password == $password){//проверки блабла
  3.        //имаме намерен запис в БД, потребителя ще бъде логнат
  4.        setcookie('username', $username, time()+60*60 #1час); //имаме пратена бисквитка
  5.   }
  6. }
  7.  
  8.  
  9. //следващия път като потребителя се логва в системата
  10. if($_COOKIE['username'] == $username){
  11.         //това е човека, направо да влиза
  12.         header('Location: logged.php');
  13.     }
  14. }
  15.  



Написах го в Gatakka стил, сядаш и го мислиш на момента. Надявам се, че вече имаш поне малка представа какво са и как може да използваш бисквитките! 8)
Титла: Re:Урок за бисквитки, кога?
Публикувано от: HD в 26 Юни 2011, 02:53:00
@Avalanche и какво цитирах, че не разбрах?  ???
Титла: Re:Урок за бисквитки, кога?
Публикувано от: Avalanche в 26 Юни 2011, 03:05:13
@Avalanche и какво цитирах, че не разбрах?  ???
Като видях линка към php.net за бисквитките и като прочетох "Бисквитките са малки текстови файлове" и помислих, че си просто копнал текста от там (не съм чел целия коментар). Ама сега като се замисля и там не го пише това, срещал съм го в w3schools (http://www.w3schools.com/php/php_cookies.asp).
Титла: Re:Урок за бисквитки, кога?
Публикувано от: wuser в 26 Юни 2011, 09:45:09
Не помня дали Иван го беше казал в уроците си, но да направя една уговорка към изчерпателния урок на Avalanche, за което му благодарим.

Гледайте да записвате възможно най-малко информация в бисквитките. Оптимално е един индефикатор само. Има поне две големи причини за това. По-малката е в производителността. Много по-бързо ще прочетете една информация от при вас, независимо дали е на ФС или СУБД, от колкото от курабийката. Второто по-важно. Бисквитката е при потребителя и ние нямаме контрол върху нея във всеки един момент. Най-простата пакост, която може да свършие просто да я изтрие. Но да не забравяме, че той може да я манипулира и тогава да не се окажем в тъпото положение на Сони. Никога не трябва да имаме доверие на потребителя. В случая подозрителността е здравословна.

И все пак нещо като съвет. Не бих препоръчвал особено на начинаещи да си играят самоволно с вдиане на курабии. По-читаво ще е ползването на готовите в php функции за сесия. Те решават множество гадни проблемчета, които може да ни се натресат.
Титла: Re:Урок за бисквитки, кога?
Публикувано от: wuser в 26 Юни 2011, 09:48:06
Смятам темата за важна за това я предлагам за залепена. Против има ли?
Титла: Re:Урок за бисквитки, кога?
Публикувано от: infinity1305 в 26 Юни 2011, 20:07:32
Отлично. Отговорът на Avalanche много ме зарадва. Благодаря за отделеното време и внимание, и на включилите се участници.

Позволете да се върна към снимката.
PHPSESSID за мен е име на сесия, дадена от интерпретатора на nau4i.me (справка php.ini на сървъра на nau4i.me). Така си го обяснявам. Но "nau4i.me" го броим 7 пъти. Без една сесия, как да разбирам другите 6 включвания. Едва ли са 6 курабийки или са?

wuser намеква за компроментиране на бисквитка от страна на потребител. Как става това? Аз мога засега да трия бисквитки, защото интерфейса на firefox ми го позволява, но не мога да я извличам. Да речем, влизам от домашния комп тук в форума. Извличам бисквитката, копирам я на флашка и я пренасам на служебния комп. Това на практика постижимо ли е. Firefox 4/5 версия борави с json файл и мисля, че вътре е бисквитката. Къде е златното ключе?

И съзирам леко разминаване с теорията от моите книги. Те учат - пpи нaтоваpени сaйтoве cookie е по-бързо, защото работата по съхранение на информацията става при клиента, а не от сървъра.

С сесия този трик не става, но от друга страна потребителят хлопне ли браузъра, хорото се повежда от начало. Четох, че сесията може да се пренасочи от временен файл на сървъра към база данни и тогава нещата да бъдат сходни като с бисквитка или греша в разсъжденията си.
Титла: Re:Урок за бисквитки, кога?
Публикувано от: wuser в 26 Юни 2011, 20:37:58
Не грешиш, това е препоръчителния вариянт, но за съжаление нямаме урок за вкарване на сесия в база, но все пак има доста по темата в паяжината.

----------
Добавка
----------

За да не съм голословен, ето една връзчица:

http://www.phpclasses.org/search.html?words=session+handler&restrict[0]=C&restrict[1]=B&restrict[2]=D&forums=F&go_search=1&advanced=1

или

http://www.phpclasses.org/search.html?words=session+database&restrict[0]=C&restrict[1]=B&restrict[2]=D&forums=F&go_search=1&advanced=1
Титла: Re:Урок за бисквитки, кога?
Публикувано от: jazzman в 26 Юни 2011, 20:56:55
Ами разбира се, ако аз ти изпратя целият си профил от моят браузър и ти го копираш в своя, ти ще имаш пълен достъп до всички мои акаунти и сайтове които посещавам.
Естествено, има доста начини да се предпазиш, ако ти се задълбава може да почнеш от тук - http://support.mozilla.com/en-US/home ( разбира се, това е валидно за лисицата), но принципа при останалите браузъри е подобен.
Титла: Re:Урок за бисквитки, кога?
Публикувано от: infinity1305 в 09 Декември 2011, 22:09:13
...
Да кажем, че имаме форма за регистрация и имаме бутон запомни ме.

Код: PHP
  1. if($_POST['fs'] == 1){//пращаме формата
  2.    if($username == $username && $password == $password){//проверки блабла
  3.        //имаме намерен запис в БД, потребителя ще бъде логнат
  4.        setcookie('username', $username, time()+60*60 #1час); //имаме пратена бисквитка
  5.   }
  6. }
  7.  
  8.  
  9. //следващия път като потребителя се логва в системата
  10. if($_COOKIE['username'] == $username){
  11.         //това е човека, направо да влиза
  12.         header('Location: logged.php');
  13.     }
  14. }
  15.  
Надявам се, че вече имаш поне малка представа какво са и как може да използваш бисквитките! 8)

ОК, до тук разбрах, но имам нов съществен въпрос, даже разгледах десетки скриптове за логване с $_COOKIE или $_SESSION предоставени в нета.

На въпроса. Преди да вляза в форума тук, аз прочетох бисквитките на nau4i.me. Записах живота им. Влязох директно (без да се налага авторизация) и пак прочетох живота им. Той се удължи напред в времето. Чудесно, но как?

Ти казваш "следващия път като потребителя се логва в системата" -> "това е човека, направо да влиза". Taка и става, иначе трябваше отново да пиша име и парола в формата. Аз влязох направо, но в фонов режим излиза, че логиката сравни бисквитките ми. Опозна ме и им удължи живота. Къде точно става тази врътка. Те това искам да науча, защото на една гола сесия до затваряне на браузъра прилича на аматьорщина.

Мисля си, че влизането ми направо, след съответните проверки, скриптът е презаписал живота на бисквитки. Така ли е ?
Титла: Re: Урок за бисквитки, кога?
Публикувано от: jazzman в 09 Декември 2011, 23:59:21
@infinity1305 В началото бях решил да пиша собствено мнение по темата, но после се сетих че ти си ОК с английския и намерих този линк от някакъв форум, мода там добре описва самият процес на сетване на бисквитките в php - http://www.zubrag.com/forum/index.php?topic=58.0
Ще си позволя да ти дам приятелска препоръка. Недей задълбава много надълбоко в теорията, тя трябва да върви успоредно с практиката. В противен случай след време ще се стовари с пълна сила в/у главата ти и ще се окажеш в ситуацията на wuser ( да ме прощава за него се сетих, той ми е френд и ще потвърди ), да знаеш много (теория) от различни сфери в програмирането, а като се захванеш да правиш нещо, наглед елементарно дори, ще бъдеш неспособна да вземеш решение от къде да го почнеш и как да го свършиш  ;)
Титла: Re: Урок за бисквитки, кога?
Публикувано от: HanKrum в 10 Декември 2011, 00:06:00
Или като мен, с много практика а кух като бас-барабан :) !
Титла: Re: Урок за бисквитки, кога?
Публикувано от: jazzman в 10 Декември 2011, 00:12:41
A, чакай малко сега, никой не може да ме убеди, че ще почне да програмира без да знае теория, обаче обратното е възможно  ;)
Титла: Re: Урок за бисквитки, кога?
Публикувано от: infinity1305 в 10 Декември 2011, 09:56:33
...
 намерих този линк от някакъв форум, мода там добре описва самият процес на сетване на бисквитките в php - http://www.zubrag.com/forum/index.php?topic=58.0
...
Прочетох и смея да твърдя, че съм наясно с механизма. Откакто пиша тук се чопля с бисквитките и на локалната ми машина разледах редица примери. Не получих отговор обаче от предния ми коментар. Кое удължава живота на бисквитката с всяко ново влизане? И толкова ли е трудно да бръкнете в торбата с хитрини и да извадите вашите скриптове, които ползвате. Почвам да си мисля, че не ползвате бисквитки или пазите скрипта в дълбок секрет. Егоисти! Ще се наложи да открия топлата вода. Рано или късно, заклевам се....

П.П.
А кой е бас китара и кой тарамбука...има фацебоок, там лигните...
Титла: Re: Урок за бисквитки, кога?
Публикувано от: Avalanche в 10 Декември 2011, 10:45:35
Просто бисквитката се презаписва, така един вид се "налива" живот в нея. Прикачвам ти файла с login функциите, които форумът използва. Ако не си забелязала отдолу има линк и от там може да си свалиш абсолютно същия форум и да си го инсталираш на твоя компютър. Няма нищо скрито-покрито. :)

п.п.
Нещо не мога да прикачвам файлове, ето направо линк към въпросния файл: http://pastebin.com/ZXu6DB7a
Титла: Re: Урок за бисквитки, кога?
Публикувано от: infinity1305 в 10 Декември 2011, 12:24:57
OK, благодаря за линка. Добавих го в букмаркса и обещавам да го разуча.

Позволи да те върна към моите терзания.Как става технически презписването на бисквитката в $_COOKIE? Проверява се за съществуване и ако има такава, директно се презаписва времето или първо се убива и после се презаписва?  Този момент ми убягва, защото при бисвкитките нещата влизат в сила след рефреш на браузъра.
Титла: Re: Урок за бисквитки, кога?
Публикувано от: Stan в 10 Декември 2011, 13:35:56
Мисля,че ти си отговори сама.Доколкото разбирам искаш да знаеш как става механизма в сайтове при които ако нямаш активност примерно 10мин те изкарва от профила , а ако рефрешнеш страницата преди да са изтекли те държи логната още 10мин ? Всъщност незнам каква е логиката, но първото нещо за което се сещам е това:

Код: PHP
  1. if(isset($_COOKIE['log']) and $_COOKIE['log']=='true')
  2. {
  3.       unset($_COOKIE['log']);//трием бисквитката  
  4.       setcookie('log','true', time()+600);//слагаме същата с нови 10мин
  5. }
  6. else
  7. {
  8.     //ако я няма(или е свършил живота или се логваме за пръв път) отиваме към формата за вход от където,ако се логнем правилно ще получим нова бисквитка с 10мин живот
  9. }
  10.  
Титла: Re: Урок за бисквитки, кога?
Публикувано от: infinity1305 в 10 Декември 2011, 14:22:31
Aaa! Ето откъде изтича вода през джапанката ми, кога съм в банята! Ще ги изкъртя сега!
Имах догатки, не смеех да мисля, че unset($_COOKIE) е правилен запис. Това ми трябваше. Раздавам зелени точки на всички и си запазвам правото при нови подводни камъни, да излея самосвала с въпроси.
Титла: Re: Урок за бисквитки, кога?
Публикувано от: Stan в 12 Декември 2011, 15:49:42
Всъщност въпреки, че $_COOKIE  е глобален масив като $_SESSION,$_POST,$_GET той е малко по-специален и функцията unset() няма да изтрие самата бисквитка, за което подвеждане се извинявам!!По-горе кода, който съм дал ще направи същото нещо което казах, но просто ще презапише бисквитката.За да изтрием самата бисквитка трябва да създадем същата само, че с "изтекъл срок на годност".

Код: PHP
  1. setcookie('log','true', time()-600);
  2.  
Титла: Re: Урок за бисквитки, кога?
Публикувано от: HanKrum в 12 Декември 2011, 15:59:09
Или със трайност 1 сек.
Код: PHP
  1. <?php
  2. include 'load.php';
  3. $bd = new BazaDanni();
  4. $bd->prati_zaqvka('UPDATE users SET
  5.            users_active=0,
  6.            user_time="' . time() . '",
  7.            user_ip="' . $_SESSION['user_ip'] . '" WHERE user_id="' . $_SESSION['user_id'] . '";');
  8. setcookie('name', '', 1);
  9. setcookie('pass', '', 1);
  10. header('Location: index.php');
  11.  
Титла: Re: Урок за бисквитки, кога?
Публикувано от: streleca_stz в 03 Юли 2013, 10:43:29
Здравейтее! Предарително се извинявам ако нарушавам някое правило във форума, че съживявам тази стара тема, но реших, че не е нужно да правя нова. Все пак въпросът ми е свързан с бисквитките. :)

Понеже сте говорили за проблема със сигурността се замислих за един вариант, който може и да сработи (давам пример със система за профили):
- при влизане в профила се създава бисквитка, която просто да съдържа id на потребителското име ($_COOKIE['logged']="n";);
- след това ти извлича данните от БД и ги записва в сесия;
- ако сме ѝ задали живот по-дълъг от час (например 1 седмица) да се проверява дали има я има създадена тази бисквитка и ако я има пак да изтегля информацията от БД и да я записва в нова сесия (нали старата ще се унищожила);
- и разбира се ако излезе от профила си да се унищожава бисквитката (както дадохте пример да се презапише с живот от 1 секунда)

Цялото това нещо си го мисля с цел ограничен достъпа до данните на потребителя от трето лице (или нарочно от потребителя) + по-голямо бързодействие на системата (да не се правят постоянно заявки за извличане на профилните данни). По този начин хем имаме бисквитка за проверка, хем имаме и сесия, която държи данните и се унищожава (и създава при ново влизане) в уеб сайта.
Вие как мислите? Така логиката добра ли е или има някъде пукнатини, защото обмислям да използвам този начин в сайта ми? :)