Создание безопасного входа с использованием сессий и файлов cookie в PHP - PullRequest
15 голосов
/ 25 марта 2011

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

У меня есть логин, основанный исключительно на сеансах. Каждый раз, когда изменяется информация о сеансе, session_regenerate_id() вызывается, чтобы избежать очевидных попыток угона.

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

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

РЕДАКТИРОВАТЬ Предполагается, что вход в систему будет осуществляться через HTTPS / SSL, поэтому передача (в разумных пределах) безопасна.

Я на правильном пути? Что еще можно сделать для защиты моего логина?

Спасибо за помощь!

Ответы [ 5 ]

6 голосов
/ 25 марта 2011

Прекратите то, что вы делаете.Не проверяйте user-agent или IP-адрес.Пользовательский агент является управляемой злоумышленником переменной, и проверка этого значения не повышает безопасность этой системы.IP-адрес изменится по уважительным причинам, например, если пользователь находится за балансировщиком нагрузки или TOR.

Идентификатор сеанса всегда должен быть криптографическим одноразовым номером .В php просто позвоните session_start(), а затем начните использовать $_SESSION super global.PHP позаботится обо всем этом для вас.Если вы хотите улучшить обработчик сессии php, используйте конфигурации .Включите use_only_cookies, cookie_httponly и cookie_secure.Также установка entropy_file на /dev/urandom будет хорошей идеей, если вы работаете в системе * nix, но если у вас Windows, то у вас проблемы.

Например, для аутентификации пользователя:

//In a header file
session_start();
...
if(check_login($_POST['user_name'],$_POST['password'])){
   //Primary key of this user
   $_SESSION['user_id']=get_user_id($_POST['user_name']);
   $_SESSION['logged_id']=True;
}

И чтобы проверить, вошел ли пользователь в систему:

//in a header file
session_start()
...
if(!$_SESSION['logged_id']){
   header("location: login.php");
   die();//The script will keep executing unless you die()
}

Чтобы улучшить эту систему, прочитайте OWASP A9 и используйтеHTTPS на всю жизнь сессии.Также прочитайте OWASP A5: CSRF, также известный как «езда на сеансе», и OWASP A2: XSS, потому что они оба могут быть использованы для компрометации сеанса.

3 голосов
/ 28 марта 2011

Не существует такого понятия, как безопасный cookie, если он не передается только по SSL.Некоторые могут быть смягчены при использовании постоянных несессионных файлов cookie (например, помните меня), делая именно то, что вы делаете, но не так, как вы думаете об этом.

Вы можетедействительно, храните серверные переменные, такие как пользовательский агент, IP-адрес и т. д. (и даже переменные JavaScript), но они полезны только для проверки того, что постоянные данные cookie соответствуют новому соединению клиента.IP-адрес не очень хорошая идея, за исключением случаев, когда вы знаете, что клиент (как и вы) не будет меняться при каждой загрузке страницы (как AOL).

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

1 голос
/ 27 августа 2012

Я использую метод на основе файлов cookie (с помощью функции setcookie), но ....

session_start();
...
if(check_login($_POST['user_name'],$_POST['password'])){
   //Primary key of this user
   $_SESSION['user_id']=get_user_id($_POST['user_name']);
   $_SESSION['logged_id']=True;
}

... эти методы нереальны !!!!

Я взламываю свой сайт атакой, основанной на cookie.

  1. Я использовал опцию cookie сканера уязвимостей WebCruiser, поэтому я получаю куки после входа в систему.
  2. Затем я изменил просто значение для cookie
  3. Затем я нажал «Сохранить печенье».
  4. В этот момент я нажал на веб-браузере, чтобы увидеть на левой панели, затем я щелкнул вправо, затем я нажал на страницу обновления, так что я получил свою страницу администратора без использования страницы входа с пользователем и паролем.

Так что, если кто-то отправит вам вирус, чтобы прочитать историю файлов cookie в IE или Firefox, вы будете рады узнать, что ваш пользователь-администратор и пароль могут быть использованы другими.

Так как решить проблему? Просто: объедините файл cookie с сервером сеансов или файл cookie сеанса с сервером сеансов, или сеанс с сеансом файла, или файл cookie с сеансом файла .... будет безопасным, но медленным: ((((

0 голосов
/ 14 сентября 2013

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

$id = uniqid();
$_SESSION['username'.$id] = "something ...";
0 голосов
/ 25 марта 2011

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

Единственное, что я хотел бы сохранить в файле cookie клиента, - это такие вещи, как «автоматический вход», «идентификатор сессии»

...