Я подумывал написать собственный скрипт аутентификации, но я не очень разбираюсь в безопасности.
Из статей, которые я читаю, похоже, что обычно это связано с хэшированием пароля с солью и хранением его в базе данных. Затем, когда пользователь запрашивает вход в систему, пароль хэшируется и сравнивается с базой данных. Если он совпадает, данные пользователя хранятся в $ _SESSION.
Однако я не знаю, безопасно это или нет. Я прочитал что-то о хранении ключей сеанса в базе данных, но я не уверен, как это работает, или как это реализовать.
Может ли кто-нибудь объяснить, как реализовать безопасную проверку подлинности?
Кроме того, есть ли какие-либо предложения для библиотек аутентификации PHP, которые я могу включить, которые легко освоить, а не писать самостоятельно?
Проверьте этот ответ здесь .
Хотя ответ 3 года, предлагаемая библиотека phpass обновлена.
Кроме того, +1 для Арона Седерхольма. Безопасность паролей является обширным предметом, и вы должны сначала взглянуть на связанные с этим вопросы, которые уже обсуждались здесь, на StackOverflow, чтобы вы были более знакомы с предметом и передовыми методами безопасности.
Хотя мне нравятся фреймворки ( Symfony , Zend и т. Д.), Поскольку они , как правило, реализуют эти хорошие практики, просто их использование не делает вас хорошим программистом. Вы должны изучить его внутреннюю работу. Я всегда приветствую программиста в кодировании его собственного механизма безопасной аутентификации (пока они не реализуют его на реальном сайте, который действительно нуждается в надежной безопасности), потому что это лучший способ узнать и понять участников темы. Всегда начинайте с существующей реализации, а THEN используйте это как пример для создания собственной кодовой базы.
Что нужно помнить:
Для аутентификации вам нужно будет отслеживать «пользователей», подключенных и (часто), прошедших проверку подлинности в системе. Для этого требуется знание идентификатора (имя пользователя, адрес электронной почты или другой уникальный токен) и пароль. Храните имя пользователя и парольную фразу где-нибудь, но никогда не храните парольную фразу, не защищая ее в первую очередь : не используйте алгоритм дайджеста сообщений (например, MD5 или SHA1) с солью. Вместо этого используйте bcrypt . Хотя это не плохая идея использовать инфраструктуру здесь, не всегда полагайтесь на фреймворк, чтобы делать правильные вещи.
Для авторизации вам нужно будет отслеживать, какие действия предпринимает пользователь, и выполнять проверки разрешений, чтобы проверить, разрешено ли им выполнять действия, которые они предпринимают. Это может быть достигнуто несколькими различными способами, и все они являются специфичными для домена – вы не будете часто находить вырезанный на нем пример, хотя вы можете найти множество рамок, которые помогут вам.
Для бухгалтерского учета вам необходимо записать, какие действия выполняет пользователь. Это наиболее часто игнорируемая часть любого приложения, но когда происходят плохие вещи, крайне важно знать и восстанавливать его из журналов доступа к веб-серверу, это кошмар. Опять же, это домен, но хорошая структура должна облегчить его реализацию.
Наконец, привязка всех трех из них – сеанс пользователя. Когда вы вызываете «session_start ()» в PHP, он отправляет идентификатор сеанса в виде файла cookie для клиента и сохраняет файл на жестком диске сервера, содержащем содержимое $_SESSION
для этого пользователя. Вы также можете настроить PHP для переопределения функциональных возможностей по умолчанию и сохранения данных сеанса с помощью session_set_save_handler . Затем вы можете сохранить эту информацию в базе данных.
TL; DR : используйте фреймворк, такой как CodeIgniter, Drupal, Yii или какое-то другое активно разработанное решение. Подавляющее большинство фреймворков там будут делать все, что вам нужно, и если они этого не сделают, их можно легко модифицировать. Не создавайте свои собственные рамки для этого; используйте тот, который уже доступен.
Я использую tank_auth (плагин Codeigniter), который довольно хорош. Исходный код является хорошей ссылкой для реализации безопасного входа в систему.