2011-01-23 28 views
9

Estoy tratando de crear una aplicación de filtrado web simple en python. La forma en que quiero hacer esto es monitorear el tráfico en los puertos tcp 80/443 (http) y si hay tráfico, quiero verificar algo antes de dejarlo pasar. Si falla el cheque, me gustaría redirigir al usuario a la página que elija.Python Intercept Web Traffic desde el navegador

Así que mi pregunta es, cuando el usuario visita http://www.google.com en el navegador, ¿hay alguna manera de que pueda interceptar esa solicitud, y hay una manera en que puedo redirigirlos a otra página por mi elección?

Respuesta

7

Necesita escribir un proxy web y configurar su servidor proxy de clientes web en http://localhost:8000/ (o lo que sea que el proxy esté escuchando).

Su cliente web podrá enviar HTTP como esto:

GET http://www.google.com

a su proxy que luego debe volver a escribir como:

GET/

y enviar a www. google.com, obteniendo la respuesta y luego enviándola al socket original al cliente. Tenga en cuenta que la explicación se simplifica enormemente.

De todos modos, es todo lo estándar y sospecho que los servidores proxy de Python ya existen para que los pirateen.

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

+1

Gracias spacedman. Como esto es para un filtro, si quiero asegurarme de que nadie deshabilita el proxy, ¿cómo puedo hacer eso? ¿Hay alguna manera de mantener el destino predeterminado para los navegadores con mi proxy? – Sam

+0

No importa. Encontré lo que estaba buscando - proxy de interceptación – Sam

+0

** scapy ** no hará esta tarea? eche un vistazo a mi tema: http://stackoverflow.com/questions/9774525/how-to-filter-sniff-out-web-pages-according-to-datatext-contained –

3

Se trata de un blog post que escribí hace un tiempo. usando webob y pegar. TransparentProxy reenvía la solicitud a cualquier url que especifique la solicitud. Puede escribir middleware para hacer algo con la solicitud antes de que se transfiera a transparentproxy.

Luego, simplemente establezca la configuración del proxy de su navegador en cualquier dirección en la que se ejecute su proxy.

Este ejemplo imprime la solicitud y la respuesta, para su caso, desea verificar el estado de respuesta de un 404 o 302 o lo que sea y enviarlo al código que escribe.

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) 

edición:

He aquí un ejemplo de middleware que escribí para que pudiera interceptar un camino y devolver una respuesta diferente. Utilizo esto para probar una aplicación pesada javascript que está codificada para producción, intercepto config.js y obtengo mi propio que tiene ajustes específicos de unittest.

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) 

y como ejemplo me inicializarlo como tal ....

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

Si se trata de un sitio web específico, como google.com, siempre se puede poision el archivo hosts. Sería una solución fea pero simple.

Si se trata de una oportunidad, que está ubicado en:

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

Es también en etc en Linux, no eran segura aunque ...

Cuestiones relacionadas