2011-01-23 7 views
9

私はPythonで単純なWebフィルタリングアプリケーションを作成しようとしています。私がこれをやりたいのは、ポートtcp 80/443(http)のトラフィックを監視することです。もしトラフィックがあるなら、それを通過させる前に何かをチェックしたいと思います。チェックに失敗した場合は、自分が選択したページにリダイレクトされるようにします。ブラウザからのPythonインターセプトWebトラフィック

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

答えて

7

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

あなたのWebクライアントは、このようにHTTPを送信します:

が、それは、その後のように書き換える必要がありますあなたのプロキシに

http://www.google.comをGET:

GET/

とWWWへ送ります。レスポンスを取得して元のソケットでクライアントに送信します。説明は大幅に簡略化されていることに注意してください。

とにかく、そのすべての標準的なものと、私はPythonのWebプロキシがあなたのためにすでに存在していると思われます。

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

+1

ありがとう。これはフィルタのためのものなので、誰もプロキシを無効にしないようにするにはどうしたらいいですか?私のプロキシにブラウザのデフォルトターゲットを残す方法はありますか? – Sam

+0

心配しないでください。私が探していたものが見つかりました - プロキシを傍受する – Sam

+0

** scapy **はこの作業を行いませんか?私のトピックを見てください:http://stackoverflow.com/questions/9774525/how-to-filter-sniff-out-web-pages-according-to-datatext-contained –

3

は、これは私がしばらく前に書いたblog postからです。 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をインターセプトし、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) 

と、例として、私はそうのようにそれを初期化するだろう、それはgoogle.comのような特定のウェブサイト、だ

app = FileIntercept(TransparentProxy(), 
          file_intercept={"/js/config.js":Response("/*new settings*/")}) 
httpserver.serve(HTTPMiddleware(app), "0.0.0.0", port=8088) 
0

場合......、あなたは常にhostsファイルをpoisionことができます。それは醜いしかし単純な解決策になります。

それが行くなら、次の場所にあります:

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

それは確かかかわらたためではなく、Linux上でetcでもあります...