Domanda

Ho scaricato Privoxy poche settimane fa e per divertimento ero curioso di sapere come si può fare una versione semplice di esso.

Comprendo che devo configurare il browser (client) per inviare la richiesta al proxy. Il proxy invia la richiesta al web (supponiamo che sia un proxy http). Il proxy riceverà la risposta ... ma come può il proxy rispedire la richiesta al browser (client)?

Ho cercato sul web C # e proxy HTTP ma non ho trovato qualcosa che mi permetta di capire come funziona correttamente dietro la scena. (Credo di non voler un proxy inverso ma non ne sono sicuro).

Qualcuno di voi ha qualche spiegazione o alcune informazioni che mi permetteranno di continuare questo piccolo progetto?

Aggiornamento

Questo è quello che ho capito (vedi grafico sotto).

Passaggio 1 Configuro il client (browser) affinché tutte le richieste vengano inviate a 127.0.0.1 sulla porta in ascolto del proxy. In questo modo, la richiesta non verrà inviata direttamente a Internet ma verrà elaborata dal proxy.

Passaggio 2 Il proxy vede una nuova connessione, legge l'intestazione HTTP e vede la richiesta che deve eseguire. Esegue la richiesta.

Passaggio 3 Il proxy riceve una risposta dalla richiesta. Ora deve inviare la risposta dal web al client, ma come ???

alt text

Link utile

Mentalis Proxy : ho trovato questo progetto che è un proxy (ma altro che vorrei). Potrei controllare la fonte ma volevo davvero qualcosa di base per capire meglio il concetto.

Proxy ASP : potrei essere in grado di ottenere alcune informazioni anche qui .

Richiedi riflettore : questo è un semplice esempio.

Ecco un Git Hub Repository con un semplice proxy HTTP .

È stato utile?

Soluzione

Puoi crearne uno con HttpListener per ascoltare le richieste in arrivo e la < code> HttpWebRequest classe per inoltrare le richieste.

Altri suggerimenti

Non userei HttpListener o qualcosa del genere, in questo modo incontrerai così tanti problemi.

Soprattutto, sarà un grande dolore supportare:

  • Proxy Keep-Alives
  • SSL non funzionerà (in modo corretto, otterrai popup)
  • Le librerie .NET seguono rigorosamente le RFC che causano il fallimento di alcune richieste (anche se IE, FF e qualsiasi altro browser al mondo funzioneranno.)

Quello che devi fare è:

  • Ascolta una porta TCP
  • Analizza la richiesta del browser
  • Estrai Host connettiti a quell'host a livello TCP
  • Inoltra tutto avanti e indietro a meno che tu non voglia aggiungere intestazioni personalizzate ecc.

Ho scritto 2 diversi proxy HTTP in .NET con requisiti diversi e posso dirti che questo è il modo migliore per farlo.

Mentalis lo sta facendo, ma il loro codice è "delegate spaghetti", peggio di GoTo :)

Di recente ho scritto un proxy leggero in c # .net usando TcpListener e TcpClient .

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

Supporta HTTP sicuro nel modo corretto, la macchina client deve fidarsi del certificato radice usato dal proxy. Supporta anche il relay WebSocket. Tutte le funzionalità di HTTP 1.1 sono supportate ad eccezione del pipelining. Il pipelining non è comunque utilizzato dalla maggior parte dei browser moderni. Supporta anche l'autenticazione di Windows (semplice, digest).

Puoi collegare la tua applicazione facendo riferimento al progetto e quindi vedere e modificare tutto il traffico. (Richiesta e risposta).

Per quanto riguarda le prestazioni, l'ho testato sulla mia macchina e funziona senza alcun ritardo evidente.

Il proxy può funzionare nel modo seguente.

Passaggio 1, configura il client per utilizzare proxyHost: proxyPort.

Proxy è un server TCP in ascolto su proxyHost: proxyPort. Il browser apre la connessione con il proxy e invia la richiesta HTTP. Il proxy analizza questa richiesta e cerca di rilevare " Host " intestazione. Questa intestazione dirà al proxy dove aprire la connessione.

Passaggio 2: il proxy apre la connessione all'indirizzo specificato in " Host " intestazione. Quindi invia la richiesta HTTP a quel server remoto. Legge la risposta.

Passaggio 3: dopo aver letto la risposta dal server HTTP remoto, il proxy invia la risposta tramite una connessione TCP aperta in precedenza con il browser.

Schematicamente sembrerà così:

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

Se stai solo cercando di intercettare il traffico, potresti usare il nucleo di violinista per creare un proxy ...

http://fiddler.wikidot.com/fiddlercore

esegui prima il violinista con l'interfaccia utente per vedere cosa fa, è un proxy che ti consente di eseguire il debug del traffico http / https. È scritto in c # e ha un nucleo che puoi integrare nelle tue applicazioni.

Tieni presente che FiddlerCore non è gratuito per applicazioni commerciali.

Le cose sono diventate davvero facili con OWIN e WebAPI. Nella mia ricerca di un server proxy C #, mi sono anche imbattuto in questo post http://blog.kloud.com.au/2013/11/24/do-it-yourself-web-api-proxy/ . Questa sarà la strada che sto prendendo.

Accetta il dr male se usi HTTPListener avrai molti problemi, dovrai analizzare le richieste e sarai coinvolto nelle intestazioni e ...

  1. Utilizza il listener tcp per ascoltare le richieste del browser
  2. analizza solo la prima riga della richiesta e consente al dominio host e alla porta di connettersi
  3. invia l'esatta richiesta non elaborata all'host trovato sulla prima riga della richiesta del browser
  4. riceve i dati dal sito di destinazione (ho un problema in questa sezione)
  5. invia i dati esatti ricevuti dall'host al browser

vedi che non devi nemmeno sapere cosa c'è nella richiesta del browser e analizzarlo, ottieni solo l'indirizzo del sito di destinazione dalla prima riga la prima riga di solito piace questo OTTIENI http://google.com HTTP1.1 o CONNECT facebook.com:443 (questo è per richieste SSL)

Socks4 è un protocollo molto semplice da implementare. Ascolti la connessione iniziale, ti connetti all'host / porta richiesta dal client, invii il codice di successo al client, quindi inoltri i flussi in uscita e in entrata attraverso i socket.

Se vai con HTTP dovrai leggere e possibilmente impostare / rimuovere alcune intestazioni HTTP in modo che sia un po 'più di lavoro.

Se ricordo bene, SSL funzionerà su proxy HTTP e Socks. Per un proxy HTTP implementate il verbo CONNECT, che funziona in modo molto simile a socks4 come descritto sopra, quindi il client apre la connessione SSL attraverso il flusso tcp proxy.

Il browser è collegato al proxy, quindi i dati che il proxy ottiene dal server Web vengono inviati tramite la stessa connessione che il browser ha avviato al proxy.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top