PHPでHTTPなパイプページ

目的

  • クロスドメインだとAJAXで何の対応もしていない旧式ページのUIを乗っ取れませんよねという場合に使います。
    • このPHPと同じドメインに置いたjavascriptファイルからこのPHPファイルにAJAXでPOSTにてアクセスを行うと指定のアドレスにPOSTしてくれます。結果をテキストで買えしてくれます。
    • 古くさくて悶絶しそうなシステムを使いのあなた!AjaxとこのファイルでUIを乗っ取ってみませんか?
    • ちなみに解析にはFireBugがおすすめです。
  • Cookieのファイルを置くディレクトリは本PHPと同じディレクトリに作って書き込み権限を与えてください。
    • あと、念のため接続先のドメインをハードコーディングしています。
    • postAddressに後続のパスを渡すとそこにリクエストしてくれます。

現物

<?php
$headers = getallheaders();
$domain = "ここにアクセス先ドメインを記述";
$postAddress=htmlspecialchars(@$_POST['postAddress']) ;//パスはここで渡して。POSTのみ対応
$url = 'https://'.$domain.'/'.$postAddress;
$COOKIE="COOKIE";
$jsession=htmlspecialchars(@$_COOKIE['JSESSIONID']) ;
$path = realpath( "." )."/cookie";
$cookiefile=!is_null($jsession)?$path."/".$COOKIE.$jsession:$path."/".$COOKIE;
$fp = fopen($cookiefile, "w"); 
fclose($fp);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true );
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiefile);
curl_setopt($ch, CURLOPT_COOKIE,"JSESSIONID=".$jsession."; ");
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiefile); 
curl_setopt($ch, CURLOPT_SSLVERSION, 3);
curl_setopt($ch, CURLOPT_POST, TRUE); 
curl_setopt($ch, CURLOPT_USERAGENT, $headers["User-Agent"]);
curl_setopt($ch, CURLOPT_POSTFIELDS, $_POST);
curl_setopt($ch, CURLOPT_ENCODING, $headers["Accept-Encoding"]);
$data=curl_exec($ch);
curl_close($ch);

$fp2 = fopen($cookiefile, "r");
while (!feof($fp2)) {
	$columns=preg_split('/\t|\r\n|\r|\n/', fgets($fp2));
	if($domain==$columns[0] && $columns[5]=="JSESSIONID"){
		$jsession = preg_replace("/\r\n|\r|\n/","",$columns[6]);
	}
}
fclose($fp2);
$newCookieFileName=$path."/".$COOKIE.$jsession;//JSESSION単位で存在できるように
if (file_exists($newCookieFileName) && is_dir($newCookieFileName)) {
    echo "$newCookieFileName はディレクトリです";
}else{
	copy( $cookiefile, $newCookieFileName);
	if ( !unlink($cookiefile)) {echo "ファイル削除失敗!!";}
}
$timeout = time() + 30 * 86400;//時間は適当
setcookie("JSESSIONID",$jsession,$timeout,'/',$_SERVER["SERVER_NAME"]);//クライアントへクッキー渡し
print mb_convert_encoding($data, 'utf8', 'sjis-win');
?> 

以上!。

難点

  • ユーザーが多くなるとクッキーファイルが増殖しまくって破綻しますねはい。
    • まあ、一定期間経ったファイルを消す処理を入れればいいんでしょうが。
  • JSESSIONIDだけで認証することを前提としています。
  • トークン非対応
    • でもCSRF対策しているサイトでも何とか動くね!
    • リファラ見られてたらちょっと厳しい。
  • パス渡しにPOSTだけです。
    • クロスドメイン規制で一般のサイトからはクロスドメインでPOSTは一般ブラウザからはできない。
  • xamppと組み合わせれば結構使えるかも!
  • historyオブジェクトでjsが書かれているページはサニタイズしないと結構厳しいよね。