¿Cómo crear un proxy simple en C#?


He descargado Privoxy hace unas semanas y por diversión tenía curiosidad por saber cómo se puede hacer una versión simple de la misma.

Entiendo que necesito configurar el navegador (cliente) para enviar la solicitud al proxy. El proxy envía la solicitud a la web (digamos que es un proxy http). El proxy recibirá la respuesta... pero, ¿cómo puede el proxy devolver la solicitud al navegador (cliente)?

Tengo una búsqueda en la web para C # y http proxy pero no he encontrado algo que me permita entender cómo funciona detrás de la escena correctamente. (Creo que no quiero un proxy inverso, pero no estoy seguro).

¿Alguno de ustedes tiene alguna explicación o alguna información que me permita continuar este pequeño proyecto?

Actualizar

Esto es lo que entiendo (ver el gráfico a continuación).

Paso 1 Configuro el cliente (navegador) para que todas las solicitudes se envíen a 127.0.0.1 en el puerto que escucha el Proxy. De esta manera, la solicitud no se enviará directamente a Internet pero será procesado por el proxy.

Step2 El proxy ve una nueva conexión, lee el encabezado HTTP y ve la petición que debe ejecutar. Él ejecuta la solicitud.

Step3 El proxy recibe una respuesta de la solicitud. Ahora debe enviar la respuesta desde la web al cliente pero ¿cómo???

texto alt

Enlace útil

Mentalis Proxy : He encontrado este proyecto que es un proxy (pero más que me gustaría). Podría comprobar el pero realmente quería algo básico para entender más el concepto.

ASP Proxy : Podría ser capaz de obtener alguna información aquí también.

Request reflector : Este es un ejemplo sencillo.

Aquí hay un Repositorio Git Hub con un Proxy Http Simple.

Author: Patrick Desjardins, 2008-10-22

10 answers

Usted puede construir uno con el HttpListener clase para escuchar las solicitudes entrantes y el HttpWebRequest clase para transmitir las peticiones.

 32
Author: Mark Cidade,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-22 17:34:06

No usaría HttpListener o algo así, de esa manera te encontrarás con muchos problemas.

Lo más importante será un gran dolor de apoyar:

  • Proxy Keep-Alives
  • SSL no funcionará (de una manera correcta, obtendrá ventanas emergentes)
  • Las bibliotecas.NET siguen estrictamente los RFC, lo que hace que algunas solicitudes fallen (a pesar de que IE, FF y cualquier otro navegador del mundo funcionarán.)

Lo que necesitas hacer es:

  • Escuchar un puerto TCP
  • Analizar la solicitud del navegador
  • Extraer el host conectarse a ese host en el nivel TCP
  • Reenviar todo de ida y vuelta a menos que desee agregar encabezados personalizados, etc.

Escribí 2 proxies HTTP diferentes en.NET con diferentes requisitos y puedo decirte que esta es la mejor manera de hacerlo.

Mentalis haciendo esto, pero su código es "delegate spaghetti", peor que GoTo:)

 83
Author: dr. evil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-30 11:05:34

El proxy puede funcionar de la siguiente manera.

Paso 1, configure el cliente para usar proxyHost:proxyPort.

Proxy es un servidor TCP que está escuchando en proxyHost:proxyPort. El navegador abre la conexión con el proxy y envía una solicitud Http. El proxy analiza esta solicitud e intenta detectar el encabezado "Host". Este encabezado le dirá al Proxy dónde abrir la conexión.

Paso 2: El proxy abre la conexión a la dirección especificada en el encabezado "Host". Luego envía una solicitud HTTP a ese servidor remoto. Lee la respuesta.

Paso 3: Después de leer la respuesta desde el servidor HTTP remoto, el Proxy envía la respuesta a través de una conexión TCP abierta anteriormente con el navegador.

Esquemáticamente se verá así:

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
 19
Author: Vadym Stetsiak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-30 10:55:59

