首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >关于专用网IP过滤

关于专用网IP过滤
EN

Stack Overflow用户
提问于 2013-08-23 00:33:44
回答 3查看 368关注 0票数 0

我试图过滤掉私有网络IPfrom网址。

以前我有这样的代码

代码语言:javascript
运行
复制
 if(!sCurrentLine.startsWith("192.168") && !sCurrentLine.startsWith("172.") && !sCurrentLine.startsWith("10.")&& !sCurrentLine.startsWith("127.0.0"))

数据示例

代码语言:javascript
运行
复制
10.1.1.83/nagiosxi/
10.1.1.83/nagiosxi//rr.php?uid=18-c96b5fb53f9
127.0.0.1/tkb/internet/
172.18.20.200/cgi-bin/topstats.pl?submit_type=topstats&time=00:2

这是我的新代码

代码语言:javascript
运行
复制
 Pattern privateIp=Pattern.compile("(^127\\.0\\.0\\.1)|(^10\\.)|(^172\\.1[6-9]\\.)|(^172\\.2[0-9]\\.)|(^172\\.3[0-1]\\.)|(^192\\.168\\.)");
 while((sCurrentLine=br.readLine())!=null)
{

            Matcher pnm=privateIp.matcher(sCurrentLine);

            if(!pnm.matches())
            {
              System.out.println("not match");

            }
}

我正在考虑使用模式匹配。但是,Pattern.compile不接受这个正则表达式。

或者是否有任何功能可以处理私有网络IP。

对此有什么想法吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-08-23 00:39:57

这只是猜测,但是否有可能没有在表示模式的字符串中转义\,因为

代码语言:javascript
运行
复制
Pattern.compile("(^127\\.0\\.0\\.1)|(^10\\.)|(^172\\.1[6-9]\\.)|(^172\\.2[0-9]\\.)|(^172\\.3[0-1]\\.)|(^192\\.168\\.)");

对我来说编译很好(尽管我还没有对任何数据进行测试)。

编辑后更新

我可以看到,您正在使用matches方法来检查regex是否处于行的开头。这不起作用,因为matches检查regex是否与整个数据匹配。尝试将此方法更改为find

代码语言:javascript
运行
复制
if (!pnm.find()) {
    System.out.println("not match");
}
票数 2
EN

Stack Overflow用户

发布于 2013-08-23 01:39:31

使用InetAddress类:

代码语言:javascript
运行
复制
public static void main(String[] args) {
    String[] addrs = {"127.0.0.1", "8.8.8.8", "172.1.2.3", "10.200.34.5", "192.168.111.1", "fc00::1", "www.google.com"};
    for (String a : addrs) {
        try {
            InetAddress ina = InetAddress.getByName(a);
            System.out.printf("Is %s private? %s\n", ina.toString(), ina.isSiteLocalAddress());
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
    }
}

生产:

代码语言:javascript
运行
复制
Is /127.0.0.1 private? false
Is /8.8.8.8 private? false
Is /172.1.2.3 private? false
Is /10.200.34.5 private? true
Is /192.168.0.1 private? true
Is /fc00:0:0:0:0:0:0:1 private? false
Is www.google.com/173.194.46.20 private? false
票数 1
EN

Stack Overflow用户

发布于 2013-08-23 02:24:19

您可以使用以下代码来确定IPAddress是本地的还是外部的。这是对RFC 1918的检查

代码语言:javascript
运行
复制
String ipAddressAr[]    =   
            { "192.168.1.1" , 
              "172.18.20.200",
              "10.1.1.83",
              "127.0.0.1",
              "172.18.20.200"


            };


        String ipAddress    =   null;
        String ipAddressSplit[] =   null;
        int ipAddressIntSplit[] =   {0,0,0,0};

        for (int i = 0; i < ipAddressAr.length; i++) {
            ipAddress = ipAddressAr[i];
            ipAddressSplit = ipAddress.split("\\.");
            ipAddressIntSplit[0]    = Integer.parseInt ( ipAddressSplit[0] );
            ipAddressIntSplit[1]    = Integer.parseInt ( ipAddressSplit[1] );
            ipAddressIntSplit[2]    = Integer.parseInt ( ipAddressSplit[2] );
            ipAddressIntSplit[3]    = Integer.parseInt ( ipAddressSplit[3] );

            /*
             * RFC 1918
             * 
            The Internet Assigned Numbers Authority (IANA) has reserved the
               following three blocks of the IP address space for private internets:

                 10.0.0.0        -   10.255.255.255  (10/8 prefix)
                 172.16.0.0      -   172.31.255.255  (172.16/12 prefix)
                 192.168.0.0     -   192.168.255.255 (192.168/16 prefix)
            */ 
            if ( 
                    ( ipAddressIntSplit[0] == 10 ) ||
                    ( ( ipAddressIntSplit[0] == 172 ) && ( ipAddressIntSplit[1] >= 16 && ipAddressIntSplit[1] <= 31 ) ) ||
                    ( ipAddressIntSplit[0] ==   192  && ipAddressIntSplit[1] == 168  ) ||
                    ( ipAddressIntSplit[0] ==   127  && ipAddressIntSplit[1] == 0 && ipAddressIntSplit[2] == 0  ) 
                    ){
                System.out.println( "IP Address: " + ipAddress + " is Local. ");
            }else{
                System.out.println( "IP Address: " + ipAddress + " is NOT Local. ");
            }
        }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18392894

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档