【问题标题】:Calculate IP Address range for exclusive access using REMOTE_ADDR [duplicate]使用 REMOTE_ADDR 计算独占访问的 IP 地址范围 [重复]
【发布时间】:2013-07-18 11:36:08
【问题描述】:

在发布此之前,我已经阅读了多个问题(和答案),但我似乎无法以某种方式得到它。 如何使用 REMOTE_ADDR 计算 IP 范围? 例如,我授予了对范围的专有访问权限:197.168.178.1 - 197.168.178.10 当我使用 197.168.178.6 访问该站点时,我想获得访问权限。我该如何管理?

到目前为止,我得到的是 IpRange 类的列表 - 这些 IP 地址在数据库中指定,可以更改为任何范围。该 ID 用于识别正在访问该站点的范围。

public class IpRange
{
    public int ID { get; set; }
    public System.Net.IPAddress RangeStart { get; set; }
    public System.Net.IPAddress RangeEnd { get; set; }
}

我已经尝试使用下一个方法将传入的 IP 地址 (Request.ServerVariables["REMOTE_ADDR"]) 与此范围匹配;

    private static int MatchAddress(System.Net.IPAddress IP, List<IpRange> range)
    {
        int Value = -1;
        foreach (IpRange item in range)
        {
            if (item.RangeStart.Address >= IP.Address && IP.Address <= item.RangeEnd.Address)
            {
                Value = item.ID;
                break;
            }
        }
        return Value;
    }

Address 方法已过时,并且很可能返回与我认为的完全不同的东西;根据警告我应该使用IPAddress.Equals,但是该方法只能比较两个地址以查看是否相同,我想知道它是否在范围内定义。

有什么方法可以匹配这个(或者我应该使用另一个组件来做到这一点)?

附:我的网络知识远低于标准,我知道,所以这可能是一个非常愚蠢的问题,但我迷路了。

【问题讨论】:

  • 无论如何,您的逻辑是错误的 - 您正在寻找一个值,使得范围的 startgreater 或等于它,并且范围的end 小于或等于它。
  • This answer 看起来可能对您有用。
  • @Damien_The_Unbeliever 确实我明白了,我的逻辑有缺陷;我一直在尝试各种东西,所以很可能这是编辑 9000,我忽略了那部分。你建议的答案确实对我有用——或者至少 99%。是否可以选择将此问题标记为重复?
  • @Leon - 我不记得你是否可以参加“投票结束”(你需要一个高级代表来解决其他人的问题,但我不记得规则你可以对自己的问题做些什么)。我已经添加了一个带有该问题链接的近距离投票。

标签: c# asp.net .net


【解决方案1】:

在这种情况下,您可以使用正则表达式。 sPattern 是包含正则表达式的字符串,IPs 包含测试用例。这是控制台应用程序的示例:

using System;
using System.Text.RegularExpressions;

namespace TestsApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            string sPattern = "197.168.178.([1-9]|10)$";
            string[] IPs = 
                {
                    "197.168.178.1",
                    "197.168.178.10",
                    "197.168.178.5",
                    "197.168.178.255",
                    "255.255.255.0"
                };
            foreach (string s in IPs)
            {
                Console.Write("{0,24}", s);

                if (Regex.IsMatch(s, sPattern, RegexOptions.IgnoreCase))
                    Console.WriteLine("  (match for '{0}' found)", sPattern);
                else
                    Console.WriteLine("  No match!");
            }
            Console.ReadLine(); //Pause
        }
    }
}

【讨论】:

  • IP 范围不是我指定的,可以在数据库中更改,所以硬编码的正则表达式不是一个选项 :( -- 为此更新了问题。
  • 嗯,这只是一个例子。您可以轻松编写一个算法来管理正确正则表达式的构建。
  • 无论是正则表达式,还是普通的 foreach,你都可以做一个算法。数据库将如何指定这些范围,它们是 2 个值 min n max 吗?
【解决方案2】:

通常您通过提供地址和掩码来定义具有范围的 IP 地址!可以对照第三个地址检查这个元组,以确定它是否匹配:

IP Address: 192.168.178.1
Netmask:    255.255.255.16

Check addr: 192.168.178.9 -> falls into range.
Check addr: 192.168.238.3 -> doesn't fall into range.

这就是网络发生的方式。 ;)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-23
    • 1970-01-01
    • 2016-05-07
    • 1970-01-01
    • 2015-08-17
    • 2016-01-15
    • 2011-12-01
    • 1970-01-01
    相关资源
    最近更新 更多