Python перехватывает веб-трафик из браузера

Я пытаюсь создать простое приложение веб-фильтрации в python. Я хочу сделать это, чтобы отслеживать трафик на портах tcp 80/443 (http), и если есть трафик, я хочу проверить что-то, прежде чем я позволю ему пройти. Если это не удается проверить, я хотел бы, чтобы пользователь был перенаправлен на страницу по моему выбору.

поэтому мой вопрос в том, когда пользователь посещаетhttp://www.google.com в браузере есть ли способ, которым я могу перехватить этот запрос, и есть ли способ можете перенаправить их на другую страницу по моему выбору?

3 ответов


вам нужно написать веб-прокси и установить прокси-сервер веб-клиентов в http://localhost:8000/ (или то, что прослушивает прокси).

ваш веб-клиент будет отправлять HTTP следующим образом:

GET http://www.google.com

вашему прокси, который он должен затем переписать как:

GET/

и отправить на www.google.com, получение ответа, а затем отправка его обратно в исходный сокет в клиент. Обратите внимание, что объяснение значительно упрощается.

в любом случае, его все стандартные вещи, и я подозреваю, что веб-прокси Python уже существуют для вас, чтобы взломать.

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


Это блоге я написал некоторое время назад. использование webob и пасты. TransparentProxy пересылает запрос на любой url-адрес, указанный в запросе. Вы можете написать промежуточное ПО, чтобы сделать что-то с запросом, прежде чем он будет передан transparentproxy.

затем просто установите настройки прокси-сервера браузеров на любой адрес, на котором работает ваш прокси-сервер.

этот пример печатает запрос и ответ, для вашего случая, вы хотите проверить статус ответа для 404 или 302 или что-то еще и отправка в код, который вы пишете.

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:

вот пример промежуточного программного обеспечения, которое я написал, чтобы я мог перехватить путь и вернуть другой ответ. Я использую это для тестирования тяжелого приложения javascript, которое жестко закодировано для производства, я перехватываю конфигурацию.js и выведите мой собственный, который имеет 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)

и в качестве примера я бы инициализировать его как так....

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

Если это конкретный веб-сайт, например google.com, вы всегда можете poision файл hosts. Это было бы уродливым, но простым решением.

Если это go, он находится в:

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

и etc на linux, не уверен, были, хотя...