【问题标题】:perl gethostbyname when given IP给定 IP 时 perl gethostbyname
【发布时间】:2012-07-04 17:50:39
【问题描述】:

如果在 perl 中给 gethostbyname 函数提供了错误格式的 IP 会发生什么?当给定错误格式的 IP(比如 1.1.1)时,我们的一个脚本表现得很奇怪。在调试时,发现 gethostbyname 在给定 1.1.1 时返回一个值..对此有什么想法吗?...在​​我看来,gethostbyname 应该返回 undef,对吗?

【问题讨论】:

  • 顺便说一下,为了 IPv4/IPv6 透明兼容性,您可能希望调用 Socket::getaddrinfo 而不是仅支持 IPv4 的旧版 gethostbyname 解析器。
  • 感谢 Alan 和 LeoNerd 的回答。是的,gethostbyname 在第三个八位字节中添加了一个“0”,因此即使用户输入了错误的 3 个八位字节 IP,我们的脚本也会给出有效的输出。如何解决这个问题?
  • 用户输入没有错。如果您想验证它是否具有更严格的格式要求,那么您应该这样做。也许是正则表达式测试或其他东西。但是这个值非常好,并且可以被各种地址解析函数接受,所以我不明白为什么应该拒绝它。

标签: perl gethostbyname


【解决方案1】:

在 IPv4 的开始,在 CIDR 之前,地址被认为是由网络部分和主机部分组成。这些部分可以以点分十进制形式独立编写,不需要完全分解为字节。所以1.1是网络1上的主机1,相当于1.0.0.1或者你也可以写成一个32位的大数字:16777217。曾经有人使用像http://16777127/这样的URL来展示他们有多聪明.当垃圾邮件发送者开始欺骗过滤器时,这种情况就被破坏了。

不知何故,当我 ping 1.1.1 时,它转到 1.1.0.1。我会猜到1.0.1.1。我不确定决定它是如何分解的规则是什么。

这些旧形式不再被广泛支持(甚至不被理解),但它们还没有完全从所有工具和库中根除。

附:在我第一次尝试提交这个答案时,stackoverflow 说:

您的帖子包含指向无效域“16777127”的链接。 请通过指定完整域或将其包装在代码块中来更正它。

这就是我所说的“不被广泛支持”的意思。

【讨论】:

  • 哎呀,我的号码不匹配。 16777127 应该是 16777217。它是 0x01000001。哦,是的,我没有提到 gethostbyname 在历史上也允许八进制和十六进制数字,所以如果一些派对大佬没有出现并禁用它,0x01000001 也可以用作主机名。
【解决方案2】:

数字 IPv4 地址可以写成 1、2、3 或 4 个数字分量。每个非最终组件代表 8 位(1 个八位字节),最终组件代表提供完整 32 位地址所需的位数。因此,以下都表示本地环回地址:

2130706433
127.1
127.0.1
127.0.0.1

每个组件本身都可以用十进制、十六进制或八进制编写;因此以下都编码相同的地址

0x7f000001
127.0x01
0177.0.1
0x7f.0.0.1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-20
    • 1970-01-01
    • 1970-01-01
    • 2015-01-09
    • 1970-01-01
    相关资源
    最近更新 更多