<form>でCGIへのデータの転送ですが、

(1)「GET」と 「POST」がありますが、どんな違い、メリット/デメリットがあるのか教えてください

(2)また、送信情報のセキュリティーと関係はありますか?

(3)検索エンジンなどはGETが多いようですが、なぜですか?


いろいろ質問が多くて申し訳ありません。
よろしくお願いいたします

A 回答 (3件)

CGIプログラム側から見ると、



○「GET」の場合
 環境変数「QUERY_STRING」で値が渡される
 データがOSで認められた以上の大きさになると、値が環境変数に収まらなくなりデータが途中で切れてしまう
○「POST」の場合
 Formの値は標準入力(STDIN)に渡され、データの長さは環境変数「CONTENT_LENGTH」に入る
 データの長さはOSに依存しないため、大きなデータでも問題なく渡せる

という違いがありますね。

一方、CGIを使うユーザー側から見ると、GET methodの場合はURLの後に「http://hogehoge/foo.cgi?input=xxx」というような形で引数を指定すると、Formからデータを入力したのと同じような効果が得られるのに対し、POST methodしか対応していないCGIでは、基本的にFormにデータを入力してやらないとプログラムが正しく動かない、という違いがあります。
そのため、検索エンジン等の場合は検索結果に対して直リンクが張りやすいGET methodを使っているところがほとんどです。

セキュリティ的にはどちらも大した違いはありませんが、Formに入力したデータがブラウザの「アドレス」欄に表示されない分だけ、ややGET methodの方が有利といえるでしょうか。
    • good
    • 0
この回答へのお礼

よく分かりました。ありがとうございます。
ちなみに、最後のくだりは、POSTのほうが有利の間違いではないですか?
GETはアドレス欄に取得値が表示されるのですよね?

お礼日時:2001/03/28 09:23

ありゃ、確かに最終行間違えましたね。


