Советы по подписанным куки вместо сессий - PullRequest
12 голосов
/ 07 февраля 2009

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

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

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

Ответы [ 3 ]

23 голосов
/ 07 февраля 2009

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

Я бы не стал использовать эту технику для конфиденциальных данных. Это может быть полезно в сочетании с обычным сеансом - вы можете дать клиенту 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 в качестве дополнительной подписи.

16 голосов
/ 09 февраля 2009

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

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

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

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

0 голосов
/ 28 сентября 2017

Подписанные куки в 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 полезны, а другие методы, такие как сеанс, - нет. Например, предположим, что рассматриваемый веб-сайт / приложение использует балансировщик нагрузки для повышения производительности. Теперь давайте также предположим, что этот балансировщик нагрузки имеет несколько физических серверов, с которых обрабатываются файлы, и опция закрепления сеанса недоступна. В такой ситуации подписанные куки-файлы являются практически единственным безопасным способом сохранения состояния в PHP.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...