|
|
|
PHPでフォームを介さずにGETとPOSTを送信する |
ネットでPHPからフォームを介さずにPOSTをする方法を調べた際に書いてあるサイトは色々発見できたのですが、どうも自分には分かりづらいところが多かったので、個人的なメモですが、PHPからフォームを介さずにPOSTをする方法を書いて見ます。
フォームを介さず、PHPでPOSTリクエストを送る方法。
まずは分かりやすいGETから書いてみる。
下記のようなフォームからhttp://example.com/index.phpへ送信した場合、 <form method="GET" action="http://example.com/index.php"> <input type="text" name="id" value="1"> <input type="text" name="data" value="test"> <input type="submit" value="送信"> </form>
ブラウザーのアドレスバーには以下の様に表示される。 http://example.com/index.php?id=1&data=test
上記をPHPからフォームを介さずGETで送信する場合、fsockopenを利用する。
<?php $server = "example.com"; // 送信したいサーバのアドレス $port = 80; // HTTPなので80 $timeout = 30; // 接続に失敗した場合の待ち時間
$sock = fsockopen($host, $port, $errno, $errstr, $timeout); // サーバに接続する if($sock === FALSE){ // 接続に失敗したらメッセージを表示し、終了させる echo "SOCK OPEN ERROR<br>"; 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と同じように送信した場合、
<form method="POST" action="http://example.com/index.php"> <input type="text" name="id" value="1"> <input type="text" name="data" value="test"> <input type="submit" value="送信"> </form>
ブラウザーのアドレスバーにはGETの場合とは違い、送信された内容がアドレス部分には表示されない。 http://example.com/index.php
上記をPHPからフォームを介さずPOSTd送信する場合もfsockopenを利用する。 基本的にはGETの場合と変わらない。
<?php
// 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");
のような感じで、ヘッダを送信すると良い。
テーマ:PHP - ジャンル:コンピュータ
|
|