Python перехватывает веб-трафик из браузера
Я пытаюсь создать простое приложение веб-фильтрации в python. Я хочу сделать это, чтобы отслеживать трафик на портах tcp 80/443 (http), и если есть трафик, я хочу проверить что-то, прежде чем я позволю ему пройти. Если это не удается проверить, я хотел бы, чтобы пользователь был перенаправлен на страницу по моему выбору.
поэтому мой вопрос в том, когда пользователь посещаетhttp://www.google.com в браузере есть ли способ, которым я могу перехватить этот запрос, и есть ли способ можете перенаправить их на другую страницу по моему выбору?
3 ответов
вам нужно написать веб-прокси и установить прокси-сервер веб-клиентов в http://localhost:8000/ (или то, что прослушивает прокси).
ваш веб-клиент будет отправлять HTTP следующим образом:
вашему прокси, который он должен затем переписать как:
GET/
и отправить на www.google.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, не уверен, были, хотя...