Как бы вы реализовали аутентификацию на основе FORM без резервной базы данных?

У меня есть сценарий PHP, который работает как программа CGI, а Authenticate заголовок HTTP съедается и выплевывается. Поэтому я хотел бы реализовать какую-то аутентификацию на основе FORM. В качестве дополнительного ограничения отсутствует база данных, поэтому данные сеанса не могут быть сохранены.

Я очень открыт для получения главного имени пользователя и пароля. Мне просто нужно защитить приложение от злоумышленника, который не знает эти учетные данные.

Так как бы вы это реализовали?

Печенье?

Я мог бы представить форму, и, если она подтвердится, я могу отправить обратно cookie, который представляет собой хеш IP-адреса с секретным кодом. Тогда я могу предотвратить рендеринг страниц, если вещь не расшифровывается правильно. Но я понятия не имею, как это реализовать в PHP.

Ответов (4)

Решение

Несколько способов сделать это.

  1. htaccess - пусть ваш веб-сервер обрабатывает данные страницы (хотя не совсем на основе cgi-формы).
  2. Используйте файлы cookie и какой-то алгоритм хеширования (достаточно md5), чтобы хранить пароли в плоском файле, где каждая строка в файле - имя пользователя: passwordhash. Обязательно солите свои хэши для дополнительной безопасности по сравнению с радужными таблицами. (Этот метод немного наивен ... будьте очень осторожны с безопасностью, если вы идете по этому маршруту)
  3. используйте что-то вроде базы данных sqlite только для обработки аутентификации. Sqlite достаточно компактен и прост, чтобы удовлетворить ваши потребности, даже если вам не нужен большой бэкэнд.

Теоретически вы также можете хранить данные сеанса в плоском файле, даже если у вас нет базы данных.

Если вы в настоящее время используете Authenticate, возможно, у вас уже есть файл htpasswd . Если вы хотите продолжить использование этого файла, но переключитесь на использование аутентификации на основе FORM, а не через заголовок 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-адрес, клиентские сертификаты и многие другие вещи, которые вопрос конфигурации, а не программирования. Если вы объяснили свои ограничения безопасности, мы могли бы предложить лучшее решение.

Удачи, :)