dポイントプレゼントキャンペーン実施中!

ネット上のフォームからの送信しか受け付けない
CGIにしようと思いました。どうしたらいいですか?

フォームがあるページのソースを見れば、
サブミットした時にCGIに送信されるデータが
分かるから、ローカルでHTMLソースを作成し、
そのサイトのCGIの管理人が予想しなかった
データを送信することができてしまうではないですか。
これを不可能にしたいんです。

具体例だと、CGIにはサイズ sz が big か mall の
どちらかしか送信されないようにしていても、
<form method=POST action=~.cgi
<input name=sz><input type=submit>
</form>
というソースで適当な値を送信させることができる
のを不可能にしたいんです。
CGIの方で big と small 以外は無効にする
というのではなく、そのURLからしか送信を
受け付けなくさせたいんです。

A 回答 (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://*** …など

あとは自分でやってくださいまし。
    • good
    • 0
この回答へのお礼

ありがとうございます。

URLにひらがながある場合もあるんですね。
見たことがないから、pack() は必用ないと思っていました。

/^\Q$_\E/ については、/~$_/ と書くつもりだったのに
~ を書き忘れていました。
でもだめたったんですね。
\Q\E は \ 省略のためだけと思っていたのに、漢字の
扱いでは、よく分からないけど安全になるものだと
覚えておきます。

お礼日時:2001/10/06 00:21

以下のようなのを、その該当の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> ...

補足日時:2001/09/20 01:40
    • good
    • 0

CGI側でHTTP_REFERERを調べて、本来の呼び出し元と違っていたらエラーページに飛ばすというのは如何でしょうか。

(^_^)
    • good
    • 0
この回答へのお礼

HTTP_REFERER の使い方を勉強しました。
今テストしてみました。
HTTP_REFERER なら問題が解決しそうです。
ありがとうございます。

お礼日時:2001/09/20 00:26

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