Как бы вы реализовали аутентификацию на основе ФОРМ без резервной базы данных?
-
08-06-2019 - |
Вопрос
У меня есть PHP-скрипт, который запускается как CGI-программа, и HTTP Authenticate
жатку съедают и выплевывают.Поэтому я хотел бы реализовать какую-то аутентификацию на основе ФОРМЫ.В качестве дополнительного ограничения отсутствует база данных, поэтому данные сеанса не могут быть сохранены.
Я очень рад иметь основное имя пользователя и пароль.Мне просто нужно защитить приложение от злоумышленника, который не знает этих учетных данных.
Итак, как бы вы это реализовали?
Печенье?
Я мог бы представить форму, и если она подтвердится, я могу отправить обратно файл cookie, который представляет собой хэш IP-адреса и секретный код.Тогда я могу запретить рендеринг страниц, если только объект не расшифруется правильно.Но я понятия не имею, как реализовать это в PHP.
Решение
Есть несколько способов, которыми вы могли бы это сделать.
- htaccess ( доступ) -- пусть ваш веб-сервер позаботится о защите соответствующих страниц (хотя и не совсем на основе cgi-форм).
- Используйте файлы cookie и какой-нибудь алгоритм хеширования (md5 достаточно хорош) для хранения паролей в плоском файле, где каждая строка в файле - username: passwordhash.Убедитесь в том, что соль ваши хэши для дополнительной безопасности по сравнению с радужными таблицами.(Этот метод немного наивен...быть очень будьте осторожны с безопасностью, если вы пойдете этим маршрутом)
- используйте что-то вроде sqlite - файл база данных только для обработки аутентификации.Sqlite достаточно компактен и прост, чтобы соответствовать вашим потребностям, даже если вам не нужен большой сервер базы данных.
Теоретически, вы также могли бы хранить данные сеанса в плоском файле, даже если у вас нет базы данных.
Другие советы
Если вы в данный момент используете Authenticate, то, возможно, у вас уже есть htpasswd файл.Если вы хотите продолжить использовать этот файл, но переключиться на аутентификацию на основе формы, а не через заголовок Authenticate, вы можете использовать PHP-скрипт для использования того же файла htpasswd и использовать сеансы для поддержания статуса аутентификации.
Быстрый поиск в Google по запросу php htpasswd показывает эта страница с помощью функции PHP для проверки учетных данных на соответствие htpasswd.Вы могли бы интегрировать его (при условии, что у вас есть сеансы, настроенные на автозапуск) с некоторым кодом, подобным этому:
// At the top of your 'private' page(s):
if($_SESSION['authenticated'] !== TRUE) {
header('Location: /login.php');
die();
}
// the target of the POST form from login.php
if(http_authenticate($_POST['username'], $_POST['password']))
$_SESSION['authenticated'] = TRUE;
Вам действительно нужна форма?Независимо от того, что вы делаете, вы ограничены тем, что имя пользователя и пароль вам известны.Если они знают это, они получают ваше волшебное печенье, которое позволяет им это делать.Вы хотите запретить им просматривать страницы, если они не знают секрет, и базовая авторизация делает это, ее легко настроить и она не требует большой работы с вашей стороны.
Вам действительно нужно видеть заголовок авторизации, если веб-сервер заботится о контроле доступа за вас?
Кроме того, если вы предоставляете приложение известному списку пользователей (а не широкой публике), вы можете предоставить доступ на основе веб-сервера по другим факторам, таким как входящий IP-адрес, сертификаты клиентов и многие другие вещи, которые зависят от конфигурации, а не от программирования.Если бы вы объяснили свои ограничения в области безопасности, мы могли бы предложить лучшее решение.
Удачи, :)
...Что касается salt, добавьте имя пользователя в свой хэш-файл salt, чтобы помешать кому-либо, кто знает ваш salt и имеет доступ к вашему файлу паролей, написать радужную таблицу и взломать номер пароля ваших пользователей.