Cookies, document.cookie

Как прочитать\получить куку php?

То, что в браузере отображается кука, это хорошо, но мы ведь ее создаем, чтобы впоследствии использовать в наших скриптах. Так как же получить куку? Для этого существует глобальный массив кук $_COOKIE, в котором находятся вообще все созданные куки. Обратиться к ним легко — достаточно знать имя.

Попробуем прочитать содержимое нашей куки wpguru. Для этого напишем простенький скриптик:

1
2
3
4
5
6

if(isset($_COOKIE’wpguru’)){

echo’Кука wpguru существует, и в ней лежит значение: ‘.$_COOKIE’wpguru’;

}

else{

echo’Кука wpguru не задана’;

}

И глянем, что вывелось на экран:

Как видите, все прекрасно работает. Вот так можно с легкостью проверить, существует ли нужная кука, и если да, то взять ее значение.

Рекомендую всегда делать проверку на существования необходимых переменных, массивов, и тд. Так Вы избежите обидных ошибок в будущем.

ディレクティブ

クッキーは名前と値の組で始まります。
  • は任意の US-ASCII 文字の集合で、制御文字、空白、タブを除いたものです。 のような区切り文字も含めることができません。
  • は任意で二重引用符で囲むことができ、制御文字、ホワイトスペース、二重引用符、カンマ、セミコロン、バックスラッシュを除くすべての US-ASCII 文字が利用できます。 エンコーディング: 多くの実装ではクッキーの値に URL エンコーディングを施しますが、 RFC の仕様書では要求されていません。これは <cookie-value> に許可された文字についての要件を満足させるのに役立ちます。
  • の接頭辞: (接頭辞にダッシュを含む) で始まるクッキー名は、 フラグを設定することが必要で、安全なページ (HTTPS) でなければなりません。
  • の接頭辞: で始まるクッキー名は、 フラグを設定し、安全なページ (HTTPS) から読み込む必要があり、ドメインを指定することができず (従ってサブドメインにも送られません)、パスが で終わる必要があります。
Optional

クッキーの有効期限で、 HTTP の日時タイムスタンプです。詳細な書式は を参照してください。

指定されなかった場合は、クッキーはセッションクッキーの寿命になります。セッションはクライアントが終了したときに終了するので、セッションクッキーはその時点で削除されます。

警告: 多くのウェブブラウザーはセッション復元と呼ばれる機能を持っており、これによってすべてのタブを保存し、次回ブラウザーを起動したときに復元することができます。ブラウザーを実際には閉じていないかのように、セッションクッキーも復元されます。

有効期限が設定されていた場合、期限はサーバーではなく、クッキーが設定されているクライアントからの相対時刻で設定されます。

Optional
クッキーの期限までの秒数です。ゼロまたは負の数値の場合は、クッキーは直ちに期限切れになります。 および の両方が設定されていたら、 が優先されます。
Optional
クッキーを送信する先のホストです。
  • 指定されなかった場合は、既定で現在の文書の URL におけるホスト名の部分になり、サブドメインを含みません。
  • 初期の仕様書とは逆に、ドメイン名の前のドット () は無視されます。
  • 複数のホストやドメインの値を指定することはできませんが、ドメインが指定された場合、すべてのサブドメインが常に含まれます。
Optional
リクエストの URL に含まれるべきパスです。含まれていないと、ブラウザーは ヘッダーを送信しません。
スラッシュ («/») の文字はディレクトリ区切りとして解釈され、サブディレクトリも同様に一致します (例えば であれば、 , , はすべて一致します)。
Optional
セキュアクッキーは、リクエストが SSL と HTTPS プロトコルを使用して行われた場合にのみサーバーに送信されます。ただし HTTP クッキーは、例えば情報が暗号化されないなど、安全ではない仕組みを継承しているので、機密な情報や敏感な情報を転送したり格納したりしないようにしてください。

メモ: 安全ではないサイト () は   ディレクティブを付けてクッキーを設定することができなくなりました (Chrome 52 以降および Firefox 52 以降の新機能).

Optional
JavaScript が プロパティなどを介してこのクッキーにアクセスすることを禁止します。HttpOnly で作成されたクッキーは、JavaScript で開始されたリクエスト、例えば、 や  と共に送信されます。これにより、クロスサイトスクリプティング (XSS) の攻撃を軽減します。
Optional
  • : ブラウザは same-site のリクエスト(つまり、クッキーを設定したのと同じサイトから発信されたリクエスト)に対してのみクッキーを送信します。リクエストが現在のURLとは異なるURLから発生した場合、 属性を持つクッキーは送信されません。
  • : 画像やフレームをロードするための呼び出しなどのクロスサイトサブリクエストではクッキーが抑止されますが、ユーザーがリンクをクリックするなどして外部サイトからURLに移動すると送信されます。
  • : ブラウザはクロスサイトと same-site の両方のリクエストでクッキーを送信します。

クッキーがオリジン間リクエストで送信されないことを主張することで、クロスサイトリクエストフォージェリ攻撃 (CSRF) に対していくらか防御することができます。

ブラウザーは クッキーに の既定値を持たせるよう移行しつつあります。オリジンをまたいでクッキーを送信する必要がある場合、 ディレクティブを用いて SameSite の制約を外してください。 ディレクティブは 属性を必要とします。

