URL パラメータで HTTP 基本認証のパスワードに疑問符 (?) を渡すにはどうすればよいでしょうか?

URL パラメータで HTTP 基本認証のパスワードに疑問符 (?) を渡すにはどうすればよいでしょうか?

HTTP 基本認証を必要とする Web サイトを自動化しています。

このリンクに示されている提案は、ほとんどの場合にうまく機能します。

URL パラメータで HTTP 基本認証のユーザー名/パスワードを渡すことはできますか?

ただし、一部のユーザーのパスワードには疑問符 ( ?) が含まれています。疑問符をエスケープする方法を教えてください。

@PSユーザー名では としてエスケープできることは承知しています%40

答え1

あなたが言及しているのは、ユーザー情報ユーザ認証情報が渡されるURLの一部であり、「URLパラメータ」(クエリ文字列):

https://<userinfo>@example.com/foo?<query-string>

URLのどの部分でも許可されていない文字(特別な意味を持つ可能性があるため)と同様に、URLエンコードする必要があります(パーセントエンコード) の%後に、その文字の 2 桁の 16 進コードが続きます。

したがって、@はであり%40?はです%3F

しかし、URL エンコードが必要な文字はこれら 2 つだけではありません。URL のその部分を正しく URL エンコードするには、スクリプト内で URL エンコード関数を使用して値を渡す必要があります。

RFC 3986どのような文字が許可されるか(エンコードされていないか)を定義します。ユーザー情報URLの一部:

userinfo    = *( unreserved / pct-encoded / sub-delims / ":" )
unreserved  = ALPHA / DIGIT / "-" / "." / "_" / "~"
pct-encoded = "%" HEXDIG HEXDIG
sub-delims  = "!" / "$" / "&" / "'" / "(" / ")"
              / "*" / "+" / "," / ";" / "="

:したがって、およびを含む他のすべてはパーセントエンコードされる必要があります%ユーザーまたはパスワード部分(特別な意味を否定するため)。

同じ文書には次のようにも述べられています:

userinfo フィールドで「user:password」形式を使用することは推奨されません。

その結果、ブラウザのサポートはバージョンによってまちまちで、変更が続いています (セキュリティが主な懸念事項です)。最新バージョンの Chrome (テスト済みバージョン 79) と Firefox は、URL のユーザー認証情報をサポートしています。最新の Safari でも機能するというコメントを見ましたが、これは長い間機能しておらず、現在私の環境では機能していません (iOS 12.4.1 で最新のものを使用していませんが)。そしてIEはURL内のユーザー名とパスワードのサポートを廃止しました数年前に起こったことですが、再発する気配はありません。

関連情報