2

ホスト名が解決可能かどうかを確認するために使用socket.getaddrinfoし、キャッチsocket.gaierrorして不正なホスト名を検出しています。「12345」などの一部のシステム文字列がジャンク アドレスに「解決」されることを除けば、これは正常に機能します。

ここで一体何が起こっているのでしょうか? どうすればそれを防ぐことができますか?

Python 2.6.6 + CentOS 6.2 での奇妙な動作

Python 2.6.6 (r266:84292, Dec  7 2011, 20:48:22) 
[GCC 4.4.6 20110731 (Red Hat 4.4.6-3)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import socket
>>> hostname = "12345"
>>> socket.getaddrinfo(hostname, "22", socket.AF_INET, socket.SOCK_STREAM, socket.SOL_TCP)
[(2, 1, 6, '', ('0.0.48.57', 22))]

Python 2.7.2 + OS X 10.6 で予想される動作

Python 2.7.2 (v2.7.2:8527427914a2, Jun 11 2011, 15:22:34) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> hostname = "12345"
>>> socket.getaddrinfo(hostname, "22", socket.AF_INET, socket.SOCK_STREAM, socket.SOL_TCP)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
socket.gaierror: [Errno 8] nodename nor servname provided, or not known
4

1 に答える 1

1

文字列は IP アドレスとして解決されます。試してみるhostname="1"と、0.0.0.1 に解決されることがわかります。これは確かに奇妙な動作です。マニュアルには次のように書かれています。

inet_aton() also accepts strings with less than three dots; see the Unix manual page inet(3) for details.

マニュアルページには、そのような文字列はinterpreted as a 32-bit value that is stored directly into the binary address without any byte rearrangement.

于 2012-04-11T10:33:42.677 に答える