Diretivas

Um cookie começa com um par nome-valor:
  • Um pode ser qualquer caractere US-ASCII exeto caracteres de controle (CTLs), espaços, ou tabulações (TAB). Também não deve conter um separador de caractere como os seguintes: ( ) < > @ , ; : \ » /  ? = { }.
  • Um pode opcionalmente ser atribuido entre aspas duplas e qualquer caractere US-ASCII são permitidos, exceto caracteres de controle (CTLs), espaços em branco, aspas duplas, vírgula, barra invertida e ponto e vírgula. Codificação: Muitas implementações realizam  codificação URL nos valores de cookie, contudo não é obrigatório pela especificação do RFC. Isso ajuda a satisfazer os requisitos sobre quais caracteres são permitidos para <valor-cookie>.
  • : Cookies com o nome começando com (hífen faz parte do prefixo) precisam ser atribuidos com a flag de segurança e precisam ser de uma página segura (HTTPS).
  • : Cookies com o nome começando com (hífen faz parte do prefixoprecisam ser atribuidos com a flag de segurança, precisam ser de uma página segura (HTTPS), não precisam ter um domínio especificado (portanto não são enviados para subdomínios) e o caminho (path) precisa ser «/».
Expires=<data> Optional
O tempo de vida máximo do cookie como uma marcação de tempo (timestamp) HTTP. Veja para a formatação detalhada. Se não especificado, o cookie terá o tempo de vida de uma sessão de cookie. Uma sessão é finalizada quando o cliente é desligado, significando que as sessões de cookies serão removidos nesse momento. Contudo, muitos navegadores web têm uma característica denominada de «restaurar sessão» que salvará todas suas abas e as trará de volta na próxima vez em que você utilizar o navegador. Os cookies estarão também presentes e será como se o navegador nunca tivesse sido fechado.

Quando uma data de expiração é atribuída, o tempo e a data são relativos ao cliente em que os cookies estão sendo configurados e não ao servidor.

Max-Age=<digito-diferente-de-0> Optional
Número de segundos até o cookie expirar. Um ou mais digitos de 1 a 9. Navegadores antigos (ie6, ie7 e ie8) não suportam Max-Age. Para cada navegador, se ambos (Expires e Max-Age) forem atribuídos, Max-Age terá precedência.
Domain=<valor-domínio> Optional
Especifica os hosts aos quais o cookie será enviado.
  • Se não for especificado, será usado o host do URL do documento atual, não incluindo subdomínios.
  • Ao contrário das especificações anteriores, pontos de prefixo em nomes de domínio () são ignorados.
  • Se um domínio for especificado, subdomínios estarão sempre incluídos.
Path=<valor-caminho> Optional
Indica um caminho (path) de URL que necessita existir no recurso solicitado antes de enviar o cabeçalho de Cookie. O caractere %x2F («/») é interpretado como um separador de diretório e os sub-diretórios serão também correspondidos (por exemplo: Path=/docs, «/docs», «/docs/Web», ou «/docs/Web/HTTP» serão todos correspondidos).
Secure Optional
Um cookie seguro apenas será enviado para o servidor quando uma requisição utilizando os protocol SSL e HTTPS for realizada. No entanto, informações confidenciais ou sensíveis não deverão ser armazenadas ou transmitidas em Cookies HTTP pois todo o mecanismo é inerentemente inseguro e isso não significa, por exemplo que qualquer informação é criptografada.

Nota: Sites inseguros ()  não podem mais atribuir cookies com a diretiva «secure» (novo em Chrome 52+ firefox Firefox 52+).

HttpOnly Optional
Cookies HttpOnly não são acessíveis via JavaScript através da propriedade , as API’s e são utilizadas para aliviar ataques de cross-site scripting (XSS).
SameSite=Strict
SameSite=Lax Optional 
Permite que servidores garantam que um cookie não deve ser enviado juntamente com solicitações de sites cruzados (cross-site) , o que fornece novamente alguma proteção aos ataques de falsificação de solicitação entre sites (CSRF)  (CSRF) .

Syntaxe

Set-Cookie: <cookie-name>=<cookie-value>
Set-Cookie: <cookie-name>=<cookie-value>; Expires=<date>
Set-Cookie: <cookie-name>=<cookie-value>; Max-Age=<non-zero-digit>
Set-Cookie: <cookie-name>=<cookie-value>; Domain=<domain-value>
Set-Cookie: <cookie-name>=<cookie-value>; Path=<path-value>
Set-Cookie: <cookie-name>=<cookie-value>; Secure
Set-Cookie: <cookie-name>=<cookie-value>; HttpOnly

Set-Cookie: <cookie-name>=<cookie-value>; SameSite=Strict
Set-Cookie: <cookie-name>=<cookie-value>; SameSite=Lax
Set-Cookie: <cookie-name>=<cookie-value>; SameSite=None

// Plusieurs directives sont aussi pussibles, par exemple:
Set-Cookie: <cookie-name>=<cookie-value>; Domain=<domain-value>; Secure; HttpOnly

Example:

RewriteEngine on
RewriteBase "/"
RewriteCond "%{HTTP_HOST}"       "^example\.org$" 
RewriteRule "^(.*)"              "https://www.example.org/index.html" 
RewriteRule "^(.*)\.ht$"         "index.php?nav=$1 [NC,L,QSA,CO=RewriteRule;01;https://www.example.org;30/;SameSite=None;Secure]
RewriteRule "^(.*)\.htm$"        "index.php?nav=$1 [NC,L,QSA,CO=RewriteRule;02;https://www.example.org;30/;SameSite=None;Secure]
RewriteRule "^(.*)\.html$"       "index.php?nav=$1 [NC,L,QSA,CO=RewriteRule;03;https://www.example.org;30/;SameSite=None;Secure]

RewriteRule "^admin/(.*)\.html$" "admin/index.php?nav=$1 [NC,L,QSA,CO=RewriteRule;09;https://www.example.org:30/;SameSite=Strict;Secure]

Writing to document.cookie

We can write to . But it’s not a data property, it’s an accessor (getter/setter). An assignment to it is treated specially.

A write operation to updates only cookies mentioned in it, but doesn’t touch other cookies.

For instance, this call sets a cookie with the name and value :

If you run it, then probably you’ll see multiple cookies. That’s because the operation does not overwrite all cookies. It only sets the mentioned cookie .

Technically, name and value can have any characters. To keep the valid formatting, they should be escaped using a built-in function:

Limitations

There are few limitations:

  • The pair, after , should not exceed 4KB. So we can’t store anything huge in a cookie.
  • The total number of cookies per domain is limited to around 20+, the exact limit depends on the browser.

Cookies have several options, many of them are important and should be set.

The options are listed after , delimited by , like this:

Sintaxis

Set-Cookie: <cookie-name>=<cookie-value>
Set-Cookie: <cookie-name>=<cookie-value>; Expires=<date>
Set-Cookie: <cookie-name>=<cookie-value>; Max-Age=<non-zero-digit>
Set-Cookie: <cookie-name>=<cookie-value>; Domain=<domain-value>
Set-Cookie: <cookie-name>=<cookie-value>; Path=<path-value>
Set-Cookie: <cookie-name>=<cookie-value>; Secure
Set-Cookie: <cookie-name>=<cookie-value>; HttpOnly

Set-Cookie: <cookie-name>=<cookie-value>; SameSite=Strict
Set-Cookie: <cookie-name>=<cookie-value>; SameSite=Lax
Set-Cookie: <cookie-name>=<cookie-value>; SameSite=None

// Es posible usar múltiples directivas, por ejemplo:
Set-Cookie: <cookie-name>=<cookie-value>; Domain=<domain-value>; Secure; HttpOnly

Что такое Cookie?

Куки очень полезны для хранения информации непосредственно в самом браузере пользователя. Это простой текстовый файл , который хранит максимум 4кб данных .

Куки создаются с помощью браузера по запросу сервера (в соответствии с логикой программы). После того, как печенье создается на стороне пользователя, его браузер отправляет эту информацию(из куки) обратно на сервер с помощью HTTP — заголовка.

Зачастую в куках хранятся логины, пароли и прочее. Например вы заходите на сайт, вводите свой логин и пароль. Сайт автоматом создаёт у вас куки с этими данными. И при следующем посещении сайта, он просто проверяет наличие кук, и подгружает данные сохранённого в них пользователя.

Работа с cookie из JavaScript

Куки можно создавать через JavaScript при помощи свойства . Если флаг не установлен, то и доступ к существующим cookies можно получить через JavaScript.

// получить cookie
console.log(document.cookie);
PHPSESSID=m2iut9i59p73ld1c5q9j49c6t0; visitor=0d3749f09d222bea3b8f163937eb9bf1; lastvisit=1538919655
// установить cookie
document.cookie = "some_name=some_value";
console.log(document.cookie);
PHPSESSID=m2iut9i59p73ld1c5q9j49c6t0; visitor=0d3749f09d222bea3b8f163937eb9bf1; lastvisit=1538919655; some_name=some_value

Функция getCookie()

Следующая функция возвращает cookie с именем :

// возвращает cookie с именем name, если есть, если нет, то undefined
function getCookie(name) {
    var matches = document.cookie.match(
        new RegExp("(?:^|; )" + name.replace(/(\\\/\+^])/g, '\\$1') + "=(*)")
    );
    return matches ? decodeURIComponent(matches1)  undefined;
}

