OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

直 CGI を禁止

  • 暇なときにでも
  • 質問No.137902
  • 閲覧数64
  • ありがとう数2
  • 気になる数0
  • 回答数3
  • コメント数0

お礼率 59% (194/328)

ネット上のフォームからの送信しか受け付けない
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
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

質問者が選んだベストアンサー

  • 回答No.3
レベル11

ベストアンサー率 61% (157/255)

どうも。。。(すんません、見てませんでした。。。
(まだこれ生きてるの?

>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など

あとは自分でやってくださいまし。
お礼コメント
A__

お礼率 59% (194/328)

ありがとうございます。

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

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

その他の回答 (全2件)

  • 回答No.1
レベル13

ベストアンサー率 37% (419/1115)

CGI側でHTTP_REFERERを調べて、本来の呼び出し元と違っていたらエラーページに飛ばすというのは如何でしょうか。(^_^) ...続きを読む
CGI側でHTTP_REFERERを調べて、本来の呼び出し元と違っていたらエラーページに飛ばすというのは如何でしょうか。(^_^)
お礼コメント
A__

お礼率 59% (194/328)

HTTP_REFERER の使い方を勉強しました。
今テストしてみました。
HTTP_REFERER なら問題が解決しそうです。
ありがとうございます。
投稿日時 - 2001-09-20 00:26:22
  • 回答No.2
レベル11

ベストアンサー率 61% (157/255)

以下のようなのを、その該当のCGIに書き加えれば良いと思います。 #!/usr/bin/perl ← 適当にかきかえてくだされ。。。 #送信可能なURLを以下にかいてゆく。 $url[0] = 'http://*****/index.html'; $url[1] = ''; # ほかにあるなら… $ENV{'HTTP_REFE ...続きを読む
以下のようなのを、その該当の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をコピー&ペースト
################################

以上でいけるかな?(いけんかったらすんません)
補足コメント
A__

お礼率 59% (194/328)

ありがとうございます。
ソースを教えてもらえたのでとてもうれしいです。

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:25
このQ&Aで解決しましたか?
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