Pregunta

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

Comprendo 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)? ??

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

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

Actualizar

Esto es lo que entiendo (vea 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, sino que será procesada por el proxy.

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

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

alt text

Enlace útil

Mentalis Proxy : he encontrado este proyecto que es un proxy (pero más que me gustaria). Podría verificar la fuente, pero realmente quería algo básico para entender más el concepto.

Proxy ASP : es posible que pueda obtener información aquí también .

Reflector de solicitud : este es un ejemplo simple.

Aquí hay un Repositorio de Git Hub con un proxy de HTTP simple .

¿Fue útil?

Solución

Puede crear uno con HttpListener para escuchar las solicitudes entrantes y la < código> HttpWebRequest para retransmitir las solicitudes.

Otros consejos

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

Lo más importante es que será un gran dolor apoyar:

  • Proxy Keep-Alives
  • SSL no funcionará (de manera correcta, obtendrá ventanas emergentes)
  • Las bibliotecas .NET siguen estrictamente las RFC, lo que hace que algunas solicitudes fallen (aunque IE, FF y cualquier otro navegador en el mundo funcionará).

Lo que debes hacer es:

  • Escucha un puerto TCP
  • Analizar la solicitud del navegador
  • Extraer el host se conecta a ese host en el nivel TCP
  • Reenvíe todo hacia adelante y hacia atrás a menos que desee agregar encabezados personalizados, etc.

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

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

Recientemente escribí un proxy ligero en c # .net usando TcpListener y TcpClient .

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

Es compatible con HTTP seguro de la manera correcta, la máquina cliente necesita confiar en el certificado raíz que usa el proxy. También es compatible con WebSockets relé. Todas las características de HTTP 1.1 son compatibles, excepto la canalización. La canalización no es utilizada por la mayoría de los navegadores modernos de todos modos. También es compatible con la autenticación de Windows (sin formato, resumen).

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.

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 " Host " encabezamiento. Este encabezado le dirá a Proxy dónde abrir la conexión.

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

Paso 3: Después de leer la respuesta del 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

Si solo está buscando interceptar el tráfico, puede usar el núcleo de Fiddler para crear un proxy ...

http://fiddler.wikidot.com/fiddlercore

ejecuta fiddler primero con la interfaz de usuario para ver lo que hace, es un proxy que te 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.

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

Estoy de acuerdo con el malvado Si usa HTTPListener tendrá muchos problemas, tendrá que analizar las solicitudes y estará comprometido con los encabezados y ...

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

ve que no necesita 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 primera linea usualmente le gusta esto OBTENGA http://google.com HTTP1.1 o CONECTAR facebook.com:443 (esto es para solicitudes ssl)

Socks4 es un protocolo muy simple de implementar. Escuchas la conexión inicial, te conectas al host / puerto solicitado por el cliente, envías el código de éxito al cliente y luego envías las secuencias salientes y entrantes a través de sockets.

Si vas con HTTP, tendrás que leer y posiblemente configurar / eliminar algunos encabezados HTTP, por lo que es un poco más de trabajo.

Si recuerdo correctamente, SSL funcionará a través de proxies HTTP y Socks. Para un proxy HTTP, implementa el verbo CONECTAR, que funciona de manera muy similar a socks4 como se describe anteriormente, luego el cliente abre la conexión SSL a través de la secuencia de TCP con proxy.

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ó con el proxy.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top