二重投稿を禁止するには?

[上に] [前に] [次に]
質問者 [E-Mail] 1999/12/22(水) 17:34:09
こんにちわ。
このたび、掲示板を設置しました。
とほほさんのBBSをベースにしたものです。
しかし、二重投稿が出来てしまうので、防止できないかと、
考えています。
よろしくお願い致します。
ではー

ラウォッチ 1999/12/22(水) 20:09:59
ログファイルの最新データと今入力したデータを比較すれば、
瞬時における二重投稿は防げるとおもいますが、
とほほさんは以下のように言っています。
「Netscapeサーバーで動かなかったので一時見送り」

とほほさんの回答を待ちましょう!

質問者 1999/12/24(金) 17:35:56
すばやいレスありがとうございます。

> ログファイルの最新データと今入力したデータを比較すれば、
> 瞬時における二重投稿は防げるとおもいますが、
> とほほさんは以下のように言っています。
> 「Netscapeサーバーで動かなかったので一時見送り」
> とほほさんの回答を待ちましょう!

../199903/99030026.htm
↑のことですよね。
Netscapeサーバーっていうのがあるんですね。(メモメモ)
そうですか。では、とほほさんの回答を待ちます。
ちなみに、サーバーはアパッチです。
ではー

質問者 1999/12/26(日) 18:06:45
こんにちわ。
色々と待っているのですがだんだん、したの方に来て、過去ログへ入ってしまいそうなので(^^;
特にプロバイダーは「Netscapeサーバー」ではないので、簡単なものでも良いので教えてくださらないでしょうか?
よろしくお願い致します。

ではー

ラウォッチ 1999/12/27(月) 19:59:49
遅くなりました。(年末でいろいろあって)
簡単ですが、以下の感じでどうでしょう。

#
# Read variables
#
if ($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN, $query_string, $ENV{'CONTENT_LENGTH'});
@a = split(/&/, $query_string);
foreach $x (@a) {
($name, $value) = split(/=/, $x);
$value =~ tr/+/ /;
$value =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg;
if ($jflag) {
&jcode'convert(*value, "euc");
}
if ($allow_html) {
$value =~ s/<!--/&lt;!--/g;
$value =~ s/-->/--&gt;/g;
} else {
$value =~ s/&/&amp;/g;
$value =~ s/"/&quot;/g;
$value =~ s/</&lt;/g;
$value =~ s/>/&gt;/g;
}
if ($jflag) {
&jcode'convert(*value, $ccode);
}
$FORM{$name} = $value;
}
#----------------------------------------------追加
        $nam = $FORM{"FROM"};              # 名前
        $msg = $FORM{"MESSAGE"};           # メッセージ
        open(IN, "wwwboard.dat");
        $line1 = <IN>;      # ログファイル1行目
        $line2 = <IN>;      # ログファイル2行目(名前)
        $line3 = <IN>;      # ログファイル3行目(メッセージ一行目)
        close(IN);
        $rc_nam = index $line2, $nam;
        $rc_msg = index $line3, $msg;
        if($rc_nam != -1 && $rc_msg != -1){
           print "Content-type: text/html\n";
           print "\n";
           print "<HTML>\n";
           print "<BODY>\n";
           print "<H2>二重投稿で〜す!</H2>\n";
           print "<BODY>\n";
           print "<HTML>\n";
           exit;
        }
#----------------------------------------------ここまで
}

要は、名前とメッセージの一行目が一緒だったら、二重投稿と判断します!
(正確にはログデータと文字列一致のとき)

ラウォッチ 1999/12/27(月) 20:09:49
閉じタグのつもりが / ついてなかった!
ロジック自体は動くはずです。(動作確認済み)

質問者 1999/12/28(火) 07:24:46
お忙しいなか、レスありがとうございます。

