Я рассматриваю возможность отладки PHP $_SESSION
(т.е. обработку сеанса на стороне сервера, чтобы добавить какой-то язык-агностический вкус) и вместо этого использовать подписанные файлы cookie, так как я слышал о них много хорошего (Flickr использует их, поэтому они должны быть достаточно хорошим для меня тоже).
Я понимаю основной контекст метода: используйте файлы cookie для передачи пар ключ-значение от клиента к серверу и подписывайте их, чтобы убедиться, что значения не подделаны.
Но что было бы хорошим способом реализовать часть подписи? Также; поскольку трафик, вероятно, будет HTTP, есть ли хороший способ отправить конфиденциальные данные (например, пароль пользователя) с помощью этого метода при работе против кражи файлов cookie и / или подделки?
Я бы не использовал этот метод для чувствительных данных. Это может быть полезно в сочетании с обычным сеансом, хотя вы можете дать клиенту 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-автологов», связанные с предоставлением таким файлам токена, которые вы разрешаете только один раз. Вот хорошая статья об этой технике.
Вы также можете посмотреть, включая IP-адрес клиента в подписанный файл cookie, и если он не соответствует IP-адресу, представляющему файл cookie, вы можете снова войти в него. Это обеспечивает большую защиту, но не будет работать для людей, чей видимый IP-адрес продолжает меняться. Вы можете сделать это необязательной функцией и дать пользователю возможность отказаться. Просто простоя мысли, я не видел это на практике 🙂
Для хорошей статьи, которая объясняет кражу сеанса, захват и фиксацию, см. Раздел «Сессии и файлы cookie», в котором предлагается еще несколько методов, например, использование заголовка User-Agent в качестве дополнительной сигнатуры.
Я сделал CookieStorage именно для этой цели. Все сохраненные значения надежно подписываются с вашим личным ключом посредством хеширования RIPEMD160 (и соленый со временем) и, возможно, зашифрованы с помощью RIJNDAEL256.
Каждое значение сохраняется с меткой времени, которая извлекается.
Подписанный пример .
Зашифрованный пример .
Если вы предпочитаете, вы можете использовать функции hash / encrypt / decrypt по вашему выбору.
Подписанные файлы cookie в PHP
Другие ответы на этот вопрос немного устарели. PHP 5.2 добавил параметр setcookie
функцию setcookie
, эффективно добавив поддержку подписанного файла cookie. В соответствии с командой setcookie
httponly :
«Когда [установлен] на ИСТИНА, cookie будет доступен только через HTTP-протокол. Это означает, что cookie не будет доступен для языков сценариев, таких как JavaScript. Было высказано предположение, что этот параметр может эффективно помочь уменьшить идентификатор кражи через атаки XSS (хотя он не поддерживается всеми браузерами), но это требование часто оспаривается "
Установка этого параметра в значение true также отключит возможность редактирования этого файла cookie с использованием других инструментов на основе браузера, таких как DevTools от Chrome. Чтобы сделать подписанный cookie еще более безопасным, я настоятельно рекомендую сузить путь или домен, который он использует. Вы можете указать тех, которые используют параметры path
и domain
. И, конечно, никогда не мешает защитить cookie с помощью secure
параметра, если ваш сайт загружается через HTTPS. Результатом будет строка:
setcookie('signedCookie','uneditable value here', 0, '/', 'www.example.com', TRUE , TRUE);
Зачем использовать подписанные файлы cookie?
На самом деле существуют конкретные ситуации, в которых подписанные файлы cookie полезны, в то время как другие методы, такие как сеанс, не являются. Например, предположим, что рассматриваемый веб-сайт / приложение использует балансировщик нагрузки для повышения производительности. Теперь давайте предположим также, что балансировка нагрузки содержит несколько физических серверов, из которых подаются файлы, и недоступна личная опция сеанса. В такой ситуации подписанные файлы cookie – это фактически единственный безопасный способ сохранения состояния в PHP.