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, не уверен, что были, хотя...