我正在尝试在python中创建一个简单的Web过滤应用程序。我想这样做的方法是监控端口tcp 80/443(http)上的流量,如果有流量,我想在检查之前检查一下。如果检查失败,我希望将用户重定向到我选择的页面。
所以我的问题是,当用户在浏览器中访问http://www.google.com时,是否有一种方法可以拦截该请求,是否可以通过我的选择将其重定向到另一个页面?
答案 0 :(得分:7)
您需要编写Web代理,并将您的Web客户端代理服务器设置为http://localhost:8000/(或代理正在侦听的任何内容)。
您的网络客户端将发送如下HTTP:
到您的代理,然后必须将其重写为:
GET /
然后发送到www.google.com,获取响应,然后将原始套接字上的回复发送给客户端。请注意,大大简化了解释。
无论如何,它的所有标准内容都让我怀疑Python网络代理已经存在。
答案 1 :(得分:3)
这是我前一段时间写的blog post。使用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)
修改强>
这是我写的中间件的一个例子,所以我可以拦截路径并返回不同的响应。我用它来测试一个为生产硬编码的javascript繁重的应用程序,我拦截了config.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)
答案 2 :(得分:1)
如果是特定网站,例如google.com,您可以随时查看主机文件。这将是一个丑陋而简单的解决方案。
如果它是一个去,它位于:
C:/windows/system32/drivers/hosts.txt
它也在linux上etc
,但不确定是否......