Python перехватывает веб-трафик из браузера - PullRequest
10 голосов
/ 23 января 2011

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

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

Ответы [ 3 ]

7 голосов
/ 23 января 2011

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

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

GET http://www.google.com

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

GET /

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

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

Редактировать: http://proxies.xhaus.com/python/

3 голосов
/ 23 января 2011

Это из сообщения в блоге Я писал некоторое время назад.используя 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)

edit:

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

 app = FileIntercept(TransparentProxy(),
                             file_intercept={"/js/config.js":Response("/*new settings*/")})
 httpserver.serve(HTTPMiddleware(app), "0.0.0.0", port=8088)
1 голос
/ 30 октября 2013

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

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

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

Он также в etc на Linux, хотя, конечно, не было ...

...