Функция setCookie()

function setCookie(name, value, options) {
    options = options || {};

    var expires = options.expires;

    if (typeof expires == "number" && expires) {
        var d = new Date();
        d.setTime(d.getTime() + expires * 1000);
        expires = options.expires = d;
    }
    if (expires && expires.toUTCString) {
        options.expires = expires.toUTCString();
    }

    value = encodeURIComponent(value);

    var updatedCookie = name + "=" + value;

    for (var propName in options) {
        updatedCookie += "; " + propName;
        var propValue = optionspropName;
        if (propValue !== true) {
            updatedCookie += "=" + propValue;
        }
    }

    document.cookie = updatedCookie;
}

Как задать Cookie теория подробно

Теперь, к выше изложенной короткой теории о Cookie, добавим все необходимое, чтобы можно было скопировать данный кодд и пользоваться!

И хочу, прямо здесь и сейчас написать готовый скрипт создания кук! И чтобы он прямо здесь вживую показал принцип работы создания Cookie !

Возьмем форму для создания Cookie :

<form method=»post» action=»#form»>

<input type=»checkbox» name=»test_2″> запомнить меня

<input type=»submit» name=»submit» value=»отправить»>

</form>

Первая часть скрипта:

if($_POST) //строка 1

{

    if (!$_COOKIE)//строка 3

    {

    @SetCookie( ‘test_2’ , ‘test_2_значение’ ,time()+(5*60), «/», $_SERVER , 0) ; //строка 5

    header(«Refresh: 0»);//строка 6

    //header(«Refresh: 0; url=#form»);

    exit;

    }

    else

    {

    $is_cookie = ‘Куки уже существуют! Их нельзя установить заново! Хотя их можно перезаписать, но у нас сегодня стоит задача только установить куки!’ ; //строка 11

    }

}

