【问题标题】:Regex for whitelisting specific IP segments用于将特定 IP 段列入白名单的正则表达式
【发布时间】:2013-11-12 18:04:57
【问题描述】:

我需要一个我无法弄清楚的正则表达式:

我该如何处理这样的事情:

60.70.80.90/25

并将其转换为匹配该范围内 IP 的正则表达式?

那个 IP 地址只是一个虚拟地址;实际IP范围不同。有没有办法将其转换为正则表达式,而无需枚举该范围内的每个地址?例如,我知道我可以这样做:

60\.70\.80\.91|...

但我宁愿不必列举所有这些地址。任何人都能够为此找出一个正则表达式?

这将在 IIS 重写规则中用于将特定 IP 列入白名单,并拒绝所有其他 IP 的访问。

编辑: 如果您对将 IP 列入白名单的想法比我建议的更好,请随时提出相应的建议。

【问题讨论】:

  • 您不应该为此使用正则表达式...您觉得有必要使用正则表达式有什么原因吗?
  • 欢迎提出不同的方法!
  • 您应该编辑您的问题以询问任何方法。
  • 问题相应更新;谢谢。
  • 请注意,60.70.80.90/25 不是有效的网络掩码;你的意思是 60.70.80.0/25?

标签: regex iis ip rewrite whitelist


【解决方案1】:
<Limit GET POST HEAD>
  Order Deny,Allow
  Deny  from all
  Allow from 60.70.80.90/25
</Limit>

【讨论】:

    【解决方案2】:

    一个正则表达式是完全错误的工具来完成这项任务。正则表达式适用于文本操作;网络掩码数学是一种数学运算。 可能使用正则表达式来做这件事,但它非常丑陋、非常混乱并且非常低效!

    最好的办法是使用库进行 IP 和网络操作,例如用于 Perl 的 Net::CIDR。如果由于某种原因您不能使用其中一个,请自己进行操作:

    1. 将点分十进制格式转换为等效的数字:

      60.70.80.90/25 -> 1011241050/4294967168
      
    2. 将要匹配的IP转换成数字形式:

      1.2.3.4 -> 16909030
      
    3. 以及目标 IP 与网络掩码:

      16909030 & 4294967168 = 16908928
      
    4. 以及针对网络掩码的白名单 IP:

      1011241050 & 4294967168 = 1011240960
      
    5. 如果结果匹配,那就是匹配:

      16908928 == 1011240960 ?然后白名单匹配

    【讨论】:

    • 我同意代码中的数学运算非常简单,但我需要通过 IIS 重写规则将其插入,这样我们就不必在每次想要更改 IP 时重新部署应用程序白名单。如果您认为这可以在 IIS 重写规则中完成,那就太好了...
    • @KenMason:听起来像是ServerFault的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-24
    • 1970-01-01
    • 2021-05-06
    • 2011-08-05
    • 2018-12-23
    相关资源
    最近更新 更多