3

Web で PHP プロキシ スクリプトを探していますが、見つかりません。私が探し続けているのは、ページをダウンロードし、HTML の属性を編集srcし、hrefそれらがインストールされている Web サイトを参照する必要があるスクリプトだけです。これは必要ありません。すべてのリクエストをルーティングするようにブラウザを設定できるポートでリッスンする実際のプロキシが必要です。

私がやろうとしていることは次のとおりです。

  1. 自分のコンピューターのポートをリッスンする PHP スクリプトを実行する
  2. localhost:port をプロキシとして使用するように Web ブラウザを構成する
  3. PHP スクリプトにページをブラウザに提供させる

私が見つけた、PHP で書かれたいわゆるプロキシ スクリプトはすべて、要求されたページがXMLHttpRequestコンテンツの取得に使用されている場合、その要求がまったく表示されないため、惨めに失敗します。実際のプロキシでは不要な巧妙な JavaScript を挿入しない限り、リンクをいくら書き換えても問題は解決しません。

最終的に私が望むのは、ブラウザとリモート サーバーの間を行き来するリクエストとレスポンスにアクセスできるようにすることです。JavaScript、Cookie、Flash などに対するブラウザのサポートを使用できるようにしたいと考えています。基本的には、すべての通信にプログラムでアクセスして、PHP を使用して通信を分析または操作できるようにしたいと考えています。

だから、質問は

  • 検索結果にノイズが多すぎて、PHP に実装された実際のプロキシを見落としていませんか?
  • PHP に実際のプロキシがない場合は、作成してみたいと思います。正確に何をすべきかを学ぶのに役立つオンラインのリソースはありますか? (注、私は宗教的にRTMします:基本的なプロキシの警告とアーキテクチャをもっと探しています)

リンクは大歓迎です。MITMプロキシがいくつかあることは知っていますが、PHPで1つ欲しいです。

PHPの組み込みWebサーバーで何かできるかどうかはわかりませんが、それも台無しにします。

アップデート

期待を示し始めているPHP組み込みWebサーバー用のルータースクリプトを入手しました。Web サーバーを起動して、Web ブラウザーにプロキシとして使用するように指示できます。私が作成したルーター スクリプトは、ローカル リソースと外部リソースを区別し、どちらの場合も簡単に処理できるようにします。私が持っている唯一の問題はhttpsです。サーバーが報告しますInvalid Request (Malformed HTTP Request)。これは、スクリプトと設定だけでは、このサーバーが https をまったく実行しないことを意味すると思います。知らない。Apache でできるかもしれませんが、透過的に https をプロキシするのは難しいように思えます。特に、データがブラウザに到達する前に変更したい場合はなおさらです。

AtropaToolbox/php_router/router.php Web サーバーに組み込まれた PHP が指すルーター スクリプトは、他のファイルから実際のクラスを取得します。

<?php
require_once('AtropaToolbox/php_proxy/proxy.php');

$proxy = new atropa_proxy();

if($proxy->process_request() === false) {
    return false;
}

?>

AtropaToolbox/php_proxy/proxy.php atropa_mod_proxy を拡張してハンドラーを再定義します。

<?php
require_once('AtropaToolbox/php_proxy/mod_proxy.php');

class atropa_proxy extends atropa_mod_proxy 
{
    protected function local_resource_handler() {
        return false;
    }

    protected function external_resource_handler() {
        $ext = $this->get_page();
        //echo '<pre>' . print_r($ext, true) . '</pre>';
        //$ext['page'] = preg_replace('/<a /', '<p ', $ext['page']);
        $this->show_page($ext);
    }
}
?>

AtropaToolbox/php_proxy/mod_proxy.php 汎用ルーター スクリプト

<?php
/**
 * Rev. 1 Atropa mod_proxy for php built in webserver
 */
class atropa_mod_proxy
{
    protected function is_external_resource() {
        $host = parse_url($_SERVER['REQUEST_URI'], PHP_URL_HOST);
        if(isset($host) && $host !== $_SERVER['SERVER_NAME']) {
            return true;
        } else {
            return false;
        }
    }

    protected function local_resource_handler() {
        return false;
    }

    protected function external_resource_handler() {
        $ext = $this->get_page();
        $this->show_page($ext);
    }

    public function process_request() {
        if($this->is_external_resource()) {
            return $this->external_resource_handler();
        } else {
            return $this->local_resource_handler();
        }
    }

    public function get_request_headers() {
        $arr = array();
        foreach($_SERVER as $svar => $sval) {
            if(substr($svar, 0, 4) === 'HTTP') {
                $svar = substr($svar, 5);
                $svar = preg_replace('/_/', ' ', $svar);
                $svar = ucwords(strtolower($svar));
                $svar = preg_replace('/ /', '-', $svar);
                $arr[$svar] = $sval;
            }
        }
        return $arr;
    }

    public function pack_request_headers($headers_array) {
        $packed = '';
        foreach($headers_array as $header_name => $header_value) {
            $packed .= $header_name . ': ' . $header_value . "\r\n";
        }
        return $packed;
    }

    public function echo_response_headers($http_response_header_array) {
        foreach($http_response_header_array as $val) {
            if(strpos(strtolower($val), 'connection') !== 0) {
                header($val);
            }
        }
    }

    protected function get_page() {
        $request_headers = $this->get_request_headers();
        $request_headers = $this->pack_request_headers($request_headers);
        $method = $_SERVER["REQUEST_METHOD"];
        $scheme = parse_url($_SERVER['REQUEST_URI'], PHP_URL_SCHEME);
        $opts = array(
            $scheme => array(
                'method' => $method,
                'header' => $request_headers
            )
        );
        if(count($_POST) > 0) {
            $content = http_build_query($_POST);
            $opts[$scheme]['content'] = $content;
        }
        $context = stream_context_create($opts);
        $ext = array();
        $ext['page'] = file_get_contents($_SERVER['REQUEST_URI'], false, $context);
        $ext['http_response_header'] = $http_response_header;
        return $ext;
    }

    protected function show_page($ext) {
        header_remove();
        $this->echo_response_headers($ext['http_response_header']);
        echo $ext['page'];
    }
}
?>
4

1 に答える 1

3

PHPを使用したソケットプログラミングとPHPのソケットの概要をお読みください。PHPデーモンを実行して、 PHPがポートをリッスンし、すべてのリクエストを処理できるようにします。

これを行うには、http://sourceforge.net/projects/poxy/を参照して、PHPデーモンをそこに置くことができます。また、プロキシがクライアントとどのように通信するかを学ぶ必要があります。PoxyはWebベースのアプリケーションであり、URLを入力すると、URLが読み込まれます。ポートをリッスンすることはできず、phpデーモンではないため、PHPデーモンプロキシ用に多くのコーディングを行う必要があります。

于 2012-09-16T18:52:42.367 に答える