校验ip是否白名单

近期接到一个开发任务,MQ代理模块增加支持ip端配置白名单逻辑,比如配置10.96.*.* 10.*.*.* 等规则中发过来的消息队列可以正常转发,否则一律不处理。关于匹配验证这种事情一般来说第一反应就是正则了,无奈小弟才疏学浅,每次看完正则后不用很快就忘了。最后借鉴同事指点换了个实现方式。 思路是把配置的ip规则计算出一个range,然后比对被验证的ip是否在这个区间即可。 老规矩,贴代码凑篇幅~

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
 /// <summary>
/// 获取Ip数字范围(包含*)
/// </summary>
/// <param name="ipAddr"></param>
/// <param name="minNum"></param>
/// <param name="maxNum"></param>
public static void GetRangeOfIp(string ipAddr, out long minNum, out long maxNum)
{
    minNum = -1;
    maxNum = -1;

    try
    {
        string[] parts = System.Text.RegularExpressions.Regex.Split(ipAddr, @"\.");
        if (parts.Length == 4)
        {
            minNum = parts[0] == "*" ? 0L : long.Parse(parts[0]) * 256L * 256L * 256L;
            minNum += parts[1] == "*" ? 0L : long.Parse(parts[1]) * 256L * 256L;
            minNum += parts[2] == "*" ? 0L : long.Parse(parts[2]) * 256L;
            minNum += parts[3] == "*" ? 0L : long.Parse(parts[3]) - 1;


            maxNum = (parts[0] == "*" ? 255L : long.Parse(parts[0])) * 256L * 256L * 256L;
            maxNum += (parts[1] == "*" ? 255L : long.Parse(parts[1])) * 256L * 256L;
            maxNum += (parts[2] == "*" ? 255L : long.Parse(parts[2])) * 256L;
            maxNum += (parts[3] == "*" ? 255L : long.Parse(parts[3])) - 1;
        }
    }
    catch (Exception ex)
    {
        LogHelper.LogError("ClientServices - GetRangeOfIp - ipAddr:{0}, ex:{1}", ipAddr, ex);
    }
}

被验证的ip也类似计算出一个sum出来,比对这个sum是否在minNum和maxNum之间就好啦

You may also like

一条评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注

You must enable javascript to see captcha here!