そこは「POST methodの方が有利」の間違いです。(^^;;
    • good
    • 0

メリット/デメリット、またはセキュリティという面でみると、ホストのアクセスログや、ブラウザのabout:cache、about:globalでURLの参照すると、GETの内容が見えてしまいます。


たとえばGETを利用してpasswordを送信した場合は、そこからpasswordがモレる可能性をはらんでいます。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qポストペット(post pet)V3にて、プロバイダがDIONなのですが・・・

ポストペット(post pet)V3にて、メールがうまく認証されません。
プロバイダはDIONなのですが、DIONのホームページ上でも、ポスペでの設定方法が載っていませんし、DIONでは無理なのでしょうか?
SMTPやPOPサーバ等の設定方法を教えてください。
よろしくご指導お願いいたします。

Aベストアンサー

ポストペットのサイトに設定方法が載っていますが、確認しましたか?。
http://www.postpet.so-net.ne.jp/free/info/help/manual/v3/win/
メールの設定を参照
文字の一寸した違いに注意。設定は半角で。

参考URL:http://www.postpet.so-net.ne.jp/free/info/help/manual/v3/win/

Q
の場所は?

CGIでデータを受け渡しするアンケートを作っています。html中に書く<form method=post action="***.cgi">~</form>“~”の場所についてですが質問項目を全て挟まなくてはいけませんか?実は、チェックボックスの「最大2つまで回答可」という部分をJavascriptでチェック個数を超えてチェックした時点でアラートが出るようにしてます。その記述中にすでに<form>~</form>タグを制限をかけたい質問に置いているので、質問全体を<form method=post action="***.cgi">~</form>でくくると入れ子になってしまいます。大丈夫ですか?

Aベストアンサー

<form method=post action="***.cgi" name="form1">~</form>
にする。つまり「最大2つまで回答可」という部分だけをonclickでJavascriptを呼び出したらいいと思います。

Qフォーム送信後の更新ボタンでも$_POST変数が初期化されない

フォームのサブミット後にプログラムが走るようになっているtest.phpがあるのですが、フォーム送信後に更新ボタンを押しても再度ポストされるようになってしまっています。

ブラウザの更新ボタンを押したときには、ポストせずにフォームをクリアしたいのですが、どうすればできますでしょうか?

<form method="post" action="<?php print($_SERVER['PHP_SELF']); ?>">
<input type=text name=aaa>
<input type="submit" name="submit" value="submit">
</form>
<?php
if($_POST['submit']) { 処理 }
?>

Aベストアンサー

fabuさん、こんにちは。


> フォームのサブミット後にプログラムが走るようになっているtest.phpがあるのですが、フォーム送信後に更新ボタンを押しても再度ポストされるようになってしまっています。

これはブラウザの仕様だと思います^^;
更新ボタンを押したときに「送信ボタンを押したとき」
をもう一度実行しています。

私の場合は、送信されたときの処理をどんな出力よりも上で行い、
処理後にheader()で自分自身のページへリダイレクトするようにしています。
これでページを開いた最初の状態に戻ります。



<?php
// header()でリダイレクトするので
// どんな出力よりも先に行う。
if($_POST['submit']) {
/* 処理 */
header("Location: {$_SERVER['PHP_SELF']}");
exit;
}
?>
<form method="post" action="<?php print($_SERVER['PHP_SELF']); ?>">
<input type=text name=aaa>
<input type="submit" name="submit" value="submit">
</form>


どうしても出力後にif($_POST['submit'])を
行わないといけない場合は、
メタタグのリフレッシュを使うといいかもしれません。

fabuさん、こんにちは。


> フォームのサブミット後にプログラムが走るようになっているtest.phpがあるのですが、フォーム送信後に更新ボタンを押しても再度ポストされるようになってしまっています。

これはブラウザの仕様だと思います^^;
更新ボタンを押したときに「送信ボタンを押したとき」
をもう一度実行しています。

私の場合は、送信されたときの処理をどんな出力よりも上で行い、
処理後にheader()で自分自身のページへリダイレクトするようにしています。
これでページを開いた最初の...続きを読む

QCGIから別のCGIへPostするには?

こんにちは。
a.cgiにアクセスがあったらb.cgiに<data=hoge>というデータを
postしたいのですが、どうすればいいのですか?

よろしくお願いします。

Aベストアンサー

CGIの言語がPerlだとして、
LWP
HTTP::Request::Common
を使う例。


use LWP::UserAgent;
use HTTP::Request::Common qw(POST);

$url = "http://hogehoge/cgi-bin/b.cgi";

%formdata = ('data' => 'hoge');

$request = POST($url,[%formdata]);
$ua = LWP::UserAgent->new;
$res = $ua->request($request);

QPOSTしたページの結果を編集して表示したい

ユーザーが文字列をポストしたら、返ってきたページの結果を編集して出力するプログラムを作りたいと思っています。
GETであればfileやfopenでできそうな気はするのですが、POSTの場合、どのような方法で結果を編集すればいいのか見当がつきません。
ヒントだけでも結構ですのでご教授お願いいたします。

Aベストアンサー

おそらく参考URLのような情報を求めていると思われますが、どうでしょうか。

参考URL:http://oshiete1.goo.ne.jp/kotaeru.php3?q=1036745

QCGIからCGIへの(GET属性)リンクについて

CGI(Perl)ゲームを作っていて個人名での戦闘ログを一覧表示するプログラムを作っていて下記の表示になるように作りました。

「Viewer.cgi?name=hogehoge&…(略」
ファイル名 攻、守
1.cgi  守備側
7.cgi  攻撃側
16.cgi  攻撃側
    :
    :
(1~16.cgiはログファイルで読み込み専用です)

これからさらに1.cgi、7.cgi・・・とリンクで単体ファイル毎のログを表示させたいと思い、<a href=http://~/log_viewer.cgi?name=16.cgi>と書いてリンクしてみたのですが、うまくいきませんでした。GET属性のように送るにはフォームからGET属性を付けて送るしかないのでしょうか?

リンクのテキストリンクでの送信方法(その後にやらなければいけないこと等)、もしくはフォームでテキストリンクでの送信方法を教えていただきたいです。無理でしたら出来る限りテキストリンクになるような方法でも構いません。どうかよろしくお願いします。

Aベストアンサー

GETではアドレスで値を渡します。
ですから、ttp://~/log_viewer.cgi?name=16.cgiでも構いません。
フォームからGET属性を付けて送っても結局は上と同じことになります。

結局、エラーの内容はなんですか?
500エラー(内部サーバーエラー)でしょうか。404エラー(そのファイルがない)でしょうか。それとも他のでしょうか?

上のようにエラー内容・Viewer.cgi(log_viewer.cgiかも?)と1.cgiの中身・使っているサーバーの名前の4つを教えていただけますか?

くれぐれも著作権に当たらないように。

あと、最初は
Viewer.cgi?name=hogehoge&…(略 なのにリンクは
log_viewer.cgi?name=16.cgi ですがそこらへんのミスとかではないのでしょうか?

Q携帯用のページに perl で post

一般のページには、
http://test.com/cgi/post.cgi?id=123&pas=456

・・・とかいう具合に、フォーム内容を post できますが、携帯用のページに同じことすると、うまくポストできないようです。

perl の仕様? が違うのだと思いますが、どのようにすればうまく解決できるのでしょうか。

IEから行いたいのですが、携帯用だとページが軽いので、可能なら助かります。

Aベストアンサー

>うまくポストできないようです。

これだけでは、方法を変えればポストできるように出来るか、
どうしようもない問題なのか、判断できません。

基本的に、cgi側のチェックで、携帯会社のip発信しか受け付けない
チェックを行っていないなら、なんとかする方法はあるハズですが、
どのように、うまくいかないのか判らないと、コメントのしようがありません。

QGETメソッドとPOSTメソッドの利点と欠点を教えてください

GETメソッドとPOSTメソッドの利点と欠点を教えてください
CGIプログラミングでデータを受信する際のそれぞれの利点と欠点を教えてください。
GETメソッドはデータがURLに表示されてセキュリティ上で問題があるのでは?と思うのですがどうなんでしょうか?
使い分けがうまくできればいいと思うのですが、どのように使い分けるのが良いでしょうか?

Aベストアンサー

GETはURLで送れるので情報ダダ漏れ。
但しURL文字列になってるのでURLとして1つにできる
URLなので文字数の制限が有る

POSTはURLとは別なのでダダ漏れには(見た目的に)なってなく、
文字数は余り関係ない
文字ではないので画像とかも扱える


簡単な情報送信やページングのみだったりするものはGETが未だに使われる
formのデータやアップロードの場合はPOSTが普通(危惧しているセキュリティの事も有るから)

QPOSTで送りたい

PHP初心者です

HTMLタグが混じっ文字をHTMLごとPOSTで次ページに送る方法を教えてください

ここでは<p><a href="./">TOPに戻る</a></p>をポストしたいです

<form action = "test_view.php" method = "post" >

<input type="text" name="<p><a href="./">TOPに戻る</a></p>">

<input type="submit" name="" value="送信">
</form>

よろしくお願いします

Aベストアンサー

マルチバイト文字をhtmlspecialcharsでエスケープするときは
クォートのタイプや、文字コードまで渡してやるとトラブルが減ります。
また、postで送られてくる生データあくまでもエンコードされたデータでしかないので
それをphp側で最大限解釈しているものです。
生データを確認する場合はこんな感じで行います

<form method="post">
<input type="text" name="hoge" value="<?php print htmlspecialchars('<p><a href="./">TOPに戻る</a>',ENT_QUOTES,'UTF-8'); ?>">
<input type="submit" value="送信">
</form>
<?php
if(isset($_POST)){
$rawpostdata = file_get_contents('php://input');
print $rawpostdata;
}
?>

Qフォーム以外からCGIにPOSTする方法

CGIプログラム(便宜的にPROGRAM_A)にデータを渡す方法はGETとPOSTがあるかと思います。
そこで、フォーム以外(perlプログラム(便宜的にPROGRAM_B))から、POSTを使用してPROGRAM_Aにデータを渡すことは可能でしょうか。
教えてください。

PROGRAM_B ---(POST)---> PROGRAM_A

Aベストアンサー

 TCP/IPとかHTTPのプロトコル関係の書籍とか見るとたいがい書いてあったりするんですけどね。

 自信なかったんで#1の回答には書きませんでしたが、下記のソースだと、$host、$path、$query に文字列をセットすると、最終的に @ret に値が返ってくるはずです。
 ただしバグがあったらあしからず。

--------------------------------○
$host = 'www.provider.com';
$path = '/~account/index.htm';
$query = 'a=123&q=abc';
use Socket;
$address = inet_aton($host) || die "ERROR";
$sockaddress = sockaddr_in(80, $address);
socket( SOCK, PF_INET, SOCK_STREAM, getprotobyname('tcp')) || die "ERROR";
connect( SOCK, $sockaddress ) || die "ERROR";
binmode(SOCK);
select(SOCK);
$| = 1;
select(STDOUT);
print SOCK "POST $path HTTP/1.0\r\n";
print SOCK "Host: $host\r\n";
print SOCK "Connection: close\r\n";
print SOCK "Content-Length: " . length($query) . "\r\n";
print SOCK "\r\n";
print SOCK "$query";
@ret = <SOCK>;
close(SOCK);

 TCP/IPとかHTTPのプロトコル関係の書籍とか見るとたいがい書いてあったりするんですけどね。

 自信なかったんで#1の回答には書きませんでしたが、下記のソースだと、$host、$path、$query に文字列をセットすると、最終的に @ret に値が返ってくるはずです。
 ただしバグがあったらあしからず。

--------------------------------○
$host = 'www.provider.com';
$path = '/~account/index.htm';
$query = 'a=123&q=abc';
use Socket;
$address = inet_aton($host) || die "ERROR";
$...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング