Ответ 1
- Что фактически происходит практически с помощью "Значение cookie автоматически URLencoded при отправке файла cookie и автоматически декодируется при получении"?
Это означает, что вам не нужно беспокоиться о специальных символах.
Обратите внимание, что файлы cookie не являются концепцией PHP; они являются расширением протокола HTTP. И каждый протокол имеет жесткую структуру, которую вам нужно соблюдать, или просто не работает. Эта структура основана на разделителях - символах или последовательностях символов, которые имеют специальный смысл, назначенный им в этом протоколе.
Неизбежно, что данные, передаваемые по каждому протоколу, будут содержать эти специальные трактористы, и поэтому необходимо кодирование.
Например, точка с запятой (;
) используется как разделитель в Set-Cookie
HTTP Header, поэтому, если ваше значение cookie содержит его, он должен быть закодирован или иначе cookie не будет правильно разбираться браузерами, когда они его получат.
Если вы отправите файл cookie со значением foo;bar
, без кодировки, браузер будет рассматривать его как значение foo
с прикрепленным к нему флагом bar
.
Вы потеряете ;bar
как часть данных, а поскольку bar
- неизвестный флаг в соответствии с протоколом, браузеры просто проигнорируют его, поэтому вы даже не узнаете, что произошла ошибка вообще.
PHP будет автоматически делать кодировку, когда вы устанавливаете cookie с setcookie()
, а затем автоматически декодируете его, когда читаете супер-глобальный $_COOKIE
.
- Зачем нужна другая функция, например setrawcookie(), если для установки значений cookie уже существует функция setcookie()?
В основном по двум причинам:
-
Значение, которое вы отправляете, уже может быть закодировано.
Вы хотите избежать двойной кодировки, потому что в лучшем случае это означает, что вам нужно больше работать. В худшем случае он может полностью повредить данные (т.е. Вы никогда не сможете быть на 100% уверенными, какими были исходные данные).
-
Существует множество способов кодирования значений, и использование одного
setcookie()
может быть нежелательным.URL-кодирование часто кодирует больше данных, чем требуется для формата файла cookie.
В крайних случаях (вы никогда не должны беспокоиться об этом), так как закодированные данные обычно больше размера оригинала, это может привести к тому, что он превысит максимальный размер файла cookie (около 4 КБ). Или вы можете просто сохранить пропускную способность.
Но также не редкость, что вы знаете 100%, что данные не нуждаются в кодировке, поэтому вы просто хотите пропустить этот ненужный шаг.
- Является ли процесс кодирования URL и декодирования URL небезопасным/вредным/опасным/медленным/любым другим, чтобы его можно было избежать?
В целом, но об этом уже нужно ответить выше.
- Каковы преимущества/недостатки использования
setrawcookie()
надsetcookie()
?
Недостатком является то, что вам необходимо закодировать значения самостоятельно, если необходимо.
Выгоды опять объясняются выше.
- Какой из них безопасен/лучше/безопасен/надежный/и т.д.
setcookie()
илиsetrawcookie()
?
setcookie()
оставляет меньше места для ошибок людей, незнакомых с протоколом cookie.
Но это стоит дорого - предположение, что вы всегда хотите кодировать URL. И предположения, как правило, плохо в программировании.
Для новичков setcookie()
проще в использовании.
Для эксперта setrawcookie()
предоставляет меньше ограничений и, следовательно, более гибким.
Ни один из них по сути не лучше, и поскольку вы упомянули "безопасный" - ни один из них не влияет на безопасность.
- Невозможно ли установить cookie как другие переменные типа
$_COOKIE['cookie_variable'] = 'some_value'
вместо использованияsetcookie()
илиsetrawcookie()
?
Нет.