我编写了一个ASP.NET应用程序,在这个应用程序中我记录了请求的IP地址。我还根据不同的IP范围提供不同的内容。
我的问题是,在我有限的测试环境中,我只有5台机器,每台机器只有1个IP地址,我想充分测试我的基于ASP.NET的IP地址的功能,所以在我的情况下如何创建HTTP请求,其中包含超出我的测试机器的5个IP地址的任意IP地址?
.Net / C#中的解决方案表示赞赏。但是任何现有的工具也都很受欢迎。
EDIT1:我正在撰写学校教育网络应用程序,为不同城市的学生提供不同的内容。不同的城市有不同的班级/研讨会/培训,我想根据特定城市学校分支机构的(代理)地址显示最重要的内容。
答案 0 :(得分:4)
一种选择是更改逻辑以查看IP地址或X-Forwarded-For标头。当请求通过代理服务器时,此标头通常用于指示源IP地址。虽然是,但您不需要在此处考虑代理,但这样做会为您提供一种非常简单的方法来测试您的逻辑。
我认为这将是您最快的路线,而不是试图欺骗IP地址。
修改强>
Uri uriObj = new Uri("http://localhost");
HttpWebRequest request =
(HttpWebRequest)WebRequest.CreateDefault(uriObj);
request.Headers.Add("X-Forwarded-For", "125.125.125.125");
WebResponse response = request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream());
Console.WriteLine(reader.ReadToEnd());
修改强>
您需要将服务器端逻辑更改为:
string ip = Request.Headers.Get("X-Forwarded-For");
if (string.IsNullOrEmpty(ip))
{
ip = Request.UserHostAddress;
}
这基本上说如果包含标题然后使用它,否则使用他们告诉我的IP地址。这样,您的测试代码和真实用户都将被选中。
答案 1 :(得分:2)
您不应该依赖IP地址。如果您的某个客户端位于任何类型的代理服务器或网络地址转换设备之后,则它们将不具有您期望的IP地址范围。即使您当前的网络没有此类设备,您的应用程序限制网络将来可能发生变化的方式也毫无意义。
您应该使用真实的身份验证机制来确定您的客户到底是谁。 IP地址明确不是为识别计算机而设计的。
编辑以回应乔治的编辑。
您的方案是肯定不依赖于IP地址的方案。您希望依赖IP地址作为地理位置的替身。那只是懒惰的设计。 IP地址恰好与地理位置有一些间接对应这一事实只不过是他们(当前)分配的过程的人为因素。
相反,如果地理位置很重要,那么您的客户应该告诉服务器他们的位置是什么!然后,即使网络发生变化,它也始终是准确的。
答案 2 :(得分:2)
我们在工作中使用虚拟机。您可以拥有任意数量的ips。它们是几种产品。我们大多使用http://www.virtualbox.org/(它的免费...大声笑)。
只需构建一个,然后复制/粘贴。配置固定的ips。就是这样;你甚至可以在同一台物理电脑上进行测试!
希望这有帮助...:)
答案 3 :(得分:1)
IP来自TCP / IP标头,而不是HTTP请求的“真实”主体。因此,锻造是非常重要的。但是如果你在局域网上,你可以使用静态IP进行测试。
答案 4 :(得分:1)
由于原始套接字限制等原因,在Windows中无法欺骗IP地址(或者至少不容易)。
您可以在linux下使用hping工具,或者在WinPcap库中使用Windows来生成原始数据包,但是您将花费大量时间做任何事情。
我想最好的方法是将5台机器的IP手动设置为不同的IP(您使用的每个范围中的一台)。
答案 5 :(得分:1)
在局域网上设置站点,创建虚拟机,并在局域网上为这些计算机分配不同的静态IP地址。将应用中的IP范围更改为局域网中的IP范围,确保其有效,然后将范围设置为您在应用的生产版本中所需的范围。你应该有一个网站的开发版本,并且没有理由不能在局域网上。
答案 6 :(得分:1)
哎呀。 错误的东西
答案 7 :(得分:0)
也许你可以通过简单地发送一个http“referer”标题来测试你的逻辑。 例如:
Dim request As System.Net.HttpWebRequest = System.Net.HttpWebRequest.Create("www.MySite.com")
request.Referer = "http://1.2.3.4"
Dim response As System.Net.HttpWebResponse = request.GetResponse()