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

StackOverflow https://stackoverflow.com/questions/17376

Вопрос

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

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

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

Печенье?

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

Это было полезно?

Решение

Есть несколько способов, которыми вы могли бы это сделать.

  1. htaccess ( доступ) -- пусть ваш веб-сервер позаботится о защите соответствующих страниц (хотя и не совсем на основе cgi-форм).
  2. Используйте файлы cookie и какой-нибудь алгоритм хеширования (md5 достаточно хорош) для хранения паролей в плоском файле, где каждая строка в файле - username: passwordhash.Убедитесь в том, что соль ваши хэши для дополнительной безопасности по сравнению с радужными таблицами.(Этот метод немного наивен...быть очень будьте осторожны с безопасностью, если вы пойдете этим маршрутом)
  3. используйте что-то вроде 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 и имеет доступ к вашему файлу паролей, написать радужную таблицу и взломать номер пароля ваших пользователей.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top