Javascript - лучший вариант в этом случае.
Наряду с запросом имени пользователя и пароля отправляет уникальную случайную строку. Затем вы можете использовать библиотеку javascript md5 для генерации хешированного пароля, комбинируя случайную строку и пароль [pwhash = md5 (randomstring + пароль)]. Затем javascript создает экземпляр вызова http://SERVER/login.cgi?username=TheUsername&random=RANDOMSTRING&pwhash=0123456789abcdef0123456789abcdef
Затем сервер должен сделать две вещи:
Проверьте, использовалась ли ранее когда-либо случайная строка, и отклоняет ли она запрос. ( очень важно для безопасности)
Найдите незашифрованный пароль для имени пользователя и выполните md5 (randomstring + пароль). Если это соответствует тому, что пользователь указал в URL как pwhash, то вы знаете, что это пользователь.
Причина, по которой вы проверяете, использовалась ли ранее случайная строка, состоит в том, чтобы остановить повторную атаку. Если кто-то может видеть сетевой трафик, историю браузера или журналы, он может просто войти снова, используя тот же URL, и не имеет значения, знают ли они исходный пароль или нет.
Я также рекомендую поместить «Pragma: no-cache» и «Cache-Control: no-cache» в верхнюю часть заголовков, возвращаемых сценарием CGI, только для того, чтобы аутентифицируемый сеанс не сохранялся в браузере или вашем браузере. Веб-кеш интернет-провайдеров.
Еще более безопасным решением было бы использование правильного шифрования и Challenge-Response. Вы сообщаете серверу свое имя пользователя, сервер отправляет вызов (некоторая случайная строка, зашифрованная вашим паролем), и вы сообщаете серверу, что это была за случайная строка. Если вы можете сказать серверу, то, очевидно, у вас есть пароль, и вы говорите, кто вы есть! Kerberos делает это таким образом, но гораздо осторожнее, чтобы предотвратить всевозможные атаки.