2006年12月25日

phpで最も簡単にproxyを越える方法 このエントリーをはてなブックマークに追加

こんにちは、小林稔侍です(嘘です)。

大学とか企業とかにはたいていproxyサーバが存在している。以前も説明したが、proxyサーバは所謂代理サーバ的な存在であり、自分のマシンやサーバを直接インターネット上に晒すのではなく、代理でひとつのサーバ(場合によってはDNSラウンドロビン機能などを利用して複数のサーバが使われるが)が代表してインターネット上の情報を取得してくるよーなものである。

このproxyサーバを使うと、上記のように自分のPCを直接インターネット上に晒さないという点で外部からの攻撃を直接受けにくくなるという利点がある。
ただし、インターネット上に公開されている情報を取得する際にproxyサーバを経由するため、ファイアーウォールの内側から外側の情報を取得するにも当然、proxyサーバを経由しなければならない。
なので、プログラミングをする際は、通常、自分でproxyを越えるためのコードを記述する必要がある。

socksなどの知見が明るい人であれば苦もなくそういったプログラムを記述できるものと思われるが、ここではりょーちが知る限り、最も簡単にproxy越しにインターネット上のデータを取得する方法を紹介するっす。

で、最も簡単な方法とは PukiWiki に付属しているproxy.phpを利用することである。
PukiWikiは最もよく知られたCMSツールなので、利用された方も多いのではないであろうか?
2006/12/25時点でのPukiWikiの最新バージョンは1.4.7である。
以下、PukiWiki付属のproxy.phpの利用方法を順に説明する。
また、ファイアウオールの内側からインターネット上のデータを取得するために用いるWebサーバはWindows系PCで設置が最も簡単な apache friends - xampp for windows を利用する。(xamppのインストールは完了しているものとする)

1. PukiWiki/Download/1.4.7 より、pukiwiki-1.4.7_notb_utf8.zip をダウンロード。
2. ダウンロードした pukiwiki-1.4.7_notb_utf8.zip をテキトーなディレクトリ上で解凍。
3. 解凍したフォルダ内の「lib」フォルダ内に「proxy.php」ファイルが存在するので、これを利用する
4. 3.の「proxy.php」をxampp上のドキュメントルート上のどこかテキトーなフォルダ(例えば「test」にコピーする。( http://localhost/test/ で接続てきるところ)
5. testフォルダ内にindex.phpを下記のよーに作成する。その際、文字コードはUTF-8に設定しておく。
6. index.phpには以下のようなコードを記載

<html>
<head>
<meta http-equiv="content-type"
 content="application/xhtml+xml; charset=UTF-8" />
<title>proxyを越えてデータを取得する方法</title>
</head>
<body>
<form method="get" action="./index.php">
<input type="text" size="70" 
name="url" value="http://ryouchi.seesaa.net/index.rdf" />
<input type="submit" value="取得" />
</form>
<?php
// $use_proxyの設定:
// proxy利用時は1,未使用時は0を設定する。
$use_proxy 1;
// $proxy_hostは利用しているHTTP proxyサーバを指定する
$proxy_host 'proxy.foo.univ.ac.jp';
// $proxy_portは利用しているHTTP proxyサーバのポートを指定する
$proxy_port 8080;
// $no_proxyはproxyを利用しない接続先を配列で記載する。
$no_proxy = array(    
'localhost',        // localhost     
'127.0.0.0/8',      // loopback
);


//PukiWikiのlibフォルダ内のproxy.phpをカレントディレクトリにおいておく
include('proxy.php');
if (
$_GET['url']<>""){
    

    // 入力したURLからヘッダ情報を含めて全て取得する
    
$httpRawData http_request($_GET['url']);
    

    // $httpRawData の中から実際のデータ部分のみを取得する。
    
    // ヘッダ他の情報を見たいときは、下記のコメント文を外してみて
    // print_r($httpRawData);
    
$httpContents $httpRawData['data'];
    
// 必要に応じて文字コードの変換を行う(今回は説明が面倒なのでやんない)
    // mbstring関数付近を参照してちょうだい。

    //取得した情報をtextarea内で表示してみる
    
echo '<textarea rows="50" cols="70">';
    echo 
$httpContents;
    echo 
'</textarea>';
}
?>
</body>
</html>



これでproxyを越えて情報をGetできると思われる。

情報取得部分は「http_request」関数を利用しているっす。
$httpRawData には配列情報として取得されているので、print_r関数で中身を確認できると思われる。

ちなみに、はじめの「$use_proxy = 1」を「$use_proxy = 0」にするとproxyを経由せずにデータを取得することができる。ファイアウォールの内部でテストをするときは、「$use_proxy = 1」にして公開用のWebサーバなどで実行するときは、「$use_proxy = 0」にしておけばよいと思われる。

fsockopen()などを利用するより100倍は便利っす。
posted by りょーち | Comment(1) | TrackBack(0) | Web周辺技術
この記事へのコメント
これは走らせてみましたかね?ローカルで試してみましたが、色んなものがundefinedになるんですが。。。
Posted by 通りすがりさん at 2015年12月11日 19:00
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: