15

Python で簡単な Web フィルタリング アプリを作成しようとしています。これを行う方法は、ポート tcp 80/443 (http) のトラフィックを監視することです。トラフィックがある場合は、通過させる前に何かを確認したいと考えています。チェックに失敗した場合、ユーザーが選択したページにリダイレクトされるようにしたいと考えています。

だから私の質問は、ユーザーがブラウザでhttp://www.google.comにアクセスしたときに、そのリクエストを傍受できる方法はありますか?また、選択した別のページにリダイレクトできる方法はありますか?

4

3 に答える 3

10

Web プロキシを記述し、Web クライアントのプロキシ サーバーをhttp://localhost:8000/ (またはプロキシがリッスンしているもの) に設定する必要があります。

次に、Web クライアントは次のように HTTP を送信します。

GET http://www.google.com

プロキシに次のように書き換える必要があります。

得る /

www.google.com に送信し、応答を取得してから、元のソケットでクライアントに送り返します。説明が大幅に簡略化されていることに注意してください。

とにかく、それはすべて標準的なものであり、ハッキングするためのPython Webプロキシがすでに存在していると思います.

編集: http://proxies.xhaus.com/python/

于 2011-01-23T09:19:56.267 に答える
4

少し前に書いたブログ記事から。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)
于 2011-01-23T17:19:33.030 に答える
1

google.com などの特定の Web サイトの場合は、常にホスト ファイルを無効にすることができます。それは醜いが単純な解決策です。

それが行くなら、それはにあります:

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

Linuxにもetcありますが、確かではありません...

于 2013-10-29T20:20:55.567 に答える