Могу ли я реализовать систему аутентификации веб-пользователей на python без POST?

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

  •  09-06-2019
  •  | 
  •  

Вопрос

Мой университет не поддерживает метод POST cgi (я знаю, это безумие), и я надеялся иметь систему, в которой пользователь может иметь имя пользователя и пароль и безопасно входить в систему.Возможно ли это вообще?

Если это не так, то как бы вы сделали это с помощью POST?Просто из любопытства.

Ваше здоровье!

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

Решение

На самом деле вы можете сделать все это с помощью методов GET.Однако вы захотите использовать полный протокол ответа на запрос для входа в систему.(Вы можете хэшировать на стороне клиента, используя javascript.Вам просто нужно каждый раз отправлять уникальный запрос.) Вы также захотите использовать SSL, чтобы гарантировать, что никто не сможет увидеть строки по мере их прохождения.

В некоторых смыслах нет реальной разницы в безопасности между запросами GET и POST, поскольку они оба передаются в виде открытого текста, в других смыслах и на практике...GET-коды намного проще перехватить, и они присутствуют во всех логах большинства пользователей и истории вашего веб-браузера.:)

(Или, как предложено другими плакатами, используйте полностью другой метод, такой как HTTP auth, digest auth или какую-либо схему аутентификации более высокого уровня, такую как AD, LDAP, kerberos или shib.Однако я как бы предположил, что если бы у вас не было POST, у вас не было бы и этого.)

Другие советы

Вы могли бы использовать HTTP-аутентификацию, если она поддерживается.

Вам пришлось бы добавить SSL, так как все методы POST, GET и HTTP Auth (ну, кроме дайджест-аутентификации HHTP) отправляют открытый текст.

GET по сути такой же, как POST, у него просто есть ограничение на объем данных, которые вы можете отправлять, который обычно намного меньше, чем POST, и семантическая разница, которая делает GET не очень хорошим кандидатом с этой точки зрения, даже если технически они оба могут это сделать.

Что касается примеров, то что вы используете?В Python есть много вариантов, таких как модуль cgi или некоторые фреймворки, такие как Django, CherryPy и так далее

Используя немного JavaScript, вы могли бы заставить клиент хэшировать введенный пароль и сгенерированный сервером одноразовый номер и использовать это в HTTP GET.

Хороший выбор: Аутентификация с помощью HTTP-дайджеста

Сложнее добиться успеха, но это вариант: Хеширование на стороне клиента с помощью Javascript

Javascript - лучший вариант в данном случае.

Вместе с запросом имени пользователя и пароля он отправляет уникальную случайную строку.Затем вы можете использовать библиотеку md5 javascript для генерации хэшированного пароля, объединив случайную строку и пароль [pwhash = md5(randomstring+password)].Затем javascript создает экземпляр вызова для http://SERVER/login.cgi?username=TheUsername&random=RANDOMSTRING&pwhash=0123456789abcdef0123456789abcdef

Затем сервер должен выполнить две вещи:Проверьте, использовалась ли КОГДА-либо ранее случайная строка, и, если использовалась, отклоните запрос.(очень важный для обеспечения безопасности)

Найдите открытый текстовый пароль для имени пользователя и выполните md5 (randomstring + password).Если это соответствует тому, что пользователь указал в URL-адресе в виде pwhash, то вы знаете, что это пользователь.

Причина, по которой вы проверяете, использовалась ли случайная строка когда-либо раньше, заключается в том, чтобы остановить повторную атаку.Если кто-то может видеть сетевой трафик, историю браузера или логи, то он может просто войти в систему снова, используя тот же URL, и не имеет значения, знает ли он исходный пароль или нет.

Я также рекомендую поставить "Pragma:отсутствие кэша" и "Контроль кэша:no-cache" в верхней части заголовков, возвращаемых CGI-скриптом, просто для того, чтобы аутентифицированный сеанс не сохранялся в веб-кэше браузера или вашего интернет-провайдера.

Еще более безопасным решением было бы использование надлежащего шифрования и системы "Запрос-ответ".Вы сообщаете серверу свое имя пользователя, сервер отправляет ответный запрос (некоторую случайную строку, зашифрованную вашим паролем), и вы сообщаете серверу, что это была за случайная строка.Если вы можете сообщить об этом серверу, то, очевидно, у вас есть пароль и вы тот, за кого себя выдаете!Kerberos делает это таким образом, но намного осторожнее, чтобы предотвратить всевозможные атаки.

Безопасный вход в систему очень субъективен.Полной "безопасности" достичь нелегко (если это вообще возможно ... спорно).Однако вы можете подойти вплотную.

Если POST не подходит, возможно, вы можете использовать метод защиты каталога, такой как .htaccess или проверка подлинности Windows, в зависимости от того, в какой системе вы используете.

Оба вышеперечисленных действия приведут к появлению всплывающего окна, в котором можно ввести имя пользователя и пароль.

Чтобы использовать POST в качестве метода отправки учетных данных для входа, вам просто нужно использовать HTML-форму с method="post" и получить информацию, скажем, со страницы PHP или ASP, используя метод $_POST['varname'] в PHP или метод request.form("varname") в ASP.Например, на странице PHP или ASP вы можете выполнить поиск в базе данных пользователей, чтобы узнать, существует ли эта комбинация имени пользователя и пароля, и если да, перенаправить их на соответствующую страницу.

В качестве ссылки используйте http://www.w3schools.com/ASP/showasp.asp?filename=demo_simpleform для части HTML / ASP

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