Recientemente he escrito un proxy ligero en c#. net usando TcpListener y TcpClient.

Https://github.com/titanium007/Titanium-Web-Proxy

Admite HTTP seguro de la manera correcta, la máquina cliente necesita confiar en el certificado raíz utilizado por el proxy. También soporta WebSockets relay. Todas las características de HTTP 1.1 son compatibles, excepto la canalización. Pipelining no es utilizado por la mayoría de los navegadores modernos de todos modos. También es compatible con la autenticación de Windows (plain, digerir).

Puede conectar su aplicación haciendo referencia al proyecto y luego ver y modificar todo el tráfico. (Solicitud y respuesta).

En cuanto al rendimiento, lo he probado en mi máquina y funciona sin ningún retraso notable.

 19
Author: Titanium,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-11 16:51:29

Si solo está buscando interceptar el tráfico, podría usar el núcleo fiddler para crear un proxy...

Http://fiddler.wikidot.com/fiddlercore

Ejecute fiddler primero con la interfaz de usuario para ver lo que hace, es un proxy que le permite depurar el tráfico http/https. Está escrito en c# y tiene un núcleo que puede construir en sus propias aplicaciones.

Tenga en cuenta que FiddlerCore no es gratuito para aplicaciones comerciales.

 12
Author: Dean North,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-20 16:11:55

Las cosas se han vuelto muy fáciles con OWIN y WebAPI. En mi búsqueda de un servidor Proxy C#, también me encontré con este post http://blog.kloud.com.au/2013/11/24/do-it-yourself-web-api-proxy / . Este será el camino que tomaré.

 6
Author: Jochen van Wylick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-19 12:34:00

De acuerdo con el dr. mal si usa HttpListener tendrá muchos problemas, tendrá que analizar las solicitudes y se comprometerá a las cabeceras y...

  1. Use tcp listener para escuchar las solicitudes del navegador
  2. analice solo la primera línea de la solicitud y obtenga el dominio host y el puerto para conectarse
  3. envíe la solicitud raw exacta al host encontrado en la primera línea de la solicitud del navegador
  4. recibir los datos del sitio de destino (tengo un problema en esta sección)
  5. enviar el datos exactos recibidos del host al navegador

Verá que no necesita ni siquiera saber qué hay en la solicitud del navegador y analizarla, solo obtenga la dirección del sitio de destino desde la primera línea a first line le gusta esto GET http://google.com HTTP1.1 o CONECTAR facebook. com: 443 (esto es para solicitudes ssl)

 5
Author: Alireza Rinan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-13 18:12:04

Socks4 es un protocolo muy sencillo de implementar. Usted escucha la conexión inicial, se conecta al host / puerto que fue solicitado por el cliente, envía el código de éxito al cliente y luego reenvía las transmisiones salientes y entrantes a través de sockets.

Si vas con HTTP tendrás que leer y posiblemente establecer/eliminar algunas cabeceras HTTP así que eso es un poco más de trabajo.

Si no recuerdo mal, SSL funcionará a través de proxies HTTP y Socks. Para un proxy HTTP se implementa la CONEXIÓN verbo, que funciona como el socks4 como se describió anteriormente, entonces el cliente abre la conexión SSL a través del flujo tcp proxy.

 4
Author: C.M.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-06-15 15:20:38

El navegador está conectado al proxy por lo que los datos que el proxy obtiene del servidor web se envían a través de la misma conexión que el navegador inició al proxy.

 2
Author: Stephen Caldwell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-11-03 16:15:52

También escribí un proxy inverso simple pero poderoso para asp.net / web api.

Lo puedes encontrar aquí: https://github.com/SharpTools/SharpReverseProxy

Simplemente agregue a su proyecto a través de nuget y ya está listo. Incluso puede modificar sobre la marcha la solicitud, la respuesta o denegar un reenvío debido a un error de autenticación.

Echa un vistazo al código fuente, es muy fácil de implementar:)

 2
Author: andrecarlucci,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-27 23:57:19