147 votes

Comment créer un proxy simple en C# ?

J'ai téléchargé Privoxy il y a quelques semaines et, pour le plaisir, j'étais curieux de savoir comment on pouvait en faire une version simple.

Je comprends que je dois configurer le navigateur (client) pour qu'il envoie une requête au proxy. Le proxy envoie la demande au web (disons que c'est un proxy http). Le proxy recevra la réponse... mais comment le proxy peut-il renvoyer la demande au navigateur (client) ?

J'ai cherché sur le web pour C# et http proxy mais je n'ai pas trouvé quelque chose qui me permette de comprendre correctement comment cela fonctionne derrière la scène. (Je crois que je ne veux pas d'un reverse proxy mais je ne suis pas sûr).

L'un d'entre vous a-t-il des explications ou des informations qui me permettraient de poursuivre ce petit projet ?

Mise à jour

C'est ce que je comprends (voir le graphique ci-dessous).

Étape 1 Je configure le client (navigateur) pour que toutes les demandes soient envoyées à 127.0.0.1 sur le port que le proxy écoute. De cette façon, la demande ne sera pas envoyée directement à l'Internet mais sera traitée par le proxy.

Étape 2 Le proxy voit une nouvelle connexion, lit l'en-tête HTTP et voit la requête qu'il doit exécuter. Il exécute la requête.

Étape 3 Le mandataire reçoit une réponse à la demande. Il doit maintenant envoyer la réponse du web au client mais comment ?

alt text

Lien utile

Proxy de Mentalis : J'ai trouvé ce projet qui est un proxy (mais plus que ce que je voudrais). Je pourrais vérifier la source mais je voulais vraiment quelque chose de basique pour mieux comprendre le concept.

Proxy ASP : Je pourrais peut-être obtenir des informations par ici aussi.

Demande de réflecteur : Il s'agit d'un exemple simple.

Voici un Dépôt Git Hub avec un simple proxy Http .

0 votes

Je ne dispose pas d'une capture d'écran de 2008 en 2015. Désolé.

0 votes

En fait, il s'avère que archive.org le propose . Désolé de vous déranger.

94voto

dr. evil Points 12196

Je n'utiliserais pas HttpListener ou quelque chose comme ça, de cette façon vous rencontrerez beaucoup de problèmes.

Plus important encore, ce sera une énorme douleur à supporter :

  • Proxy Keep-Alives
  • SSL ne fonctionnera pas (de manière correcte, vous obtiendrez des popups)
  • Les bibliothèques .NET suivent strictement les RFC, ce qui entraîne l'échec de certaines requêtes (même si IE, FF et tout autre navigateur au monde fonctionnent).

Ce que vous devez faire, c'est :

  • Écouter un port TCP
  • Analyser la requête du navigateur
  • Extract Host se connecte à cet hôte au niveau TCP.
  • Transmettez tout dans les deux sens, sauf si vous voulez ajouter des en-têtes personnalisés, etc.

J'ai écrit deux proxies HTTP différents en .NET avec des exigences différentes et je peux vous dire que c'est la meilleure façon de procéder.

Mentalis le fait, mais leur code est un "spaghetti de délégués", pire que GoTo :)

1 votes

Quelle(s) classe(s) avez-vous utilisée(s) pour les connexions TCP ?

8 votes

@cameron TCPListener et SslStream.

2 votes

Pourriez-vous partager votre expérience sur les raisons pour lesquelles HTTPS ne fonctionne pas ?

36voto

Mark Cidade Points 53945

Vous pouvez en construire un avec le HttpListener pour écouter les demandes entrantes et la classe HttpWebRequest pour relayer les demandes.

0 votes

Où dois-je relayer ? Comment puis-je savoir où renvoyer l'information ? Le navigateur envoie à laisse dit 127.0.0.1:9999 le client à 9999 obtenir la demande et l'a envoyé à l'enchaînement. Obtenir une réponse... Ensuite, que fait le client ? Il envoie à quelle adresse ?

3 votes

Si vous utilisez HttpListener, vous écrivez simplement la réponse dans HttpListener.GetContext().Response.OutputStream. Il n'est pas nécessaire de se soucier de l'adresse.

0 votes

Intéressant, je vais vérifier de cette façon.

20voto

Vadym Stetsiak Points 1454

Le proxy peut fonctionner de la manière suivante.

Étape 1, configurer le client pour utiliser proxyHost:proxyPort.

Le proxy est un serveur TCP qui écoute sur proxyHost:proxyPort. Le navigateur ouvre une connexion avec le proxy et envoie une requête Http. Le proxy analyse cette requête et tente de détecter l'en-tête "Host". Cet en-tête indique au proxy où il doit ouvrir la connexion.

Étape 2 : Le proxy ouvre une connexion à l'adresse spécifiée dans l'en-tête "Host". Puis il envoie une requête HTTP à ce serveur distant. Il lit la réponse.

Étape 3 : Une fois la réponse lue depuis le serveur HTTP distant, le proxy envoie la réponse via une connexion TCP ouverte précédemment avec le navigateur.

Schématiquement, cela ressemblera à ceci :

Browser                            Proxy                     HTTP server
  Open TCP connection  
  Send HTTP request  ----------->                       
                                 Read HTTP header
                                 detect Host header
                                 Send request to HTTP ----------->
                                 Server
                                                      <-----------
                                 Read response and send
                   <-----------  it back to the browser
Render content

14voto

Dean North Points 1215

Si vous cherchez simplement à intercepter le trafic, vous pouvez utiliser le noyau fiddler pour créer un proxy...

http://fiddler.wikidot.com/fiddlercore

Exécutez d'abord fiddler avec l'interface utilisateur pour voir ce qu'il fait, c'est un proxy qui vous permet de déboguer le trafic http/https. Il est écrit en C# et possède un noyau que vous pouvez intégrer dans vos propres applications.

N'oubliez pas que FiddlerCore n'est pas gratuit pour les applications commerciales.

6voto

Alireza Rinan Points 19

D'accord avec dr evil si vous utilisez HTTPListener vous aurez beaucoup de problèmes, vous devrez analyser les requêtes et serez engagé dans les en-têtes et ...

  1. Utiliser l'écouteur tcp pour écouter les demandes du navigateur.

  2. analyser seulement la première ligne de la requête et obtenir l'hôte, le domaine et le port pour se connecter.

  3. envoyer la requête brute exacte à l'hôte trouvé sur la première ligne de la requête du navigateur

  4. recevoir les données du site cible (j'ai un problème dans cette section)

  5. envoyer les données exactes reçues de l'hôte au navigateur

vous voyez que vous n'avez même pas besoin de savoir ce que contient la requête du navigateur et de l'analyser, il suffit de récupérer l'adresse du site cible à partir de la première ligne La première ligne ressemble généralement à ceci GET http://google.com HTTP1.1 ou CONNECT facebook.com:443 (pour les requêtes ssl)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X