Подтвердить что ты не робот

Советы по подписанию файлов cookie вместо сеансов

Я рассматриваю возможность использования PHP $_SESSION (т.е. обработку сеанса на стороне сервера, добавление некоторого языкового атрибута) и использование подписанных файлов cookie вместо этого, поскольку я слышал о них много хорошего (Flickr использует их, поэтому они должны быть достаточно хороши для меня тоже).

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

Но что было бы хорошим способом реализовать часть подписи? Также; поскольку трафик, вероятно, будет HTTP, есть ли способ отправить конфиденциальные данные (например, пароль пользователя) с помощью этого метода, работая против кражи файлов cookie и/или подделки?

4b9b3361

Ответ 1

Зачем беспокоиться?

Я бы не использовал этот метод для конфиденциальных данных. Это может быть полезно в сочетании с обычным сеансом, хотя вы можете дать клиенту cookie с обычным идентификатором сеанса, а также включить все эти пары ключ/значение, которые требуется вашему приложению на каждой странице. Таким образом, вы можете избежать попадания в хранилище сеансов для каждого запроса страницы.

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

С учетом этого, вперед...

Подписание данных с помощью хеша

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

$values=array(
  'user_id'=>1,
  'foo'=>'bar'
);
$secret='MySecretSalt';

$plain="";
foreach($values as $key=>$value)
{
    $plain.=$key.'|'.$value.'|';
}
$plain.=$secret;
$hash=sha1($plain);

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

Шифрование конфиденциальных данных

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

Кража файлов cookie

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

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

Вы также можете посмотреть, включая IP-адрес клиента в подписанный файл cookie, и если он не соответствует IP-адресу, представляющему файл cookie, вы можете снова войти в него. Это обеспечивает большую защиту, но не будет работать для людей, чей видимый IP-адрес продолжает меняться. Вы можете сделать это необязательной функцией и дать пользователю возможность отказаться. Просто простоя мысли, я не видел это на практике:)

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

Ответ 2

Я сделал CookieStorage именно для этой цели. Все сохраненные значения надежно подписываются с вашим личным ключом через хеширование RIPEMD160 (и соленые со временем) и, возможно, зашифрованы с помощью RIJNDAEL256.

Каждое значение сохраняется с меткой времени, которая может быть восстановлена.

Подписанный пример.
Зашифрованный пример.

Если вы предпочитаете, вы можете использовать функции hash/encrypt/decrypt по вашему выбору.

Ответ 3

Подписанные файлы cookie в PHP

Другие ответы на этот вопрос немного устарели. PHP 5.2 добавил параметр httponly к функции setcookie, эффективно добавив поддержку подписанного файла cookie. Согласно функции setcookie httponly документация параметров:

"Когда [установлен в] ИСТИНА, cookie будет доступен только через протокол HTTP. Это означает, что cookie не будет доступен для языков сценариев, таких как JavaScript. Было высказано предположение, что этот параметр может эффективно помочь для уменьшения кражи личных данных с помощью атак XSS (хотя он не поддерживается всеми браузерами), но это требование часто оспаривается"

Установка этого параметра в значение true также отключит возможность редактирования этого файла cookie с использованием других инструментов на основе браузера, таких как Chrome DevTools. Чтобы сделать подписанный cookie еще более безопасным, я настоятельно рекомендую сузить путь или домен, который он использует. Вы можете указать те, которые используются с параметрами path и domain. И, конечно, никогда не мешает защитить файл cookie с помощью параметра secure, если ваш сайт загружается через HTTPS. Результатом будет строка вроде этого:

setcookie('signedCookie','uneditable value here', 0, '/', 'www.example.com', TRUE , TRUE);

Зачем использовать подписанные файлы cookie?

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