Perl の CGI.pm について質問致します。


自分は通常、

use CGI;
$q = new CGI;
$os= $q->param('OS');

という風にフォームからデータを受け取っているのですが、この場合はPOST、GET、両方で受け取ることができるのでしょうか?

form 上での指定はPOSTにしているのですが、アドレス直接打ち込みでGET渡しも生きてくるのでしょうか?

自分で実験したところ、POST、GET両方で可能でした。(POSTだけを有効にしたいのですが、、、。)

回答の条件
  • URL必須
  • 1人20回まで
  • 登録:
  • 終了:2007/11/15 01:58:38
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答3件)

id:tkyk3 No.1

回答回数60ベストアンサー獲得回数7

ポイント27pt

基礎的なことなんでしょうけど、私も気になっていましたがよく分かっていなかったので、ちょっと調べてみました。

http://perldoc.jp/docs/modules/CGI.pm-2.89/CGI.pod

POSTとURLパラメータの混合

$color = $query->url_param('color');

問い合わせ文字列(引数が後ろについた"?"マーク)が入ったURLへ POSTするフォームを作成することにより、スクリプトはフォームと同じように CGIパラメータをURLで受け取ることは可能です。param()メソッドは、 URLの問い合わせ文字列を無視し、常にPOSTされたフォームの内容を返します。 URLパラメータを取り出すためにはurl_param()メソッドを呼び出してください。 param()と同じように使ってください。大きな違いはパラメータを読むことは常にできますが、設定はできません。

いかなる状況においても、URL問い合わせ文字列の内容がPOSTされたフォームの同じ名前のCGIパラメータを干渉することはありません。URL問い合わせ文字列と GETメソッドでサブミットされるフォームとを混ぜてみると、その結果はあなたが予想しなかったことになるでしょう。

ということは、POSTとURLのどちらもある場合には、POSTが必ず優先されるということになるかと思います。そういう場合に、URL文字列も知りたい、というときに、url_param()を使えと。

こういう認識になると思いますが、如何でしょうか。

id:zachouR

なるほどー!ありがとうございます。

しかし、POSTだけ有効にしたい、GETだけ有効にしたい、という場合は、url_param()を使ってチェックする必要があるのでしょうか?

うーん、、、。

2007/11/07 16:07:05
id:tezcello No.2

回答回数460ベストアンサー獲得回数69

ポイント27pt

POSTでもGETでも意識しないで使えるのがウリらしいです。

OSというパラメータがPOSTであるかの確認は、

$ENV{'REQUEST_METHOD'} の値を調べる

$ENV{'QUERY_STRINGS'} に、OS= の文字列が無い

などのチェックをしてみては?


以前、CGI.pm(cgi-lib.pl だったかも)を使っていましたが、仕様が変わった(らしい)のに気が付かず、原因がわかるまで凄く時間がかかってしまいました。(実際の原因は別にあるのかも知れませんが)

それ以来、自作のスクリプトをライブラリ化して使うようになりました。そんなに難しい処理をするわけではないですし。

http://q.hatena.ne.jp/1194414548

id:zachouR

ありがとうございます。

GETから受け取る場合はプログラムに別の処理をさせたかったので、、、。

GETで投げるのは簡単そうなので、いたずらずきのちみっ子が、なんかするかもなーとか思ってしまいまして、、、。

2007/11/07 16:08:33
id:iwaim No.3

回答回数215ベストアンサー獲得回数19

ポイント26pt

POST、GETの両方ともで有効になります。

HTTPリクエストで使われるメソッド(GETとかPOSTとか)はCGIモジュールのrequest_methodメソッドで取得できますので、それを使って振り分ければ解決するでしょう。

use CGI;

my $q = new CGI;

if($q->request_method() == 'POST') {

my $os= $q->param('OS');

....

}

http://perldoc.jp/docs/modules/CGI.pm-2.89/CGI.pod

id:zachouR

ありがとうございます。これは参考にさせて頂きます!

2007/11/07 16:08:59
  • id:Mars
    回答ではないのでコメントで。
    >GETで投げるのは簡単そうなので、いたずらずきの
    POSTもそう難しくはないかも。
    想定外のデータで深刻ダメージを受けるようならmethodで区別するのではなく、
    内容で弾くようにしたほうがいいですよ。
  • id:tezcello
    質問への直接回答ではないのでこちらへ

    自分で
    > $ENV{'REQUEST_METHOD'} の値を調べる
    と言っておいてナンですが...
    POST, GET 両方で送られてくるような場合はどうなるんでしょ?(実験はしていません)
      form の method は post でも、URLには何かのクエリがついているような場合
    そういうURIにならない様に注意すればいいだけの話ですが。

    > >GETで投げるのは簡単そうなので、いたずらずきの
    > POSTもそう難しくはないかも。
    HTMLソースをチョッと書き換えるだけなので、全然難しくないです。
    チャンと対策しないと迷惑POST(スパム)の嵐になってしまいます。(<-経験あり)
    また、
    内容チェックをしてPOST内容を再表示、その後OKボタンのクリックで登録(書き込み)
    の流れだと、再表示後のformからのアクセスだと偽装して直接送りつけてくるものもあるので、再表示したものでももう一度チェックする必要があるでしょうね。
    他にも
    ・hiddenフィールドにキーワードを入れておく
    ・URIやhiddenフィールドに時間やシリアルを入れておく
    ・アンチスパム用のフィールドに指定した値を入れてもらう
    なんてチェック方法もあります。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません