%20%E3%82%92%E6%B8%A1%E3%81%99%E3%81%AB%E3%81%AF%E3%81%A9%E3%81%86%E3%81%99%E3%82%8C%E3%81%B0%E3%82%88%E3%81%84%E3%81%A7%E3%81%97%E3%82%87%E3%81%86%E3%81%8B%3F.png)
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内のユーザー名とパスワードのサポートを廃止しました数年前に起こったことですが、再発する気配はありません。