PHPでフォームを介さずにGETとPOSTを送信する
フォームを介さず、PHPでPOSTリクエストを送る方法。
下記のようなフォームからhttp://example.com/index.phpへ送信した場合、
ブラウザーのアドレスバーには以下の様に表示される。
http://example.com/index.php?id=1&data=test
上記をPHPからフォームを介さずGETで送信する場合、fsockopenを利用する。
$server = "example.com"; // 送信したいサーバのアドレス
$port = 80; // HTTPなので80
$timeout = 30; // 接続に失敗した場合の待ち時間
$sock = fsockopen($host, $port, $errno, $errstr, $timeout); // サーバに接続する
if($sock === FALSE){ // 接続に失敗したらメッセージを表示し、終了させる
echo "SOCK OPEN ERROR
";
exit(-1);
}
// HTTPヘッダ部分の送信になる。
fwrite($sock, "GET http://" . $server . "/index.php?id=1&data=test HTTP/1.0\r\n");
// ヘッダの終了を通知
fwrite($sock, "\r\n\r\n");
fclose($sock);
?>
以上で、GETリクエストがPHPから直接送信可能になる。
form methodを下記のようにGETからPOSTに変更し、GETと同じように送信した場合、
ブラウザーのアドレスバーにはGETの場合とは違い、送信された内容がアドレス部分には表示されない。
http://example.com/index.php
上記をPHPからフォームを介さずPOSTd送信する場合もfsockopenを利用する。
基本的にはGETの場合と変わらない。
// GETとは違い直接リクエスト内容はURLに含めない
$server = "http://example.com/index.php";
$host = "localhost";
$port = 80;
$timeout = 30;
// 送信したい内容をGETと同じくname=value&name=valueの形式で指定する。
$data = "id=1&data=test";
$sock = fsockopen($host, 80, $errno, $errstr, 60);
if($sock === FALSE){
echo "fsockopen error";
return (-1);
}
fwrite($sock, "POST " . $server . " HTTP/1.0\r\n");
// おまじないのような物、POSTで送信する為に必要なヘッダ
fwrite($sock, "Content-Type: application/x-www-form-urlencoded\r\n");
// 送信する内容のデータ長を送る
fwrite($sock, "Content-Length: " . strlen($data) . "\r\n");
// ヘッダの終了を通知
fwrite($sock, "\r\n");
// 内容の送信
fwrite($sock, $data);
// 内容の終了を通知
fwrite($sock, "\r\n");
fclose($sock);
?>
でPHPからフォームを介さずにPOSTでデータを送信することが可能になる。
GET,POST共に、上記の様にヘッダを送信した場合、ログにはUser-AgentやReferer等が表示されないので、表示したい場合は
fwrite($sock, "POST " . $server . " HTTP/1.0\r\n");
の後に
User-AgentにPHPと指定。
fwrite($sock, "User-Agent: PHP\r\n");
Refererに例えば、http://example.com/index.php?id=1&data=testと残してみる。
fwrite($sock, "Referer: $server?$data\r\n");
のような感じで、ヘッダを送信すると良い。
2007年7月25日水曜日
登録:
コメントの投稿 (Atom)

0 件のコメント:
コメントを投稿