簡體   English   中英

如何通過 IP 地址范圍限制頁面訪問?

[英]How can I restrict page access by IP address range?

我的網站中有一個密碼更改頁面,我想限制對 IP 范圍的訪問,例如 10.0.0.0 - 10.255.255.255(10/8 前綴)。

當用戶進入頁面時,它會檢查用戶是否在此 IP 范圍內。 如果用戶在范圍內,則顯示歡迎消息; 如果沒有,那么它會將用戶重定向到登錄頁面。

IP 地址從 0x00000000 到 0xFFFFFFFF。

因此,請檢查用戶 IP 是否介於 0A000000 和 0AFFFFFF(十六進制)之間。

更新:演示應用程序:

給定 IP 地址 abcd,您可以使用以下方法計算其值:

a*2^24 + b*2^16 + c*2^8 + d*2^1

或縮短為

a*16777216 + b*65536 + c*256 + d

或十六進制

a*0x1000000L + b*0x10000 + c*0x100 + d

下面的示例使用此方法來查找 IP 地址的值。 這通常包含在套接字實現中,但似乎已被 Microsoft (IPAdress.Address) 棄用。

using System;
using System.Net;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            var ip_range_from = IPAddress.Parse("10.0.0.0");
            Console.WriteLine("From IP {0}, long value {1}", ip_range_from, GetLongIP(ip_range_from));            

            var ip_range_to = IPAddress.Parse("10.255.255.255");
            Console.WriteLine("To IP {0}, long value {1}", ip_range_to, GetLongIP(ip_range_to));

            var ip_query_fail = IPAddress.Parse("159.4.1.1");
            Console.WriteLine("ValidIP({0}) returned {1} ",
                ip_query_fail,
                ValidIP(ip_range_from, ip_range_to, ip_query_fail)
                );

            var ip_query_ok = IPAddress.Parse("10.17.110.12");
            Console.WriteLine("ValidIP({0}) returned {1} ",
                ip_query_ok,
                ValidIP(ip_range_from, ip_range_to, ip_query_ok)
                );

            Console.Read(); // wait ;)
        }

        private static bool ValidIP(IPAddress From, IPAddress To, IPAddress IP)
        {
            var LongIP = GetLongIP(IP);            
            return (LongIP > GetLongIP(From) && LongIP < GetLongIP(To));
        }

        private static long GetLongIP(IPAddress IP)
        {
            var bytes = IP.GetAddressBytes();
            long LongIP = bytes[0] * 0x1000000L +
                          bytes[1] * 0x10000 +
                          bytes[2] * 0x100 +
                          bytes[3];
            return LongIP;
        }
    }
}

嘗試以某種方式使用Request.UserHostAdress 注意:為了可測試性,您可能希望解決直接從Request對象獲取數據的問題。

如果您想直接在 ASP.NET 中執行此操作,您可以查看 HttpRequest 對象,該對象將包含 ASP.NET認為正在連接的用戶信息,但這對您來說可能不夠可靠。

您還可以在 IIS 級別限制訪問,但這必須針對完整路徑或網站,而不是單個文件。

您可以包含自定義 HttpModule,它將檢查每個請求的 IP,並決定是像自定義 403 一樣在頁面上發送用戶還是通過正常的響應流。

在此處閱讀如何創建 HttpModule 並將其包含到 Web 應用程序中。 並限制訪問檢查context_BeginRequest HttpRequest.UserHostAddress屬性將響應重定向到請求之外的某個頁面。

我已經解決了使用Request.UserHostAddress獲取用戶 IP 地址的問題,然后將其拆分(如果它以 10.45 開頭)。 這是我的 ip,歡迎使用,如果不是這樣,那就意味着這是從外面來的,那么再見他。

Request.UserHostAddress會以字符串形式為您提供請求者的 IP 地址,因此您只需調用Request.UserHostAddress.StartsWith("10.") 但是,它不會告訴您他們是否在代理后面。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM