【问题标题】:What RegEx will match all loopback addresses?什么 RegEx 将匹配所有环回地址?
【发布时间】:2012-01-15 14:31:20
【问题描述】:

我有一个应用程序,它必须在使用 localhost127.0.0.1::1 或任何环回地址时警告用户(目标主机用于数据库到数据库的连接,不一定在应用环境)。这很复杂,因为地址如下......

  • 127.1
  • 127.0.01
  • 127.0000.0000.1
  • 127.0.0.254
  • 127.63.31.15
  • 127.255.255.254
  • 0::1
  • 0000::0001
  • 0000:0:0000::01
  • 0000:0000:0000:0000:0000:0000:0000:0001

...将被消费代码正确解析,并将解析为环回。

什么是匹配任何排列的 IPv4 和 IPv6 环回地址的正则表达式?

【问题讨论】:

  • 一个常见的安全准则是枚举您确实希望允许的情况,而不是尝试枚举不允许的情况。如果您可以限制为标准 IPv4 表示法(四个点分隔的八位字节),那么排除 127/8 就很容易了。
  • 这是一个很好的规则。这个特定问题与安全无关(只是警告“注意:您的本地主机可能与服务器的不同”),但我看到了它背后的原理。

标签: regex localhost loopback


【解决方案1】:

RegexBuddy(这是一个真正出色的测试驱动正则表达式构建工具)中摆弄了一段时间后,我想出了这个:

^localhost$|^127(?:\.[0-9]+){0,2}\.[0-9]+$|^(?:0*\:)*?:?0*1$

此 RegEx 匹配

字符串“本地主机”

  • localhost
  • LOCALHOST

IPv4 环回地址的这些排列

  • 127.0.0.1
  • 127.0.0.001
  • 127.0.00.1
  • 127.00.0.1
  • 127.000.000.001
  • 127.0000.0000.1
  • 127.0.01
  • 127.1
  • 127.001
  • 127.0.0.254
  • 127.63.31.15
  • 127.255.255.254

IPv6 环回地址的这些排列

  • 0:0:0:0:0:0:0:1
  • 0000:0000:0000:0000:0000:0000:0000:0001
  • ::1
  • 0::1
  • 0:0:0::1
  • 0000::0001
  • 0000:0:0000::0001
  • 0000:0:0000::1
  • 0::0:1

此 RegEx 不匹配

有效的服务器名称

  • servername
  • subdomain.domain.tld

这些有效的 IPv4 地址

  • 192.168.0.1
  • 10.1.1.123

这些有效的 IPv6 地址

  • 0001::1
  • dead:beef::1
  • ::dead:beef:1

【讨论】:

    【解决方案2】:

    如果您不关心证明地址是否有效,那么这应该可以:

    /^(127\.[\d.]+|[0:]+1|localhost)$/i
    

    【讨论】:

    • 这匹配127.0.0.1的常见情况,以及我所有的IPv6测试用例,但不匹配127.0.0.001127.00.0.1127.63.31.15等。但是,将其更改为 ^(127(\.\d+){1,3}|[0:]+1|localhost)$ 使其与我的一样有效,并且更加简洁。
    • 好收获。我会相应地更新它以使其正确,以防有人复制它。我喜欢你对非捕获的使用,以及你的一组测试用例。
    • 谢谢。我更喜欢您的 RegEx 简洁 - 特别是因为我只需要 reject 环回地址,而不是解析或验证它。
    • 不要忘记 "0.0.0.0": ^(127(\.\d+){1,3}|[0:]+1|localhost|0\.0\.0\ .0)$
    • 这不是环回地址。引用维基百科的话,0.0.0.0 是一个不可路由的元地址,用于指定一个无效、未知或不适用的目标。
    【解决方案3】:

    我创建了这个正则表达式来捕获 IPv6 环回地址的不同排列:

    (0{0,4}:{1,2}){1,7}(0{0,3}1)

    我在以下地址进行了测试:

    • 0:0:0:0:0:0:0:1
    • 0000:0000:0000:0000:0000:0000:0000:0001
    • ::1
    • 0::1
    • 0:0:0::1
    • 0:0:0000::1
    • 0000:0:00::0001
    • 0000::0001
    • 0000:0:0000::0001
    • 0000:0:0000::1
    • 0::0:1

    它捕获了所有这些。

    你可以在http://regexr.com/3bqpm上测试它

    【讨论】:

      猜你喜欢
      • 2012-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多