5

入力したURLのIPアドレスを取得するものを作成しました。

InetAddress ip = InetAddress.getByName("www.fake.cao");
return ia.getHostAddress();

また、UnknownHostExceptionをスローして、誤ったURLのエラーをキャッチしようとしました。

問題は、www.fake.caoが本物のURLとして認識され、使用できないIPアドレスを返し、例外をスローしないことです。

これらの大げさなURLをキャッチするために何ができるか教えてもらえますか?

4

3 に答える 3

2

問題は、ISPが存在しないDNSドメインの偽のページを返すことです。その(悪い)慣行は、NXDOMAINリダイレクトとして知られています。

JRE81.200.64.50は、の実際のIPアドレスなのwww.fake.caoか、ISPによって挿入された偽のページなのかを判断できません。

実際にソケットを開こうとして接続するかどうかを確認する以外に(たとえば、HTTP接続を開こうとした場合など、ホストが存在しない場合でも接続できることに注意してください)、そのホストに対して返されたIPを比較できますすでに無効であることがわかっているホスト(などdoes-not-exist.invalid)の返されるIPを使用します。

InetAddress ip = InetAddress.getByName("www.fake.cao");

InetAddress fake;
try {
   fake = InetAddress.getByName("does-not-exist.invalid");      
} catch (UnknownHostException e) {
   //www.fake.cao exists, but invalid does not
   return ip;
} 
if (Arrays.equals(ip.getAddress(),fake.getAddress())) {
    //both ip and fake resolves to the same IP
    throw new UnknownHostException();
}

//invalid does exist, but it is different from ip
return ip;

ISPが存在しないホストごとに異なるアドレスを返す可能性があるため、このアプローチは完全ではありませんが、少なくとも問題に対処しようとします。

于 2013-03-18T00:07:56.433 に答える
2

アドレスへのソケットを開こうとすると、アドレスが無効な場合に例外がスローされます。

于 2013-03-17T22:35:33.970 に答える
1

IP仕様では、アドレス0.0.0.0は、使用できない、無効な、または不明なホストを示します。間違ったURLの例外が発生しない場合は、IPアドレスを確認できます。0.0.0.0の場合、ホストはおそらく存在しません。

ISPから一般的な存在しないアドレスを取得した場合は、手動でNSルックアップを実行してみてください。基本的に、InetAddressクラスのコード全体を書き直す必要があります。これには、DNSサーバーのIPアドレスの取得、ソケットのオープン、NSクエリの投稿、応答の解析の読み取りが含まれます。

プラットフォームに依存しない場合は、JNIを使​​用してプラットフォームDNSツールに接続できます。nslookup.exeたとえば、Windowsの場合。

于 2013-03-17T22:55:07.573 に答える