2011-01-23 3 views
9

che sto cercando di creare una semplice applicazione web filtering in python. Il modo in cui voglio farlo è quello di monitorare il traffico sulle porte TCP 80/443 (http) e se c'è traffico, voglio controllare una cosa prima di lasciarti andare attraverso. Se fallisce il controllo, mi piacerebbe per l'utente di essere reindirizzato a una pagina di mia scelta.Python Intercept traffico web dal browser

Quindi la mia domanda è, quando l'utente visita http://www.google.com nel browser, c'è un modo per intercettare quella richiesta, e c'è un modo per reindirli su un'altra pagina a mia scelta?

risposta

7

È necessario scrivere un proxy Web e impostare il server proxy dei client Web su http://localhost:8000/ (o qualunque sia il proxy in ascolto).

Il client web sarà quindi inviare HTTP come questo:

GET http://www.google.com

per il proxy cui deve poi riscrivere come:

GET/

e inviare a www. google.com, ottenendo la risposta e quindi rimandandola sul socket originale al client. Nota che la spiegazione è enormemente semplificata.

In ogni caso, la sua roba tutti gli standard e ho il sospetto Python proxy web esistono già per voi di incidere su.

Edit: http://proxies.xhaus.com/python/

+1

Grazie spacedman. Dato che questo è per un filtro, se voglio assicurarmi che nessuno disabiliti il ​​proxy, come posso farlo? C'è un modo per rendere il target predefinito per i browser rimanere con il mio proxy? – Sam

+0

Nevermind. Trovato quello che stavo cercando - intercettare il proxy – Sam

+0

** scapy ** non farà questo compito? si prega di dare un'occhiata al mio argomento: http://stackoverflow.com/questions/9774525/how-to-filter-sniff-out-web-pages-according-to-datatext-contained –

3

Questo è da una blog post ho scritto un po 'indietro. usando webob e incolla. TransparentProxy inoltra la richiesta a qualunque URL specificato dalla richiesta. È possibile scrivere il middleware per fare qualcosa con la richiesta prima che venga passata a transparentproxy.

Poi basta impostare il vostro browser impostazioni proxy a qualsiasi indirizzo il proxy è in esecuzione.

questo esempio stampa la richiesta e la risposta, per il vostro caso, si desidera controllare lo stato della risposta per un 404 o 302 o qualsiasi altra cosa e la spedizione al codice che si scrive.

from webob.dec import wsgify 
from paste import httpserver 
from paste.proxy import TransparentProxy 


def print_trip(request, response): 
    """ 
    just prints the request and response 
    """ 
    print "Request\n==========\n\n" 
    print str(request) 
    print "\n\n" 
    print "Response\n==========\n\n" 
    print str(response) 
    print "\n\n" 


class HTTPMiddleware(object): 
    """ 
    serializes every request and response 
    """ 

    def __init__(self, app, record_func=print_trip): 
     self._app = app 
     self._record = record_func 

    @wsgify 
    def __call__(self, req): 
     result = req.get_response(self._app) 
     try: 
      self._record(req.copy(), result.copy()) 
     except Exception, ex: #return response at all costs 
      print ex 
     return result 

httpserver.serve(HTTPMiddleware(TransparentProxy()), "0.0.0.0", port=8088) 

edit:

Ecco un esempio di middleware ho scritto così ho potuto intercettare un percorso e restituire una risposta diversa. Io uso questo per testare un'applicazione pesante javascript che è hardcoded per la produzione, io intercetto il config.js e produco il mio che ha unittest impostazioni specifiche.

class FileIntercept(object): 
    """ 
    wsgi: middleware 
    given request.path will call wsgi app matching that path instead 
    of dispatching to the wrapped application 
    """ 
    def __init__(self, app, file_intercept={}): 
     self._app = app 
     self._f = file_intercept 

    def __call__(self, environ, start_response): 
     request = Request(environ) 
     if request.path.lower() in self._f: 
      response = request.get_response(self._f[request.path.lower()]) 
     else: 
      response = request.get_response(self._app) 
     return response(environ, start_response) 

e come esempio vorrei inizializzare in questo modo ....

app = FileIntercept(TransparentProxy(), 
          file_intercept={"/js/config.js":Response("/*new settings*/")}) 
httpserver.serve(HTTPMiddleware(app), "0.0.0.0", port=8088) 
0

Se si tratta di un sito web specifico, come google.com, si può sempre Poision il file hosts. Sarebbe una soluzione brutta ma semplice.

Se si tratta di un andare, si trova in:

C:/windows/system32/drivers/hosts.txt 

E 'anche in etc su linux, non certo erano però ...