Расшифровка:1).$_POST2).if (!$_COOKIE)SetCookie3).

Расшифруем строку 5:

@SetCookie( ‘test_2’ , ‘test_2_значение’ ,time()+(5*60), «/», $_SERVER , 0) ;
1).@2).test_23).test_2_значение4).time()+(5*60)5).»/»куки на весь сайт6).$_SERVERdwweb.ru7).header(«Refresh: 0»);

Первой перезагрузкой Cookie только устанавливаются, а увидеть их можно только после второй перезагрузки… , за что и отвечает строка 6

Здесь обращаю ваше вниманиеheader(«Refresh: 0; url=#form»);

Здесь, в данном скрипте, первое условие не обязательно! Но мы же хотим показать живой скрипт, как он в принципе должен работать!

if(!$is_cookie)$is_cookie

Но если COOKIE не существуют, то они установятся(строка 5), и переменная $is_cookie(строка 11) не будет существовать и уже данные в этой переменной будут выведены на экран!

if(!$is_cookie)

{

    if(@$_COOKIE )

    {

    $is_cookie = ‘Куки благополучно созданы : ‘.$_COOKIE ;

    }

    else

    {

    $is_cookie = ‘Cookie еще не установлены! Нажмите отправить и здесь увидите результат! Либо были удалены на <a href=»https://dwweb.ru/page/php/072_kak_udalit_cookie_brauzera.html#delit_test_2_Cookie» target=»_blank»>странице </a>’;

    }

}

Как задать Cookie теория кратко:

Чтобы задать Cookie, нужно иметь саму форму для отправки данных, в форме должен быть тег input с типом checkbox, рядом с которым чаще всего пишут запомнить меня , после нажатия котрого будет понятно, что человек хочет, чтобы Cookie были установлены!

Код формы для отправки согласия на установку Cookie:

<form method=»post» action=»»>

<input type=»checkbox» name=»test_2″> запомнить меня

<input type=»submit» name=»submit» value=»submit»>

</form>

Форма для отправки согласия на установку Cookie:

Теперь нам нужен код, который проверит нажат ли чекбокс или радиоточка…

if($_POST) { echo ‘ПРИВЕТ МИР!’; } //в фигурных скобках действие…

SetCookie if($_POST) { SetCookie («test_2″,»Value»,time()+60); }

Создаем условие, по которому будем проверять, установлена ли кука, или нет:

if(@$_COOKIE ){ echo ‘COOKIE благополучно созданы : ‘.$_COOKIE ;}else{ echo ‘Cookie еще не установлены! Нажмите отправить и здесь увидите результат!’}

Не забываем, что для получения данных из кук требуется вторая перезагрузка — разберем подробнее в пункте Как задать Cookie теория подробно:

httpOnly

This option has nothing to do with JavaScript, but we have to mention it for completeness.

The web-server uses the header to set a cookie. Also, it may set the option.

This option forbids any JavaScript access to the cookie. We can’t see such a cookie or manipulate it using .

That’s used as a precaution measure, to protect from certain attacks when a hacker injects his own JavaScript code into a page and waits for a user to visit that page. That shouldn’t be possible at all, hackers should not be able to inject their code into our site, but there may be bugs that let them do it.

Normally, if such a thing happens, and a user visits a web-page with hacker’s JavaScript code, then that code executes and gains access to with user cookies containing authentication information. That’s bad.

But if a cookie is , then doesn’t see it, so it is protected.

Анатомия Cookie

Файлы cookie обычно устанавливаются в HTTP-заголовке (хотя JavaScript также может устанавливать cookie непосредственно в браузере). PHP-скрипт, который устанавливает cookie, может отправлять заголовки, которые выглядят примерно так:

Как вы можете видеть, заголовок Set-Cookie содержит пару значений имени, дату GMT, путь и домен. Имя и значение будут закодированы в URL. Поле expires — это инструкция для браузера, чтобы «забыть» cookie по истечении заданного времени и даты.

Если браузер настроен для хранения файлов cookie, он будет хранить эту информацию до истечения срока действия. Если пользователь указывает браузер на любую страницу, которая соответствует пути и домену файла cookie, он отправит cookie на сервер. Заголовки браузера могут выглядеть примерно так:

Тогда скрипт PHP будет иметь доступ к файлу cookie в переменных окружения $_COOKIE или $HTTP_COOKIE_VARS[], который содержит все имена и значения файлов cookie. Выше cookie можно получить, используя .

Setting Cookies with PHP

PHP provided setcookie() function to set a cookie. This function requires upto six arguments and should be called before <html> tag. For each cookie this function has to be called separately.

setcookie(name, value, expire, path, domain, security);

Here is the detail of all the arguments −

  • Name − This sets the name of the cookie and is stored in an environment variable called HTTP_COOKIE_VARS. This variable is used while accessing cookies.

  • Value − This sets the value of the named variable and is the content that you actually want to store.

  • Expiry − This specify a future time in seconds since 00:00:00 GMT on 1st Jan 1970. After this time cookie will become inaccessible. If this parameter is not set then cookie will automatically expire when the Web Browser is closed.

  • Path − This specifies the directories for which the cookie is valid. A single forward slash character permits the cookie to be valid for all directories.

  • Domain − This can be used to specify the domain name in very large domains and must contain at least two periods to be valid. All cookies are only valid for the host and domain which created them.

  • Security − This can be set to 1 to specify that the cookie should only be sent by secure transmission using HTTPS otherwise set to 0 which mean cookie can be sent by regular HTTP.

Following example will create two cookies name and age these cookies will be expired after one hour.

<?php
   setcookie("name", "John Watkin", time()+3600, "/","", 0);
   setcookie("age", "36", time()+3600, "/", "",  0);
?>
<html>
   
   <head>
      <title>Setting Cookies with PHP</title>
   </head>
   
   <body>
      <?php echo "Set Cookies"?>
   </body>
   
</html>

Cookies

Cookies (в дальнейшем просто «куки») — небольшие фрагменты данных, которые веб-сервер отправляет браузеру.
Браузер сохраняет их у себя, а при следующем посещении веб-страницы отправляет обратно. Благодаря этому, веб-сервер сможет узнать своего «старого» посетитеиля, идентифицировать его.

С технической стороны, куки — это обычные HTTP заголовки.
Когда веб-сервер хочет записать куку в браузер пользователя, он отсылает специальный заголовок ответа с названием . В этом заголовке должна содержаться необходимая информация и дополнительные аттрибуты, о которых пойдёт речь далее.
В следующий раз, когда браузер пользователя запросит веб-страницу с того же сайта, в числе прочих заголовков он передаст заголовок запроса . Веб-сервер получит эту информацию, и она будет доступна также и для PHP.

Как установить куки: функция setcookie

Являясь серверным языком программирования, PHP может управлять заголовками, которые отправляет сервер, а значит может устанавливать и читать куки.
Чтобы добавить новую куку, необходимо вначале определиться со следующими критериями:

  • Название этой куки (может состоять только из символов латинского алфавита и цифр);
  • Значение, которое предполагается хранить;
  • Срок жизни куки — это обязательное условие.

За установку куки в PHP отвечает функция , ей нужно передать как минимум три параметра, описанных выше. Пример:

Обратите внимание, что срок жизни указывается в относительной величине. В этом примере кука будет существовать ровно 30 дней с момента установки

Как прочитать куки

В PHP максимально упрощён процесс чтения информации из кукисов. Все переданные сервером куки становятся автоматически доступны в специальном глобальном массиве
Так, чтобы получить содержимое куки с именем «visit_count», достаточно обратиться к одноимённому элементу массива , например вот так:

Обратите внимание: установив в сценарии куку через , прочитать её можно будет только при следующем посещении страницы

Собираем всё вместе

Теперь, научившись устанавливать и читать куки, напишем полноценный сценарий, который будет считать и выводить количество посещений страницы пользователем:

示例

会话期 cookies 将会在客户端关闭时被移除。 会话期 cookie 不设置 Expires 或 Max-Age 指令。注意浏览器通常支持会话恢复功能。

Set-Cookie: sessionid=38afes7a8; HttpOnly; Path=/

持久化 Cookie 不会在客户端关闭时失效,而是在特定的日期(Expires)或者经过一段特定的时间之后(Max-Age)才会失效。

Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT; Secure; HttpOnly

属于特定域的 cookie,假如域名不能涵盖原始服务器的域名,那么。下面这个 cookie 假如是被域名为 originalcompany.com 的服务器设置的,那么将会遭到用户代理的拒绝:

Set-Cookie: qwerty=219ffwef9w0f; Domain=somecompany.co.uk; Path=/; Expires=Wed, 30 Aug 2019 00:00:00 GMT

名称中包含 __Secure- 或 __Host- 前缀的 cookie,只可以应用在使用了安全连接(HTTPS)的域中,需要同时设置 secure 指令。另外,假如 cookie 以 __Host- 为前缀,那么 path 属性的值必须为 «/» (表示整个站点),且不能含有 domain 属性。对于不支持 cookie 前缀的客户端,无法保证这些附加的条件成立,所以 cookie 总是被接受的。

// 当响应来自于一个安全域(HTTPS)的时候,二者都可以被客户端接受
Set-Cookie: __Secure-ID=123; Secure; Domain=example.com
Set-Cookie: __Host-ID=123; Secure; Path=/

// 缺少 Secure 指令,会被拒绝
Set-Cookie: __Secure-id=1

// 缺少 Path=/ 指令,会被拒绝
Set-Cookie: __Host-id=1; Secure

// 由于设置了 domain 属性,会被拒绝
Set-Cookie: __Host-id=1; Secure; Path=/; domain=example.com

Настройка файлов cookie с PHP

PHP предоставил функцию setcookie() для установки файла cookie. Эта функция требует до шести аргументов и должна быть вызвана до тега html. Для каждого файла cookie эту функцию нужно вызывать отдельно.

Вот деталь всех аргументов —

  • Name — Это задает имя куки и хранится в переменной окружения называется HTTP_COOKIE_VARS. Эта переменная используется при доступе к файлам cookie.
  • Value — Это устанавливает значение указанной переменной и содержание , что вы на самом деле хотите сохранить.
  • Expiry — это определение будущего времени в секундах с 00:00:00 по Гринвичу 1 января 1970 года. По истечении этого времени cookie станет недоступным. Если этот параметр не установлен, cookie автоматически истекает, когда веб-браузер закрыт.
  • Path — Это определяет каталоги , для которых куки. Один символ прямой косой черты позволяет cookie быть действительным для всех каталогов.
  • Domain — Это может использоваться , чтобы указать имя домена в очень больших областях и должны содержать , по крайней мере , два периода , чтобы быть действительным. Все файлы cookie действительны только для хоста и домена, которые их создали.
  • Security — Это может быть установлено в 1, чтобы указать, что файл cookie должен быть отправлен только защищенной передачей с использованием HTTPS, в противном случае это значение равно 0, что означает, что cookie может быть отправлен посредством обычного HTTP.

В следующем примере будет создано два имени cookie и возраст, с которых эти файлы cookie истекут через час.

<?php
   setcookie("name", "John Watkin", time()+3600, "/","", 0);
   setcookie("age", "36", time()+3600, "/", "",  0);
?>
<html>
   <head>
      <title>Setting Cookies with PHP</title>
   </head>
   <body>
      <?php echo "Set Cookies"?>
   </body>
</html>

Особенности работы протокола HTTP

Как вы узнали из прошлой главы, работа с веб-сайтами в интернете происходит по протоколу HTTP.
Это замечательный и простой протокол, который действует по схеме «запрос-ответ». То есть клиент (браузер) пользователя посылает на сервер запрос, состоящий, как правило, только из заголовков, а затем получает ответ в виде заголовков ответа и тела самого документа.
В отличие от многих других протоколов, HTTP не сохраняет своего состояния. Это означает отсутствие сохранения промежуточного состояния между парами «запрос-ответ».
Иными словами, сервер не «запоминает» клиентов; каждый запрос он обрабатывает с «чистого листа».

Для сервера нет никакой разницы: запросил один пользователь страницу десять раз или десять разных пользователей по разу. Для него все запросы одинаковые.

К счастью, протокол HTTP, а также все браузеры предоставляют возможность сохранения информации о пользователе.

Сессионные, постоянные и безопасные cookie

Сессионные cookie, установка которых выглядит так:

Set-Cookie: lastvisit=1538919655

удаляются при закрытии клиента, то есть существуют только на протяжении текущего сеанса, поскольку атрибуты или для них не задаются.

Постоянные cookie удаляются не с закрытием клиента, а при наступлении определенной даты (атрибут ) или после определенного интервала времени (атрибут ):

Set-Cookie: visitor=0d3749f09d222bea3b8f163937eb9bf1; Max-Age=31536000
Set-Cookie: visitor=0d3749f09d222bea3b8f163937eb9bf1; expires=Mon, 07-Oct-2019 13:44:02 GMT

Безопасные cookie отсылаются на сервер только если запрос выполняется по протоколу SSL и HTTPS. Начиная с Chrome 52 и Firefox 52, незащищенные сайты (HTTP) не могут создавать куки с флагом .

Set-Cookie: PHPSESSID=m2iut9i59p73ld1c5q9j49c6t0; Secure

HttpOnly cookie не доступны из JavaScript через свойство и через , что помогает избежать межсайтового скриптинга (XSS). Рекомендуется устанавливать этот флаг для тех cookie, к которым не требуется обращаться через JavaScript. В частности, если куки используются только для поддержки сеанса, то в JavaScript они не нужны, так что в этом случае следует устанавливать флаг :

Set-Cookie: PHPSESSID=m2iut9i59p73ld1c5q9j49c6t0; Secure; HttpOnly

Приложение: Функции для работы с куки

Вот небольшой набор функций для работы с куки, более удобных, чем ручная модификация .

Для этого существует множество библиотек, так что они, скорее, в демонстрационных целях. Но при этом полностью рабочие.

Самый короткий способ получить доступ к куки – это использовать регулярные выражения.

Функция возвращает куки с указанным :

Здесь генерируется динамически, чтобы находить .

Обратите внимание, значение куки кодируется, поэтому использует встроенную функцию для декодирования. Устанавливает куки с именем и значением , с настройкой по умолчанию (можно изменить, чтобы добавить другие значения по умолчанию):

Устанавливает куки с именем и значением , с настройкой по умолчанию (можно изменить, чтобы добавить другие значения по умолчанию):

Чтобы удалить куки, мы можем установить отрицательную дату истечения срока действия:

Операции обновления или удаления куки должны использовать те же путь и домен

Обратите внимание: когда мы обновляем или удаляем куки, нам следует использовать только такие же настройки пути и домена, как при установке куки. Всё вместе: cookie.js

Всё вместе: cookie.js.

Как обновить куки php?

Предположим нам нужно обновить значение куки. Т.е. название будет то же, но значение или срок действия надо изменить. В таком случае нам опять же понадобится функция setcookie.

Операция ничем не отличается от операции создания куков. Точно так же пишем похожий код, но с измененными данными:

1
2
3
4
5
6
7
8
9

<?php

$name=’wpguru’;//имя куки

$value=’hello world, ver. 2′;//значение куки

$expire=time()+60*60*24*7;//сколько будет кука работать (неделя в секундах)

setcookie($name,$value,$expire);//установили куку с нашими параметрами

 
 
?>

Теперь посмотрим, что содержится в браузере:

Как видите, обновление куки произошло успешно!

Использование сессии для контроля доступа

Сессии чаще всего используются для хранения информации о залогиненном пользователе. Принцип работы здесь очень простой: внутри сценария, ответственного за обработку формы входа, открывается новая сессия, куда записывается информация о вошедшем пользователе. Такой информацией может быть ассоциативный массив со всеми значениями из соответствующей записи из БД.
Затем добавим код, проверяющий существование сессии в сценарии, которые должны быть закрыты от анонимных пользователей. Если сессия пуста, значит данный пользователь не выполнял вход на сайт, и доступа к данной странице он не имеет.
В этом случае можно вернуть код ответа 403 и показать сообщение об ошибке, либо принудительно выполнить переадресацию на главную страницу.

Выход с сайта

Если на сайте есть вход, то должен быть и выход. Таким выходом будет специальный сценарий, который очистит сессию и переадресует на главную страницу.
Чтобы очистить сессию, достаточно очистить массив :

Ejemplos

Las cookies de sesión son removidas cuando el cliente se apaga. Las cookies son cookies de sesión si no se especifican las directivas o .

Set-Cookie: sessionId=38afes7a8

En lugar de expirar cuando el cliente se cierra, las cookies permanentes expiran en una fecha especifica () o después de una longitud de tiempo determinado ().

Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT
Set-Cookie: id=a3fWa; Max-Age=2592000

Una cookie para un dominio que no incluya el servidor que la defina .

La siguiente cookie sera rechazada si se define por el servidor ubicado en como:

Set-Cookie: qwerty=219ffwef9w0f; Domain=somecompany.co.uk

Una cookie para el subdomino del dominio actual será rechazada.

La siguiente cookie sera rechazada si el servidor anfitrión en la define como:

Set-Cookie: sessionId=e8bb43229de9; Domain=foo.example.com

Los nombres de las cookies prefijadas con o pueden ser solo usadas si son definidas con la directiva desde un origen (HTTPS) seguro.

Además, cookies con el prefijo deben tener una ruta de (significando cualquier ruta del huésped) y no debe tener un atributo .

Para clientes que no implementan prefijos para las cookies, no se puede contar con que estas garantías adicionales, y las cookies prefijadas sean aceptadas.

// Ambas aceptadas al venir de un origen seguro (HTTPS)
Set-Cookie: __Secure-ID=123; Secure; Domain=example.com
Set-Cookie: __Host-ID=123; Secure; Path=/

// Rechazada por faltar la directiva Secure
Set-Cookie: __Secure-id=1

// Rechazada por faltar la directiva Path=/
Set-Cookie: __Host-id=1; Secure

// Rechazada por definir un dominio
Set-Cookie: __Host-id=1; Secure; Path=/; domain=example.com

Регистрация на сайте

Перед тем, как мы начнем добавлять аутентификацию на своем сайте, придётся добавить форму для регистрации нового аккаунта.Аккаунт — это учётная запись пользователя.
Чтобы завести аккаунт, требуется пройти регистрацию — это заполнение специальной формы, где пользователь указывает свою почту, пароль, и, возможно, дополнительную информацию.
После регистрации все данные из формы сохраняются в базе данных как есть

Но хранению паролей нужно уделить особое внимание

Хранение паролей

Пароль пользователя — это секретный набор символов, который используется в дальнейшем в ходе аутентификации. Зная пароль пользователя, злоумышленник может войти на сайт под его именем. По этой причине пароль нельзя хранить в базе в открытом виде. Ведь если информацию из БД сайта украдут, то
данные всех пользователей станут скомпрометированными.
Вместо самого пароля, в базе будут храниться их отпечатки — хэши.

Что такое хеширование

Отпечаток (хэш) — это результат работы функции хэширования, которая вернёт для любого значения строку фиксированной длины.
Используя специальный математический алгоритм, такая функция умеет преобразовывать любую переданную информацию к строке фиксированной длины (например, 32 или 64 символа). Причём любому массиву информации, будь это все статьи из Википедии, или одно слово, всегда будет соответствовать уникальный отпечаток. Повторный вызов функции для одного и того же исходника всегда возвращает один и тот же хэш.
Обратная операция (получить из отпечатка оригинал) невозможна.

Возьмём простой пример. У нас есть информация, для которой мы хотим получить отпечаток. Пусть такой информацией будет следующая строка:

«Я знаю только то, что ничего не знаю, но другие не знают и этого»

Результат обработки этой строки хэширующей функцией SHA-1 будет таким:

Хэширующие функции часто используются для контроля целостности информации при передачи по сети. Например, чтобы убедиться в том, что загруженный файл не был повреждён, достаточно получить его хэш и сравнить данный хэш с опубликованным на сайте. Если в файле поменялся хоть один байт, то эти отпечатки будут совершенно разными.
Нам же функции хэширования помогут для сравнения паролей.

Реализация регистрации пользователя

Вернёмся к форме регистрации.
Выше говорилось, что вместо пароля лучше хранить его отпечаток. Для получения отпечатка существуют множество хэшируюших функций. К счастью, нам не надо разбираться в их многообразии, потому что в PHP есть стандартная функция, которая делает ровно то, что нужно.
Вот пример как из пароля получить отпечаток, пригодный для хранения в базе:

Вызов этой функции вернёт следующую строку:
Именно это значение и следует хранить в БД, вместо пароля.

디렉티브

쿠키는 «이름-값» 페어로 시작됩니다.
  •  는 제어 문자 및 공백, 탭(\t)를 제외한 아스키 문자로 구성되어야 합니다. 또한, «( ) < > @ , ; : \ » /  ? = { }» 같은 문자도 포함할 수 없습니다.
  • A  는 필요하다면 쌍 따운표로 묶여질 수 있고 아스키 코드 문자로 구성되어야 하고, 처럼 제어 문자, 공백, 쌍 따운표, 콤마, 세미콜론, 역 슬래쉬(\)는 사용할 수 없습니다. 엔코딩: 쿠기 값에 대해서 URL 엔코딩을 사용하는 구현 기법들이 많지만, RFC 명세에서 요구하는 것은 아닙니다. 단지, <cookie-value>에 허용된 문자에 대한 요구사항을 만족시킬 뿐이죠.
  • 프리픽스: (대쉬는 프리픽스의 일부입니다)로 시작되는 쿠키 이름은 반드시  플래그가 설정되어야 하고, 보안 페이지(HTTPS)여야 합니다.
  •  프리픽스:  로 시작되는 쿠키들은  플래그가 설정되어야 하며, 마찬가지로 보안 페이지(HTTPS)여야 하고, 도메인이 지정되지 않아야 합니다. (따라서 서브 도메인에 쿠키를 공유할 수 없습니다) 그리고, 경로는 반드시 «/»여야 합니다.
Expires=<date> Optional

HTTP 타임스템프로 기록된 쿠키의 최대 생존 시간(수명). 세부 형태를 확인하려면 를 참조하세요. 지정되지 않았다면, 세션 쿠키로서 취급되며, 클라이언트가 종료될 때 파기 됩니다. 그러나 많은 웹 브라우져에서 세션이라고 불리는 기능(그러니까 모든 탭을 기억했다가 브라우져를 다시 켜면 복구된다던지 하는 기능)을 구현합니다. 쿠키들 또한 함께 복원되므로, 정확히 말해서 브라우져를 닫은 적이 없는 게 되는 것이죠.

만료 시간이 지정되면, 시간 및 날자로 이뤄진 값은 서버가 아니라 클라이언트에 상대적인 값으로 취급됩니다.

Max-Age=<number> Optional
쿠키가 만료될 때 까지의 시간 (초 단위). 0 또는 음수가 지정되면 해당 쿠키는 즉시 만료되며, 오래된 브라우저(ie6, ie7 그리고 ie8)은 이 헤더를 지원하지 않습니다. 다른 브라우저들은 둘 다( 와  지정되었을 때  값을 더 우선시합니다.
Domain=<domain-value> Optional
쿠키가 적용되어야 하는 호스트를 지정. 지정되어 있지 않으면 현재 문서 URI를 기준으로 적용됩니다만, 서브 도메인을 포함하지 않습니다. 이전의 설계와 달리, 도메인의 선두에 위치한 점들은 무시됩니다. 도메인이 지정되면, 서브도메인들은 항상 포함됩니다.
Path=<path-value> Optional
쿠키 헤더를 보내기 전에 요청 된 리소스에 있어야하는 URL 경로를 나타냅니다. % x2F ( «/») 문자는 디렉토리 구분 기호로 해석되며 하위 디렉토리도 일치합니다 (예: path=/docs, «/docs», «/docs/Web/»또는 «/docs/Web/HTTP «가 모두 일치합니다).
Secure Optional
보안 쿠키들은 서버에서 요청이 SSL을 사용하며, HTTPS 프로토콜을 사용할 때에만 전송됩니다. 그러나 기밀 정보나 민감한 정보들은 HTTP 쿠키에 보관되거나 그걸로 전송되어선 안됩니다. 왜냐하면, 그 전체 메커니즘이 본질적으로 보안이 결여되어 있고, 거기 들어있는 어떤 정보도 암호화되지 않기 때문입니다.

노트: 비 보안 사이트()들은 «보안» 쿠키를 더이상 설정할 수 없습니다(Chrome 52+ 및 Firefox 52+).

HttpOnly Optional
HTTP-only cookies aren’t accessible via JavaScript through the property, the and APIs to mitigate attacks against cross-site scripting (XSS).
SameSite=Strict
SameSite=Lax Optional 

Allows servers to assert that a cookie ought not to be sent along with cross-site requests, which provides some protection against cross-site request forgery attacks (CSRF).

Оцените статью
Рейтинг автора
5
Материал подготовил
Илья Коршунов
Наш эксперт
Написано статей
134
Добавить комментарий