Я автоматизирую веб-сайт, для которого требуется базовая HTTP-аутентификация.
Предложения, приведенные в этой ссылке, в большинстве случаев работают как шарм:
Можете ли вы передать user / pass для базовой аутентификации HTTP в параметрах URL?
Однако у некоторых пользователей есть вопросительный знак (?
) в пароле. Посоветуйте, пожалуйста, как избежать знака вопроса.
P.S. Я знаю что @
в имени пользователя можно использовать как %40
.
Я полагаю, вы, должно быть, имеете в виду userinfo часть URL-адреса, в котором передаются учетные данные пользователя, а не «параметры URL» (которые являются частью Строка запроса):
https://<userinfo>@example.com/foo?<query-string>
Как и любой символ, который не разрешен в какой-либо части URL-адреса (поскольку он может иметь особое значение), он должен быть закодирован в URL-адресе (закодированный в процентах) так как %
за которым следует двузначный шестнадцатеричный код этого символа.
Так, @
является %40
и ?
является %3F
.
Но это не единственные два символа, которые могут нуждаться в кодировке URL. Вы должны передавать значение через функцию URL-кодирования в своем скрипте, чтобы правильно URL-адрес кодировал эту часть URL-адреса.
RFC 3986 определяет, какие символы разрешены (не закодированы) в userinfo часть URL:
userinfo = *( unreserved / pct-encoded / sub-delims / ":" ) unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" pct-encoded = "%" HEXDIG HEXDIG sub-delims = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="
Итак, все остальное должно быть закодировано в процентах, включая :
и %
- если они являются частью пользователь или пароль части (чтобы свести на нет особое значение).
Также в том же документе говорится:
Использование формата «пользователь: пароль» в поле информации о пользователе не рекомендуется.
Следовательно, поддержка браузеров была неоднородной, постоянно появляясь в разных версиях (безопасность - главная проблема). Я считаю, что последние версии Chrome (протестированные v79) и Firefox поддерживают учетные данные пользователя в URL-адресе. Я видел комментарии, что это также работает в последней версии Safari (?), Хотя это не работало долгое время и в настоящее время не работает для меня (хотя я не использую последнюю версию на iOS 12.4.1 ). И IE отказался от поддержки имен пользователей и паролей в URL-адресе несколько лет назад, и похоже, что он не вернется.