Безопасность при использовании Cookies, чтобы Запомнить меня - PullRequest
3 голосов
/ 26 июня 2011

Я реализовал класс входа в PHP и хочу создать функцию запомнить меня , чтобы пользователям не приходилось входить при каждом посещении.Я немного исследовал это и готовился написать его с помощью PHP setcookie (...), но затем наткнулся на эту страницу: Как создать «Запомнить меня» с помощью jquery, хранить куки .Я планировал написать это на PHP, так как это моя сила, но эта страница делает его таким простым в js: http://www.quirksmode.org/js/cookies.html

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

Спасибо, Крис

Ответы [ 3 ]

4 голосов
/ 26 июня 2011

OpenID, подключение к Facebook, вход в Twitter

Я бы посоветовал вам не делать правильной (читайте ниже информацию о cookie-файлах) вашей собственной системы входа в систему, потому что кодирование защищенной системы затруднительно (хранить пароль безопасно - ТРУДНО). Это также экономит кучу кода. Например, когда вы входите в мой пример openid с помощью Google, вы можете указать Google запомнить вас на 30 дней. Код, использованный для моего примера, можно найти по адресу my github page .

Http_only

Вы должны использовать файлы cookie только для http , чтобы защитить себя от кражи файлов cookie (старайтесь не использовать файлы cookie из javascript). Функция php setcookie также имеет флаг http-only . Для сессии вы можете достичь этого, используя что-то вроде:

<?php
ini_set("session.cookie_httponly", 1);
// or
session_set_cookie_params(0, NULL, NULL, NULL, TRUE);
?>

Не хранить данные внутри cookie

Также вы должны хранить как можно меньше информации внутри файлов cookie. Получить данные из базы данных (сеанс). Я думаю, что вы легко выполняете cookie-файлы Rememberme, устанавливая срок действия ваших сессий так, как вам нравится, но не слишком высоко, если вы спросите меня.

Интересное чтиво

Это также довольно интересное чтение для улучшения безопасности сеанса: http://web.archive.org/web/20120417214604/http://segfaultlabs.com/files/pdf/php-session-security.pdf

3 голосов
/ 26 июня 2011

Нет особого смысла создавать идентификационный токен на сервере, отправлять его клиенту и устанавливать там с помощью Javascript по сравнению с настройкой на стороне сервера.

Более важноиспользование Javascript делает его совместимым с меньшим количеством клиентов, менее надежным и менее безопасным (поскольку вы не можете использовать HTTPOnly cookie).

1 голос
/ 26 июня 2011

Основная проблема заключается в том, что когда ваш сайт используется по незашифрованному каналу (обычный HTTP, открытая сеть WiFi), каждый может получить этот cookie и получить возможность войти в систему от имени вашего пользователя.

Существует несколько способов защиты:

  • кодирование данных, специфичных для браузера / рабочей станции, в этом файле cookie,
  • используя HTTPS для всего,
  • с использованием другого хранилища (не куки-файлов) - менее вероятно, что ребенок-скрипт с Firesheep попытается захватить localStorage данных.

Кроме того, как упоминал Гамбо (его комментарий сейчас отсутствует, и я понятия не имею, почему), это относится к любой аутентификации на основе сеанса. Итак, ваш PHP-сеанс имеет ту же уязвимость (поскольку он все еще каким-то образом основан на файлах cookie).

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