2011-01-23 141 views
9

Tôi đang cố tạo một ứng dụng lọc web đơn giản trong python. Cách tôi muốn làm điều này là để theo dõi lưu lượng truy cập trên cổng tcp 80/443 (http) và nếu có lưu lượng truy cập, tôi muốn kiểm tra một cái gì đó trước khi tôi để cho nó đi qua. Nếu nó không kiểm tra, tôi muốn cho người dùng được chuyển hướng đến một trang mà tôi chọn. Vì vậy, câu hỏi của tôi là, khi người dùng truy cập http://www.google.com trong trình duyệt, có cách nào để tôi có thể chặn yêu cầu đó và có cách nào để tôi có thể chuyển hướng họ đến một trang khác theo lựa chọn của tôi không? Không.Ngăn chặn giao diện web của Python từ trình duyệt

Trả lời

7

Bạn cần phải viết proxy web và đặt máy chủ proxy của máy khách web của bạn thành http://localhost:8000/ (hoặc bất kỳ proxy nào đang nghe).

client web của bạn sau đó sẽ gửi HTTP như thế này:

GET http://www.google.com

để proxy của bạn mà nó sau đó phải viết lại như sau:

GET/

và gửi vào www. google.com, nhận phản hồi và sau đó gửi nó trở lại ổ cắm ban đầu cho máy khách. Lưu ý rằng giải thích được đơn giản hóa ồ ạt.

Dù sao, tất cả các công cụ chuẩn của nó và tôi nghi ngờ các proxy web Python đã tồn tại để bạn có thể hack.

Edit: http://proxies.xhaus.com/python/

+1

Cảm ơn spacedman. Vì đây là một bộ lọc, nếu tôi muốn chắc chắn rằng không ai vô hiệu hóa proxy, làm thế nào tôi có thể làm điều đó? Có cách nào để đặt mục tiêu mặc định cho trình duyệt ở lại với proxy của tôi không? – Sam

+0

Nevermind. Tìm thấy những gì tôi đang tìm kiếm - chặn proxy – Sam

+0

** scapy ** sẽ không thực hiện tác vụ này? hãy xem chủ đề của tôi: http://stackoverflow.com/questions/9774525/how-to-filter-sniff-out-web-pages-according-to-datatext-contained –

3

này là từ một blog post tôi đã viết một khi trở lại. sử dụng webob và dán. TransparentProxy chuyển tiếp yêu cầu tới bất kỳ url nào mà yêu cầu chỉ định. Bạn có thể viết phần mềm trung gian để làm điều gì đó với yêu cầu trước khi nó được chuyển giao cho transparentproxy.

Sau đó, chỉ cần đặt cài đặt proxy trình duyệt của bạn thành địa chỉ bất kỳ mà proxy của bạn đang chạy.

ví dụ này in yêu cầu và phản hồi, trong trường hợp của bạn, bạn muốn kiểm tra trạng thái phản hồi cho 404 hoặc 302 hoặc bất kỳ điều gì và gửi đến mã bạn viết.

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) 

chỉnh sửa:

Dưới đây là một ví dụ về middleware tôi đã viết để tôi có thể đánh chặn một đường dẫn và trả về một phản ứng khác nhau. Tôi sử dụng điều này để kiểm tra một ứng dụng nặng javascript được mã hóa cứng cho sản xuất, tôi chặn tệp config.js và đầu ra của riêng mình có cài đặt cụ thể không nhất thiết.

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) 

và là một ví dụ tôi sẽ khởi tạo nó như vậy ....

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

Nếu đó là một trang web cụ thể, như google.com, bạn luôn có thể poision các tập tin host. Nó sẽ là một giải pháp xấu xí nhưng đơn giản.

Nếu đó là một đường đi, nó nằm trong:

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

Nó cũng trong etc trên Linux, không chắc chắn là mặc dù ...

Các vấn đề liên quan