2

InetAdress.getHostName()Javaでクラスを使用する際に問題があり ます。場合によっては、Java クラスが正しい結果を得られませんでした。この場合、(エラーで予想されるように) IP アドレスだけを受け取ります。

ほとんどの場合、これはネットワークの dns 構成のエラーです。しかし、コマンド ラインを で使用するとnslookup、正しい答えが得られます。

Java は、システムの残りの部分とは異なる DNS 構成を使用しますか? 誰がこれがどのように起こるか説明できますか? の代替手段はありgetHostName()ますか?

4

2 に答える 2

0

getHostName

この IP アドレスのホスト名を取得します。

getCanonicalHostName

この IP アドレスの完全修飾ドメイン名を取得します

于 2013-09-03T12:37:45.443 に答える
0

かなり古い質問だと思いますが、今日同じ問題に遭遇し、理由を見つけたようです。問題は、Java (少なくとも openjdk バージョン "1.8.0_121") が最初に "PTR" レコードを検索し、次に結果が見つかった場合、Java が "A" レコード検索を実行しようとし、返された "A" を比較することです。 " 照会された最初の IP 番号を含むレコード。また、「A」クエリでそのような IP が見つからない場合、Java は「PTR」ルックアップ結果を返しません。彼らはそれを「なりすましの防止」と呼んでいます。ライブラリのソースは次のとおりです。

private static String getHostFromNameService(InetAddress addr, boolean check) {
String host = null;
for (NameService nameService : nameServices) {
    try {
        // first lookup the hostname
        host = nameService.getHostByAddr(addr.getAddress());

        /* check to see if calling code is allowed to know
         * the hostname for this IP address, ie, connect to the host
         */
        if (check) {
            SecurityManager sec = System.getSecurityManager();
            if (sec != null) {
                sec.checkConnect(host, -1);
            }
        }

        /* now get all the IP addresses for this hostname,
         * and make sure one of them matches the original IP
         * address. We do this to try and prevent spoofing.
         */

        InetAddress[] arr = InetAddress.getAllByName0(host, check);
        boolean ok = false;

        if(arr != null) {
            for(int i = 0; !ok && i < arr.length; i++) {
                ok = addr.equals(arr[i]);
            }
        }

        //XXX: if it looks a spoof just return the address?
        if (!ok) {
            host = addr.getHostAddress();
            return host;
        }

        break;

私は何を言うことができますか?いたずらな言葉を省略する - 何もありません。このライブラリは Oracle JRE から共有されているため、他にできることはありません。

于 2017-04-04T03:48:42.633 に答える