2009-04-28 5 views
1

J'ai écrit une application ASP.NET et, dans cette application, j'enregistre l'adresse IP de la demande. Et je sers également différents contenus selon la gamme IP différente. Ma question est, dans mon environnement de test limité, j'ai seulement 5 machines, chaque machine a seulement 1 adresse IP, je veux tester pleinement la fonction de mon adresse IP basée sur ASP.NET, donc dans ma situation comment créer une requête HTTP contenant une adresse IP arbitraire au-delà de l'adresse IP de mes machines de test?Comment tester l'application ASP.NET qui dépend de l'adresse IP

La solution dans .Net/C# est appréciée. Mais tout outil existant est également apprécié.

EDIT1: J'écris une application web d'éducation scolaire qui diffuse du contenu différent à des étudiants de différentes villes. Différentes villes ont différentes classes/séminaire/formation et je veux afficher le contenu le plus pertinent selon l'adresse (proxy) de la branche de l'école dans une ville spécifique.

+0

Il peut être utile d'ajouter quelques détails sur ce que les adresses IP vous disent? Est-ce pour des raisons géographiques? c'est bon? Identification de l'utilisateur? Pas d'accord. – AnthonyWJones

+0

@Anthony: Je dirais que non, même pour des raisons géographiques. J'ai déjà utilisé des adresses IP britanniques aux États-Unis. Dans un autre travail, presque tout le trafic a été acheminé à travers le pays. Ajouter un NAT de l'autre côté, et le code de George serait assez confus. –

+0

@AnthonyWJones, j'ai ajouté mes raisons d'affaires, si vous pouviez offrir quelques bonnes idées sur la façon de générer des adresses IP différentes pour rendre mon test de coût plus petit, il sera apprécié! – George2

Répondre

1

L'adresse IP provient des en-têtes TCP/IP et non du corps "réel" de la requête HTTP. Il n'est donc pas trivial de forger. Mais si vous êtes sur un réseau local, vous pouvez simplement utiliser des adresses IP statiques pour tester.

+0

@Matthew, désolé, je ne suis pas sur un réseau local. Le site Web est destiné à certaines zones distribuées et, en fonction des différentes adresses IP des différentes zones, je diffuse un contenu différent. Des idées pour rendre le test facile? – George2

+0

@ George2: Si vous n'êtes pas sur un réseau local, comment vos 5 machines se connectent-elles? – AnthonyWJones

+0

Mon mauvais anglais, je veux dire actuellement mes 5 machines sont du même LAN, mais je veux tester des scénarios lorsque les machines ne sont pas dans un LAN, par exemple. une machine qui vient d'Angleterre se connecte à mon serveur situé aux États-Unis quelque chose comme ça. Des idées. – George2

2

Vous ne devriez pas dépendre des adresses IP. Si l'un de vos clients se trouve derrière un serveur proxy ou un périphérique de Transition d'adresse réseau, il n'aura pas la plage d'adresses IP attendue. Même si votre réseau actuel ne dispose pas de tels périphériques, il est peu logique que votre application limite les possibilités de modification du réseau à l'avenir.

Vous devez utiliser un mécanisme d'authentification réel pour déterminer qui sont réellement vos clients. Les adresses IP ne sont explicitement pas conçues pour identifier les ordinateurs.


EDIT en réponse à la modification de George.

Votre scénario est celui dans lequel vous devriez définitivement ne dépendez pas des adresses IP. Vous voulez dépendre de l'adresse IP en tant que stand-in pour l'emplacement géographique. C'est juste un design paresseux. Le fait que les adresses IP aient une correspondance indirecte avec l'emplacement géographique n'est rien de plus qu'un artefact du processus auquel elles sont (actuellement) attribuées. Au lieu de cela, si l'emplacement géographique est important, alors vos clients devraient dire au serveur quel est leur emplacement! Ensuite, il sera toujours précis, même si le réseau change.

+0

@John, je suis d'accord avec vos points dans des sens généraux. Mais dans ma situation, le proxy est bon, pour le même proxy je retourne juste le même contenu, et c'est par conception. BTW: pourrions-nous venir à ma question originale? Des idées? :-) – George2

+0

