前回質問させていただきましたが、回答が無かったのでもっと具体的に考えました。

認証スクリプトで、掲示板を制限しています。両方Perlです。ID,passがguestのときは、閲覧だけで書き込めないようにしたいと思います。
掲示板の処理で、$ENV{’REMOTE_USER’}がguestのとき、実行できないって言うことができればよいんでしょうか。print省略
<FORM method="POST" action="bbs.cgi">
名前<input type="text" size="20" name="name"><br>
<input type="submit" value="送信"><br>
</FORM>
もし,guestだったら
<input type="submit" value="送信"><br>
・この一行消しちゃうっていうことで実現できますか?
・問題がありましたらその他の方法も教えてください。
できれば、それぞれ具体的なコードも書いていただけると助かります。Perl勉強しはじめたばかりという前提でよろしくお願いします。

回答の条件
  • URL必須
  • 1人3回まで
  • 登録:2006/03/25 12:29:40
  • 終了:2006/03/25 15:11:17

ベストアンサー

id:TomCat No.2

TomCat回答回数5402ベストアンサー獲得回数2152006/03/25 13:46:37

ポイント50pt

ゲストには書かせない、という規制を行う場合、

単に書き込みフォームを消すだけでは不十分です。

フォームを使わず直接POSTデータを送信されてきた場合でも、

それを拒絶する仕組みを工夫しなければなりません。

 

そのためのトラップは、書き込み動作をさせるルーチンの

冒頭に仕込みます。

【例】
# ゲストが書き込みしようとしたらエラーにする
if ($ENV{'REMOTE_USER'} eq "guest") {
    &error;
}
# 書き込み処理
    :
    :

これで、基本認証時にIDをguestとしたユーザーは、

書き込みをしようとすると sub error に飛ばされます。

もちろん、

sub error {
print "Content-type: text/html\n\n";
print <<"EOM";
<html>
<body>
エラーです。ブラウザの戻るボタンで戻ってください。
</body>
</html>
EOM
}

といったエラー表示ルーチンは別に用意しておきます。

 

あとは、見栄えの問題として、ゲストユーザーの場合は書き込みフォームを消す。

if ($ENV{'REMOTE_USER'} ne "guest") {
print <<"EOM";
<FORM method="POST" action="bbs.cgi">
名前<input type="text" size="20" name="name">
    :
    :
<input type="submit" value="送信">
</FORM>
EOM
}

といった処理を付け加えればいいでしょう。

 

ただ、基本認証によるユーザー名の取得には、

比較的強力で破られにくい認証が出来る、

認証ルーチンを自分で作らなくてよいなどの利点がある一方で、

いくつかの制限事項もあります。

↓参考

http://sakaguch.com/PastBBS/0039/B0019463.html

 

そこで、一般的にはcookieを利用して

今ログインしているのは誰かを判別して、

それによって書き込み権限を与えるかどうかを決める、

といった手法が取られるのが普通です。

このへんは、探してみると色々な会員制掲示板CGIがありますから、

そういったものを参考にしてみてください。

id:rain2003

>フォームを使わず直接POSTデータを送信されて

>きた場合でも、それを拒絶する仕組みを工夫し

>なければなりません。

なるほど。こういう知識が必要なんですね。コードもわかりやすくありがとうございます。感動しました。すごく勉強になるのでもう少し続けてみます。

2006/03/25 14:01:07

その他の回答(1件)

id:kn1967 No.1

kn1967回答回数2915ベストアンサー獲得回数3012006/03/25 13:19:01

ポイント20pt

(1)guestさんが来たときに「せっかくテキストボックスに書き込んだのに送信ボタンが見当たらないよ(T_T)~~~」なんて迷惑をかけずに済みますので、消すとすれば<form~~>から</form>までの全てが良いでしょうね。

「ユーザー登録がお済になるまでは投稿いただけません。申し込みお手続きページからお申し込み願います。申し込み中の方は申し訳ございませんがユーザー名とパスワードのお知らせメールが届くまでお待ちください。」なんてコメントを入れるのも良いでしょう。

(2)簡単なセキュリティ強化として、どこから投稿したのかを$ENV{HTTP_REFERER}でチェックして、もしも自分のサイト以外からの場合は書き込みしないように処理を分岐させましょう。

http://www.futomi.com/lecture/env_var/http_referer.html

(3)リファラは偽装が簡単ですからWEB開発の中級者以上であれば簡単に突破できてしまいますし、基本認証も上級者であれば突破可能なものです。

学習用ということでは(2)までを実装すれば十分だと思いますが、本当に大切な掲示板であれば(2)までが出来たところでセッションについて学んで実装しましょう。

さらにセッションとSSLを組み合わせればショッピングサイトのようなものも作れるようになります。

いろいろな仕様や仕組みがあって大変だと思いますが、少しずつ学んでいってください。

id:rain2003

早速のお返事ありがとうございます。

いろいろと勉強になります。

とりあえず、if文を使って(1)をがんばりたいと思います。

次の回答者の方からできれば、正解のコードをお願いします。もう少し質問続けたいと思います。

2006/03/25 13:37:32
id:TomCat No.2

TomCat回答回数5402ベストアンサー獲得回数2152006/03/25 13:46:37ここでベストアンサー

ポイント50pt

ゲストには書かせない、という規制を行う場合、

単に書き込みフォームを消すだけでは不十分です。

フォームを使わず直接POSTデータを送信されてきた場合でも、

それを拒絶する仕組みを工夫しなければなりません。

 

そのためのトラップは、書き込み動作をさせるルーチンの

冒頭に仕込みます。

【例】
# ゲストが書き込みしようとしたらエラーにする
if ($ENV{'REMOTE_USER'} eq "guest") {
    &error;
}
# 書き込み処理
    :
    :

これで、基本認証時にIDをguestとしたユーザーは、

書き込みをしようとすると sub error に飛ばされます。

もちろん、

sub error {
print "Content-type: text/html\n\n";
print <<"EOM";
<html>
<body>
エラーです。ブラウザの戻るボタンで戻ってください。
</body>
</html>
EOM
}

といったエラー表示ルーチンは別に用意しておきます。

 

あとは、見栄えの問題として、ゲストユーザーの場合は書き込みフォームを消す。

if ($ENV{'REMOTE_USER'} ne "guest") {
print <<"EOM";
<FORM method="POST" action="bbs.cgi">
名前<input type="text" size="20" name="name">
    :
    :
<input type="submit" value="送信">
</FORM>
EOM
}

といった処理を付け加えればいいでしょう。

 

ただ、基本認証によるユーザー名の取得には、

比較的強力で破られにくい認証が出来る、

認証ルーチンを自分で作らなくてよいなどの利点がある一方で、

いくつかの制限事項もあります。

↓参考

http://sakaguch.com/PastBBS/0039/B0019463.html

 

そこで、一般的にはcookieを利用して

今ログインしているのは誰かを判別して、

それによって書き込み権限を与えるかどうかを決める、

といった手法が取られるのが普通です。

このへんは、探してみると色々な会員制掲示板CGIがありますから、

そういったものを参考にしてみてください。

id:rain2003

>フォームを使わず直接POSTデータを送信されて

>きた場合でも、それを拒絶する仕組みを工夫し

>なければなりません。

なるほど。こういう知識が必要なんですね。コードもわかりやすくありがとうございます。感動しました。すごく勉強になるのでもう少し続けてみます。

2006/03/25 14:01:07

コメントはまだありません

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

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

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

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません