現在、Web アプリケーションの侵入テストを行っているところ、興味深い現象に遭遇しました。テスト セッション中に、プロキシを使用して URL を収集しました。匿名アクセスの URL リストをテストしたかったので、この小さなツールを作成しました。
public static void main(String[] args) {
try {
TrustAllCerts.disableCertChecks();
FileReader fr = new FileReader(new File("urls.txt"));
BufferedReader br = new BufferedReader(fr);
String urlStr = br.readLine();
while (urlStr != null) {
if (urlStr.trim().length() > 0) {
URL url = new URL(urlStr);
HttpsURLConnection urlc = (HttpsURLConnection) url.openConnection();
urlc.connect();
if (urlc.getResponseCode() == HttpURLConnection.HTTP_OK) {
System.out.println(urlStr);
} else {
System.out.println("["+urlc.getResponseCode()+"] "+urlStr);
}
urlc.disconnect();
}
urlStr = br.readLine();
}
br.close();
} catch (Exception e) {
e.printStackTrace();
}
}
基本的には何もしませんが、指定された URL で URL 接続を開き、HTTP 応答コードをテストします (実際には、ログイン ページにリダイレクトされる場合は、さらにいくつかのテストを実装しました)。ただし、問題は、この特定のアプリケーション (一部のカスタム MS SQL Server Reporting Services) が NTLM WWW 認証を使用するように構成されていることです。Firefox を使用していくつかの URL にアクセスしようとすると、401 Unauthorized + login dlg が表示されます。Internet Exploder はバックグラウンドで NTLM 認証を実行し、アクセスを許可します。Java URLConnection (または URL) クラスが同じことをしているようです。なぜなら、私は 401 を取得していないからです。Java で暗黙的な NTLM 認証を無効にする方法はありますか? これは私にとって悪い落とし穴です。