どうも、動きません。
ログ自体の形式が違うので、$line*をかえれば良いのかな、
と考えていたのですが、どんどん二重投稿できてしまいます(^^;
念の為一応以下にログを書いてみました。
何度もすみません・・・m(_ _)m
ではー
----------------ログ-----------------
<table>
  <TBODY>
    <TR>
<TD>title</TD>

<TD><a href="mailto:mail@">name</A></TD>
<TD>99年12月28日火曜日:7時14分3秒</TD>
<!--127.0.0.1-->
<!--localhost--></TR>
<TR>
<TD width="318" height="129" colspan="3">
<BLOCKQUOTE>
mass
</BLOCKQUOTE>
<a href="http://">http://</A>
</TD>
</TR>
</TBODY>
</TABLE>
<BR><P><hr size=3><BR></P><table>
  <TBODY>
    <TR>
<TD>title</TD>

<TD><a href="mailto:mail@">name</A></TD>
<TD>99年12月28日火曜日:7時13分58秒</TD>
<!--127.0.0.1-->
<!--localhost--></TR>
<TR>
<TD width="318" height="129" colspan="3">
<BLOCKQUOTE>
mass
</BLOCKQUOTE>
<a href="http://">http://</A>
</TD>
</TR>
</TBODY>
</TABLE>
<BR><P><hr size=3><BR></P><table>
  <TBODY>
    <TR>
<TD>title</TD>

<TD><a href="mailto:mail@">name</A></TD>
<TD>99年12月28日火曜日:7時13分50秒</TD>
<!--127.0.0.1-->
<!--localhost--></TR>
<TR>
<TD width="318" height="129" colspan="3">
<BLOCKQUOTE>
mass
</BLOCKQUOTE>
<a href="http://">http://</A>
</TD>
</TR>
</TBODY>
</TABLE>
--------------------3件投稿して見ました。-------------------

ラウォッチ 1999/12/28(火) 22:59:44
オリジナルをかなりカスタマイズしているみたいですね。
とにかく、最新データ(ログファイル)と今入力したデータを比較すれば、いいわけで。
デバック文をビシバシ入れて確認しながらデバックしてください!

しなのむし 1999/12/29(水) 01:23:38
最新投稿のメッセージ部分だけをファイルに記録して
次の投稿内容と比較する方法です。
適当なとこに挟んでみてください。
(前にとほほさんのBBSを改造した時にこれで動いた)

#-----------------------------------------------
# もし$FORM{'MESSAGE'}が空でないなら
# check.datの内容を$challに入れる

if($FORM{'MESSAGE'} ne "")
{
open(CHECK, 'check.dat');
@check = <CHECK>;
close(CHECK);
$chall = join('',@check);

# $challの内容と$FORM{'MESSAGE'}が同じなら
# $FORM{'MESSAGE'}を空にする。(これで単なるリロードになる)
# その他の場合はcheck.datに$FORM{'MESSAGE'}を記録する。

if($FORM{'MESSAGE'} eq $chall)
{$FORM{'MESSAGE'} = "";}
else
{
open(CHECK, '>check.dat');
print CHECK $FORM{'MESSAGE'};
close(CHECK);
}
}
#-----------------------------------------------

質問者 [E-Mail] [HomePage] 1999/12/30(木) 23:52:53
[[解決]]
どうもありがとうございました。
結果は、しなのむしさんのものを改造して、ラウォッチさんの二重投稿で〜す。というメッセージが出るものを
付けて見ました。
どうもありがとうございました。

ではー

質問者 2000/03/04(土) 04:51:46
check.datを掲示板のログに指定したら駄目ですか?
掲示板のログを指定していると1個しか掲示されません(^^;

open (IN, ">> check.dat");
open (IN, ">> $log");

等とすると
print OUT "\n<BLOCKQUOTE>\n$FORM{'mess'}\n</BLOCKQUOTE>\n";
とやっているので掲示板のソースが膨大になってしまうのですが(^^;

2000/03/05(日) 00:35:55


[上に] [前に] [次に]