- ベストアンサー
直 CGI を禁止
ネット上のフォームからの送信しか受け付けない CGIにしようと思いました。どうしたらいいですか? フォームがあるページのソースを見れば、 サブミットした時にCGIに送信されるデータが 分かるから、ローカルでHTMLソースを作成し、 そのサイトのCGIの管理人が予想しなかった データを送信することができてしまうではないですか。 これを不可能にしたいんです。 具体例だと、CGIにはサイズ sz が big か mall の どちらかしか送信されないようにしていても、 <form method=POST action=~.cgi <input name=sz><input type=submit> </form> というソースで適当な値を送信させることができる のを不可能にしたいんです。 CGIの方で big と small 以外は無効にする というのではなく、そのURLからしか送信を 受け付けなくさせたいんです。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
どうも。。。(すんません、見てませんでした。。。 (まだこれ生きてるの? >if($ENV{'HTTP_REFERER'}) >というのが書いてありました。 >REFERER が得られないことがあるのはどういう >場合なんですか? 直接そのURLにぽちぽち打ち込んだりして行った場合などです。 >URL を pack() でデコードしてあったけど、どういう場合に >pack() が必用なんですか? URLにエンコードしてしまうような記号や漢字(ひらがな)などがあった場合です。 (元に戻す処理が必要です。s/%(..)/chr(hex($_))/ge; ~ などという記述でも良いです。 (まぁ、packが使われることが多いのですかね。Perl習慣・Perl文化でしょう) >/^\Q$_\E/ は /$_/ にしてもだいじょうぶですか? 2重にだめです。 くぉーと処理をすることで、漢字などでもかなりセーフになります。 (ソースコードをEUCコードにしといて、くぉーと入れとけば完全にOKと思います) あと先頭の「^」を抜かしたら、引数に該当URLなどを使用されてもチェックをとおってしまうことになります。 例えば。。。 http://www.goo.ne.jp/search.cgi?value=http://*****/index.htmlなど あとは自分でやってくださいまし。
その他の回答 (2)
- kokucho81
- ベストアンサー率61% (157/255)
以下のようなのを、その該当のCGIに書き加えれば良いと思います。 #!/usr/bin/perl ← 適当にかきかえてくだされ。。。 #送信可能なURLを以下にかいてゆく。 $url[0] = 'http://*****/index.html'; $url[1] = ''; # ほかにあるなら… $ENV{'HTTP_REFERER'}=~ s/%(..)/pack("C",hex($1))/eg; if($ENV{'HTTP_REFERER'}){for(@url){if($_&&$ENV{'HTTP_REFERER'}=~ /^\Q$_\E/){$flag=1;last;}}} if($flag!=1){ #どこからともなく送信された場合、、、 print "Content-type:text/html\n\n"; print << "EOF"; <HTML> <BODY> <TABLE celpadding=0 cellspacing=0 border=0> <TR><TD ALIGN="CENTER"> <FONT SIZE=7> はにゃ~ん!!!<BR> ヽ(;´Д`)ノ<BR> ≡<BR> ノノ<BR> </FONT> </TD></TR> </TABLE> </BODY></HTML> EOF exit(); } ################################ この間には、今使っているCGIをコピー&ペースト ################################ 以上でいけるかな?(いけんかったらすんません)
補足
ありがとうございます。 ソースを教えてもらえたのでとてもうれしいです。 if($ENV{'HTTP_REFERER'}) というのが書いてありました。 REFERER が得られないことがあるのはどういう 場合なんですか? 環境変数をチェックするサイトに行った時も、 $ENV{'HTTP_REFERER'} が得られず、空欄だったことが あったような記憶があるんです。 URL を pack() でデコードしてあったけど、どういう場合に pack() が必用なんですか? /^\Q$_\E/ は /$_/ にしてもだいじょうぶですか? 送信可能なURLが1つの場合、下のようなソースを考えました。 改良した方がいいところがあったら教えてください。 #!/usr/bin/perl if($ENV{'HTTP_REFERER'} ne 'http://aa.com/a.htm' | 'http://120.1.0.60/a.htm'){exit()} print "Content-type:text/html\n\n"; print << "EOF"; <HTML> ...
- natural
- ベストアンサー率37% (419/1115)
CGI側でHTTP_REFERERを調べて、本来の呼び出し元と違っていたらエラーページに飛ばすというのは如何でしょうか。(^_^)
お礼
HTTP_REFERER の使い方を勉強しました。 今テストしてみました。 HTTP_REFERER なら問題が解決しそうです。 ありがとうございます。
お礼
ありがとうございます。 URLにひらがながある場合もあるんですね。 見たことがないから、pack() は必用ないと思っていました。 /^\Q$_\E/ については、/~$_/ と書くつもりだったのに ~ を書き忘れていました。 でもだめたったんですね。 \Q\E は \ 省略のためだけと思っていたのに、漢字の 扱いでは、よく分からないけど安全になるものだと 覚えておきます。