@George: Salut à nouveau, et ce n'est pas bien pour un logiciel de restreindre si étroitement l'infrastructure réseau. Si les membres de votre réseau veulent changer de réseau, à des fins légitimes, votre logiciel cessera de fonctionner. Vous devez garder la couche "Application" indépendante de la couche "Réseau". Quant à la façon de le tester, les tests unitaires résoudraient la plupart du problème. A côté de cela, essayez les machines virtuelles, où vous pouvez construire le réseau entre eux comme vous le souhaitez. Vous pouvez même reproduire ce qu'il adviendra de votre code lorsque le réseau change. –

+0

Je suppose qu'il fait juste la géolocalisation. Par exemple. Si vous avez un client en Espagne, servez-lui un site Web en espagnol par défaut. Évidemment, ce n'est pas sûr à utiliser pour l'authentification. –

1

adresses IP Spoofing est impossible (ou du moins pas facile du tout) dans les fenêtres en raison des limitations de sockets raw .. etc.

Vous pouvez utiliser l'outil hping sous linux, ou WinPcap bibliothèque pour Windows pour générer paquets bruts, mais vous allez passer beaucoup de temps pour rien.

Je suppose que le meilleur moyen est de définir les adresses IP de vos 5 machines manuellement dans différentes adresses IP (une de chaque plage que vous utilisez).

+0

@Aziz, pourquoi l'utilisation de winpcap pour générer un paquet brut va "passer beaucoup de temps pour rien"? – George2

+0

parce que vous allez passer du temps à apprendre à l'utiliser, puis vous rendre compte qu'il n'envoie que des paquets de couche ethernet, donc vous devez implémenter IP, TCP et HTTP vous-même! ... ne fonctionne tout simplement pas :) – Aziz

4

Une option consiste à modifier votre logique pour afficher l'adresse IP ou l'en-tête X-Forwarded-For. Cet en-tête est souvent utilisé pour indiquer l'adresse IP d'origine lorsqu'une requête passe par un serveur proxy. Bien que oui, vous n'avez pas besoin de prendre en compte les proxies ici, mais cela vous donnera un moyen très facile de tester votre logique.

Je pense que ce sera votre chemin le plus rapide plutôt que d'essayer d'usurper des adresses IP.

Modifier

 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()); 

Modifier

Vous devez changer votre logique côté serveur pour ressembler à:

string ip = Request.Headers.Get("X-Forwarded-For"); 
    if (string.IsNullOrEmpty(ip)) 
    { 
     ip = Request.UserHostAddress; 
    } 

Cela dit, fondamentalement, si l'en-tête est inclus puis utilisez qui autrement utilisent l'adresse IP qu'ils me disent. De cette façon, votre code de test et vos vrais utilisateurs seront récupérés.

+0

Cool, Josh! Tout exemple de code .Net? – George2

+0

@Josh, j'ai testé en utilisant X-Forwarded-For ne fonctionnera pas. Ce que nous avons obtenu du serveur est l'adresse IP réelle du client demandeur, pas la valeur que nous avons mise en référence. Voici mon code utilisé au côté serveur ASP.Net. Des commentaires ou quelque chose de mal? HttpContext.Current.Request.UserHostAddress – George2

1

Configurez votre site sur un réseau local, créez des machines virtuelles et affectez à ces machines différentes adresses IP statiques sur le réseau local. Modifiez les plages d'adresses IP de votre application sur celles du réseau local, assurez-vous que cela fonctionne, puis définissez les plages de votre choix dans la version de production de votre application. Vous devriez avoir une version de développement du site, et il n'y a aucune raison qui ne peut pas être sur un LAN.

2

Ici, au travail, nous utilisons des machines virtuelles. Vous pouvez avoir autant d'ips que vous le souhaitez. Ils sont plusieurs produits autour. Nous utilisons principalement http://www.virtualbox.org/ (c'est gratuit ... lol).

Juste en construire un, puis copier/coller. Configurez les ips fixes. Et c'est tout; vous pouvez même tester tous dans le même PC physique!

Hope this aide ... :)

1

ooops. mauvaises choses

+0

mal pour quoi? :-) – George2

0

Vous pouvez peut-être tester votre logique en envoyant simplement un en-tête http "referer". Par exemple:

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() 
+0

Merci CB, vous voulez dire mettre une adresse IP arbitraire dans l'en-tête MyIpAddress? – George2

+0

Vous pouvez également placer le _location_ dans un en-tête et ne pas utiliser d'adresse IP du tout ... –

+0

Oui. Vous pouvez mettre n'importe quelle adresse IP dans l'en-tête. – CB01

Questions connexes