Каковы фактические практические различия в функционировании встроенных функций setcookie() и setrawcookie() в PHP?

Я изучу одну из наиболее важных концепций Cookies в PHP.

При изучении Cookies я узнаю, что ". Значение cookie автоматически URLencoded при отправке файла cookie и автоматически декодируется при его получении (для предотвращения URL-кодирования вместо этого используйте setrawcookie())."

В приведенном выше утверждении было так много сомнений в моем понимании:

  • Что фактически происходит с помощью "Значение cookie автоматически URL-код при отправке файла cookie и автоматически декодируется при получении" ?
  • Для чего нужна другая функция, например setrawcookie(), если для установки значений cookie уже существует функция setcookie()?
  • Является ли процесс кодировки URL и расшифровки URL небезопасным/вредоносным/опасным/медленным/любым другим, чтобы его можно было избежать?
  • Каковы преимущества/недостатки использования setrawcookie() над setcookie()?
  • Какой из них безопасен/лучше/безопасен/надежный/и т.д. setcookie() или setrawcookie()?
  • Невозможно ли установить файлы cookie как другие переменные типа $_COOKIE['cookie_variable'] = 'some_value' вместо setcookie() или setrawcookie()?

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

Спасибо.

Ответы

Ответ 1

  • Что фактически происходит практически с помощью "Значение cookie автоматически URLencoded при отправке файла cookie и автоматически декодируется при получении"?

Это означает, что вам не нужно беспокоиться о специальных символах.

Обратите внимание, что файлы cookie не являются концепцией PHP; они являются расширением протокола HTTP. И каждый протокол имеет жесткую структуру, которую вам нужно соблюдать, или просто не работает. Эта структура основана на разделителях - символах или последовательностях символов, которые имеют специальный смысл, назначенный им в этом протоколе.
Неизбежно, что данные, передаваемые по каждому протоколу, будут содержать эти специальные трактористы, и поэтому необходимо кодирование.

Например, точка с запятой (;) используется как разделитель в Set-Cookie HTTP Header, поэтому, если ваше значение cookie содержит его, он должен быть закодирован или иначе cookie не будет правильно разбираться браузерами, когда они его получат.

Если вы отправите файл cookie со значением foo;bar, без кодировки, браузер будет рассматривать его как значение foo с прикрепленным к нему флагом bar.
Вы потеряете ;bar как часть данных, а поскольку bar - неизвестный флаг в соответствии с протоколом, браузеры просто проигнорируют его, поэтому вы даже не узнаете, что произошла ошибка вообще.

PHP будет автоматически делать кодировку, когда вы устанавливаете cookie с setcookie(), а затем автоматически декодируете его, когда читаете супер-глобальный $_COOKIE.

  1. Зачем нужна другая функция, например setrawcookie(), если для установки значений cookie уже существует функция setcookie()?

В основном по двум причинам:

  • Значение, которое вы отправляете, уже может быть закодировано.

    Вы хотите избежать двойной кодировки, потому что в лучшем случае это означает, что вам нужно больше работать. В худшем случае он может полностью повредить данные (т.е. Вы никогда не сможете быть на 100% уверенными, какими были исходные данные).

  • Существует множество способов кодирования значений, и использование одного setcookie() может быть нежелательным.

    URL-кодирование часто кодирует больше данных, чем требуется для формата файла cookie.
    В крайних случаях (вы никогда не должны беспокоиться об этом), так как закодированные данные обычно больше размера оригинала, это может привести к тому, что он превысит максимальный размер файла cookie (около 4 КБ). Или вы можете просто сохранить пропускную способность.

Но также не редкость, что вы знаете 100%, что данные не нуждаются в кодировке, поэтому вы просто хотите пропустить этот ненужный шаг.

  1. Является ли процесс кодирования URL и декодирования URL небезопасным/вредным/опасным/медленным/любым другим, чтобы его можно было избежать?

В целом, но об этом уже нужно ответить выше.

  1. Каковы преимущества/недостатки использования setrawcookie() над setcookie()?

Недостатком является то, что вам необходимо закодировать значения самостоятельно, если необходимо.
Выгоды опять объясняются выше.

  1. Какой из них безопасен/лучше/безопасен/надежный/и т.д. setcookie() или setrawcookie()?

setcookie() оставляет меньше места для ошибок людей, незнакомых с протоколом cookie.

Но это стоит дорого - предположение, что вы всегда хотите кодировать URL. И предположения, как правило, плохо в программировании.

Для новичков setcookie() проще в использовании.
Для эксперта setrawcookie() предоставляет меньше ограничений и, следовательно, более гибким.

Ни один из них по сути не лучше, и поскольку вы упомянули "безопасный" - ни один из них не влияет на безопасность.

  1. Невозможно ли установить cookie как другие переменные типа $_COOKIE['cookie_variable'] = 'some_value' вместо использования setcookie() или setrawcookie()?

Нет.

Ответ 2

URL-кодировка заменяет определенные символы, которые имеют особое значение в URL-адресах/HTTP с процентными символами, например. пространство становится %20. См. https://en.wikipedia.org/wiki/Percent-encoding для деталей gory.

Вам нужно setrawcookie, если вы хотите установить cookie, который вы уже кодировали по URL-адресу, по какой-либо причине. Поэтому, если у вас есть уже закодированный файл cookie со значением %20, если вы используете setcookie, он будет закодирован до %2520; используя setrawcookie, он будет сохранен как есть и будет установлен как %20. Другими словами, setrawcookie - это способ "просто установить проклятый печенье, я знаю, что я делаю". Используя его, вы должны убедиться, что формат файла cookie соответствует стандартам кодировки HTTP-символов.

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