<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
の場所は?

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を呼び出したらいいと思います。

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);

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 ですがそこらへんのミスとかではないのでしょうか?

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

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

Aベストアンサー

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

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


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

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ランキング

おすすめ情報