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

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

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

3 ответа

Решение

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

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

ПОЛУЧИТЕ http://www.google.com/

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

ПОЛУЧИТЬ /

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

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

Изменить: http://proxies.xhaus.com/python/

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

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

В этом примере печатается запрос и ответ, для вашего случая вы хотите проверить статус ответа для 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)

редактировать:

Вот пример промежуточного программного обеспечения, которое я написал, чтобы я мог перехватить путь и вернуть другой ответ. Я использую это для тестирования тяжелого javascript-приложения, которое жестко запрограммировано для производства, я перехватываю config.js и вывожу свой собственный, который имеет специфичные для юнит-тест настройки.

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, вы всегда можете найти файл hosts. Это было бы уродливым, но простым решением.

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

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

Это также в etc на Linux, не уверен, что были, хотя...

Другие вопросы по тегам