人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

perlについての質問です。フォームに外部からダイレクトにアクセスされないように、フォームが開いていれば(displayがblockなら)送信許可、そうでなければ(displayがnone(初期設定)なら)拒否というものを考えています。JavaScriptでは以下の感じだと思うのですが、これでは外部対策にはなっていないので、”regist.cgi”に書き込むperlの書き方を教えてください。よろしくお願いします。

function check() {
if(document.getElementById("form").style.display == "block"){
return true;
}else{
return false;
}
}

<form action="./regist.cgi>
<input type="submit" value="送信" onclick="return check();">
</form>

●質問者: tontonpokopoko
●カテゴリ:ウェブ制作
✍キーワード:CGI JavaScript Perl アクセス ダイレクト
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● mattn
●80ポイント

javascriptはクライアントサイド、cgi(perl)はサーバサイドなので対策方法も異なります(display:blockはperl側には関係ありません)。

実際display:noneとした所でアドレスバーから

javascript:document.getElementById('form').style.display = 'block';void 0

としてしまえば回避できます。

外部からのダイレクトにアクセスされるのを弾くのであれば、リファラを確認するのが良いかと思います。

if ($ENV{"HTTP_REFERER"} !~ /^http:\/\/example.com\/.*/) {
 # 不正アクセス
}

ただし実際にはこれでもすり抜けられるのは、おそらくご存知かと思います。難解にするという意味で以下の様にする方法もあります。

ページA:登録前ページ
ページB:登録処理ページ

Aの表示時に特殊なクッキー値を渡し、B(CGI)で確認します。

Perlからcookieは「$ENV{"HTTP_COOKIE"}」で参照出来ます。

これも完璧な防御方法ではないので、実際には直接アクセスされても大丈夫な風に作っておくべきかと思います。

もちろんCGIはPOSTクエリでないと処理が実行されないように作っておくべきです。

◎質問者からの返答

mattnさん、参考になります、ありがとうございます。

弾きたいのは外部からの直アクセス(無差別)なので、

アドレスバーで操作するくらいの「人?」はとりあえず歓迎です。

リファラは偽造(内部からアクセス)されているのを当然と考えています。

(すでに取り入れています)

3番目に書いてくれた方法に興味を持っています。

もちろんクッキーを読み取ってしまえば簡単に突破できるでしょうが、

こちらも即変更が可能なので最初の1歩としては、かなり効果があると思えます。

perlの登録処理ページで正しいクッキーかを確認する方法を教えていただけないでしょうか?

クッキーをjavascriptで取得(この場合、displayの変更時)したら、perlに値を渡す必要があるのでしょうか?

知りたいのはjavascriptで取得したクッキーを、

perlの登録処理ページで正しいかを確認する書き方です。

よろしくお願いします。


2 ● kn1967
●100ポイント ベストアンサー

非常に簡素な例

(1)form.cgi

#!/usr/bin/perl --
#
# クッキーの準備
my $limit = 5; # クッキーの有効期限を5秒とする
my ($sec,$min,$hour,$mday,$mon,$year,$wno) = gmtime(time + $limit);
my @wdays = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat');
my @mons = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');
my $expires = sprintf("%s, %d-%s-%d %02d:%02d:%02d GMT",$wdays[$wno],$mday,$mons[$mon],$year+1900,$hour,$min,$sec);
#
# クッキー出力
# 変数の値はURLエンコードが必要になる場合があります。
# 今回は$limitの値が数字なので手抜きして行ってません。
print "Set-Cookie: TimeLimit=$limit; expires=$expires;\n";
#
# ヘッダー出力
print "Content-Type:text/html\n\n";
#
# コンテンツ出力
print<<"END";
<html>
<body>
<form action="./regist.cgi">
<input type="submit" value="送信">
</form>
</body>
</html>
END

(2)regist.cgi

#!/usr/bin/perl --
#
# ヘッダー出力
print "Content-Type:text/html\n\n";
#
# クッキー読み取り(事前作業はありません。いきなり環境変数を参照すればOKです。)
print "クッキーの中身は[" . $ENV{'HTTP_COOKIE'} . "]です。";
#
# クッキーは通常URLデコードと変数毎の分離作業が必要ですが、今回は省いてます。
if ($ENV{'HTTP_COOKIE'} !~ /TimeLimit/) {
 print "有効期限切れです。";
 exit;
}
# 以下、登録処理や確認出力を行う。

※ページ遷移を伴わずに実行しようとすれば

ajaxの非同期通信が必要になってくるのですが、

直接飛んでくるような輩を弾く仕組みとしては、

上記の通りjavascriptは無関係。

※タイムリミットは5秒にしてありますので、フォームから呼んだ場合と

時間を空けて直接regist.cgiを呼んだ場合の動作の違いを見てください。

※上記は非常に手抜きで簡素なサンプルです。セキュリティに関する事なので、

実装の際には、クッキーについてご自身なりに調べてからにしてください。

◎質問者からの返答

kn1967 さん、わざわざプログラムを書いていただきありがとうございます。

現状で使っているのはフリーで配布されたフォーム(クッキーも取得)で、

何とか上記と組み合わせてみようと思いましたが、私の知識では無理でした。

コメント欄に現在のクッキーを書き込んでおきますので、

もし宜しければ修正していただければ幸いです。

*情報提供不足や作業が複雑なようなら無視してください。現在の知識で出来ることを考えて見ます。

上記のものは今後にまた悩んだときに参考にさせていただきます。


3 ● azuco1975
●0ポイント

http://www.kanzaki.com/docs/html/htminfo32.html

とりあえずPOSTメソッドに変更するだけでかなりマシです。

次にhiddenタグをつかってタイプスタンプ等を代入してその都度

CGIでチャックすればかなり安全

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