PHP Secure Session - PullRequest
       1

PHP Secure Session

6 голосов
/ 08 сентября 2010

Я создаю приложение, похожее на phpmyadmin (интерфейс управления базой данных). Пользователь должен аутентифицировать себя в базе данных, а приложение должно каким-то образом хранить учетные данные. SSL не вариант для всех установок.

  • Идея 1. Пользователь отправляет учетные данные, приложение сохраняет имя пользователя и шифрует пароль с использованием предварительно определенного секретного ключа Blowfish (config.ini.php) - это то, что делает phpMyAdmin.
  • Идея 2: Форма входа создает случайный секрет blowfish (javascript), пользователь отправляет учетные данные входа в систему, приложение шифрует имя пользователя / пароль и сохраняет их на стороне сервера в сеансе, секретный ключ сохраняется в cookie и отправляется для каждого запроса. *

Идея 1: Проблема в случае нарушения безопасности сервера. (Ключ находится в конфигурации, данные сеанса в / tmp)
Идея 2: Проблема с атакой «человек посередине». (Ключ + учетные данные отправлены)

Есть другие предложения? Критика?

Ответы [ 2 ]

5 голосов
/ 08 сентября 2010

Указанные вами проблемы не решаемы в абсолютном смысле.Ни один сервер не защищен на 100%, и к каждой атаке «человек посередине» можно пойти еще дальше.

Я предлагаю более конкретно определить требования к безопасности сервера.В противном случае каждое решение будет отсутствовать, потому что в абсолютном выражении они всегда есть.Например, используйте session_save_path () и поместите данные сеанса в другое место, если вас беспокоит «/ tmp».

Когда речь идет о противодействии атакам типа «человек посередине», тогда убер-подходиспользовать одноразовую панель , предварительно обменивающуюся в автономном режиме.Это то, что делают агентства безопасности - все другие варианты оставляют ваше приложение более или менее зависимым от благодатия устройств между вашим сервером и пользовательским агентом.Поэтому вам необходимо определиться с уровнем допуска.

Один достаточно безопасный метод аутентификации - подтверждение нулевого знания .Требуется, чтобы ваше приложение знало только открытый ключ пользователя.Нет паролей, нет секретов.Дело в том, что когда пользователь хочет войти в систему, ваше приложение должно ответить случайным сообщением, зашифрованным открытым ключом этого пользователя.Если другая сторона отправляет обратно правильное случайное сообщение, то это указывает на наличие соответствующего закрытого ключа.Следовательно, пользователь аутентифицирован.Чтобы предотвратить прослушивание, перед отправкой ответа заставьте useragent зашифровать правильный ответ с помощью открытого ключа приложения.Однако реализация необходимой функциональности и достойного графического интерфейса для всего этого не будет тривиальной задачей.

2 голосов
/ 08 сентября 2010

Для идеи 1 вы сказали, что даже обычный пользователь имеет доступ к файлу сеанса, это может быть и так, но вы всегда можете указать, где сеанс сохраняет данные и сделать доступным только для вашего домена пользователя / группы (если вы создаете новая учетная запись на домен). Это гарантировало бы, что кому-то придется использовать уязвимость в вашем коде для получения доступа к этим данным. Таким образом, в конечном итоге все сводится к тому, насколько безопасно вы кодируете свой код (или код, который вы используете).

...