TLDR; Предполагается, что файлы cookie и хранилища сохраняются в виде обычного текста и доступны по сценарию на стороне клиента, который поступает из того же домена. Предположите худшее; все может пойти не так с вашим скриптом из-за ошибок или атак XSS. Если данные будут использоваться как клиентом, так и сервером снова, наиболее определенно подпишите его. Если данные относятся только к серверному коду, подпишите и зашифруйте его. Если данные предназначены только для печати материала на экране или оценки DOM, оставьте его открытым текстом.
Давайте будем говорить о том, какие файлы cookie, хранилища сеансов и локальные хранилища перед началом реализации примера.
Cookies - это данные , созданные сервером или клиентом, хранящиеся в открытом виде браузерами, которые отправляются на каждый HTTP-запрос на сервер, если путь соответствует. Они хороши для хранения токенов аутентификации, метаданных, относящихся к отслеживанию, аналитике, предпочтениям веб-интерфейса, тележкам и многим другим.
Склады - как указано по их названию - место хранения, назначенное вашему домену, и только скриптов из вашего домена и атак XSS может изменить его. Это означает, что если вы используете их для перечисленных выше целей, вам необходимо вручную добавить данные, хранящиеся в них, в ваши HTTP-запросы. Если ваш сайт зависит от многих асинхронных HTTP-вызовов, не следует использовать хранилища, такие как файлы cookie. В противном случае они полезны для кэширования таких вещей, как данные шаблонов и ресурсы сайта.
Если вы используете куки для хранения данных, связанных с пользователем, который необходим для вашего сервера, эти виды печенья могут быть зашифрованы на стороне сервера перед отправкой клиенту. Вы можете получить доступ к таким файлам cookie с помощью ngCookies
, но единственный вред, который может быть сделан, - это то, что некоторые введенные коды могут привести к их недействительности. Если каким-то образом ваша схема шифрования будет обнаружена, и они станут читаемыми для злоумышленника, вы можете сделать недействительными изменения для них, добавив подпись (созданную с помощью алгоритма безопасного хэша) в каждый магазин и проверив вашу подпись при каждом извлечении. Давайте проиллюстрируем этот процесс.
$userState = json_encode($yourStateObjectOrAnAssociativeArray);
$sign = my_hash($userState);
$encryptedState = encrypt($userState);
setcookie("user" , $encryptedState);
setcookie("sign" , $sign);
Здесь мы закодировали наше состояние как JSON, а затем сгенерировали хэш. Вы можете использовать некоторые SHA1, SHA256 и такие с сохраненным ключом, который вы выбрали, чтобы создать функцию my_hash()
. Ниже приведен пример, который является правильным, но вы не должны его использовать, так как даже я не должен знать ваш алгоритм.
// hash() is reserved so use something else
function my_hash($object) {
return sha1(md5($object) . "some giberish key that is stored as config data or in a db" . sha1($object))
}
Обратите внимание, что my_hash()
не очень надежна, так как он использует статическую строку в качестве ключа и структуры генерации, которая не является сложным.В конце концов, это sha1()
некоторой случайной структуры. Этого достаточно для обозначения печенья.
Вы можете написать свою собственную партию encrypt()
/decrypt()
, используя шифрование AES или какой-либо одинаково безопасный алгоритм по вашему выбору. Here is an example from this site.
Теперь наш файл cookie хранится и готов к отправке по следующему запросу. Ниже описано, как вы расшифровываете и проверяете свой файл cookie из приведенного выше примера.
$sign = $_COOKIE["sign"];
$encryptedState = $_COOKIE["user"];
$userState = decrypt($encryptedState); //If this fails, it indicates someone tried to replace your cookie by hand, it is a failed attack
$assoc = true; //If true, json_decode returns array, otherwise it returns an object
$yourStateObjectOrAnAssociativeArray = json_decode($userState, $assoc); //If this fails, it indicates someone tried to replace your cookie by hand, it is a failed attack
if($sign == my_hash($yourStateObjectOrAnAssociativeArray)) {
//Noone modified your cookie, you are safe
//Do something with it
}
else {
// Someone tried to replace your sign cookie to imitate your server but he failed
// or
// Someone managed to decrypt your cookie and modified it but failed to generate a valid sign (very unlikely)
// You are still safe
// Log this line and check every once in a while to detect unsuccessful hackers
}
Значительная часть использования объекта состояния является то, что он может быть использован для реализации многих видов ограничений и механизмов отслеживания. Например, сохранение системного времени во время создания вашего файла cookie дает вам возможность закончить его позже. Встраивание клиентского IP-адреса - это способ ограничить совместное использование файлов cookie через сети.
Если вы используете файлы cookie для хранения данных, связанных с пользователем, которые необходимы для вашего сервера, эти файлы cookie могут быть зашифрованы на стороне сервера перед отправкой клиенту. Вы можете получить доступ к таким файлам cookie с помощью ngCookies, но единственный вред, который может быть сделан, заключается в том, что некоторые введенные коды могут их аннулировать. Если какая-то ваша схема шифрования будет обнаружена, и они станут читаемыми для злоумышленника, вы можете сделать недействительными изменения к ним, добавив подпись (созданную с помощью алгоритма безопасного хэша) в каждом магазине и проверив вашу подпись при каждом извлечении. – diegoperini
Спасибо за ответ! Но как насчет простой логической строки, которая проверяет, вошел ли пользователь в систему или нет? Вы использовали бы выделенный токен для истины или ложных? – Shay
Как только вы используете файлы cookie для аутентификации, вы в конечном итоге сталкиваетесь с такими проблемами, как «Кто входит в систему?», «Как долго он/она остается в системе?», «Используется ли компьютер с использованием общедоступного Интернета?» и т. д. В конце концов, простой способ представления состояния, принадлежащего определенному пользователю (отсюда и файла cookie), заключается в том, чтобы выровнять некоторый объект, который может быть обратным строковым (разобранным) снова, который в конце будет представлять одно и то же состояние. Если сохраненная строка неуязвима для модификаций и/или нечитабельно для невооруженного глаза компьютера, ее можно хранить в виде файла cookie. – diegoperini