投票cgiを設置したいのですがうまくいきません、集計を1日一回だったのを少し改造して即時集計にしました
一応動くのですが、連続投票できてしまいます。
連続投票を一定時間制限できるようにしたいのですがうまくいきません
60秒くらい間をおいてから投票できるようにできますか?
ip制限もあるみたいなのですがこれも機能してないです・・・
改善できるなら元のソースがかなり変わってもかまいません
連続投票制限だけでも機能できればと思っています。よろしくお願いします
local $times = time();
sub vote{
if($FORM{id}){
my $fl=0;
if(!$CK_ref){$fl=1;}
else{ if(index($ENV{'HTTP_REFERER'},index.html>=0){$fl=1;} }
if($fl){
$FORM{id}=~s/\n//g;
my $vote = $FORM{vt2}?1:0;
open(OUT,">>vote_temp.cgi"); #時間用のログファイルに書き込み
print OUT "$FORM{id}<>$ENV{'REMOTE_ADDR'}<>$FORM{vt}<>$vote<>".$times."<>\n";
close(OUT);
&reset_vote if $VT_RESET < $times;
my(@log_lines,%pt,%pt2,%cnt,$name,$value,%CKIP);
open(IN,"vote_temp.cgi");
my @log = <IN>;
close(IN);
if(@log){
my $cktime = $times - 60; #60秒制限
open(IN,"vote_ck_IP.cgi"); #投票した人のIPを記録したログ
while(<IN>){
my @ck = split('<>');
next if $_[1] < $cktime;
$CKIP{$_[0]} = $_[1];
}
close(IN);
foreach(@log){
chop;
my @rank = split('<>'); #ID<>IP<>評価<>おすすめ<>時間\n
next if $CKIP{"$rank[0]_$rank[1]"};
$pt{$rank[0].'_'.$rank[2]}++; $pt2{$rank[0]}++ if $rank[3]; $cnt{$rank[0]}++;
$CKIP{"$rank[0]_$rank[1]"} = $rank[4];
}
open(OUT,">vote_temp.cgi");
close(OUT);
open(OUT,">vote_ck_IP.cgi");
while(($name, $value) = each(%CKIP)){
print OUT "$name<>$value<>\n";
}
close(OUT);
open(IN,"log.cgi");
my @data = <IN>;
close(IN);
foreach(@data){
#集計処理長かったので省略
}
open(OUT,">vote_bf.cgi");
open(IN,"vote_log.cgi");
while(<IN>){ print OUT $_; }
close(IN);
close(OUT);
open(OUT,">vote_log.cgi");
print OUT @log_lines;
print OUT "\n1;\n";
close(OUT);
}
&make_vote_ck('set');
}
}
sub reset_vote{
my @log;
foreach my $i(1..$LAST_ID){
next if !@{$VT[$i]};
$VT[$i][18] = $VT[$i][7];
$VT[$i][19] = $VT[$i][8];
$VT[$i][20] = $VT[$i][0];
foreach my $j(0..8){ $VT[$i][$j] = 0; }
push(@log,'$VT['.$i.'] = ['.(join(',',@{$VT[$i]}))."];\n");
}
open(OUT,">vote_log.cgi");
print OUT @log;
print OUT "\n1;\n";
close(OUT);
&make_vote_ck('reset');
}
sub make_vote_ck{
if($_[0] eq 'set'){
my @t =localtime($times + 86400);
$VT_TIME = timelocal(0,0,5,$t[3],$t[4],$t[5]);
$VT_RANK = $VT_RUI = $VT_RECO = $VT_RCRUI = $VT_COUNT = $VT_CTRUI = $VRK_CK = 1;
}
if($_[0] eq 'reset'){
my @m =localtime($times);
$m[4] += 1;
if($m[4] > 12){ $m[4] = 1; $m[5] += 1; }
$VT_RESET = timelocal(0,0,2,1,$m[4],$m[5]);
$VT_RANK = $VT_RECO = $VRK_RS = $VRK_CK = 1;
}
if($_[0] eq 'restore'){ $VT_RANK = $VT_RUI = $VT_RCRUI = $VT_RECO = $VT_COUNT = $VT_CTRUI = $VRK_CK = 1; }
open(OUT,">vote_ck.cgi");
print OUT "\$VT_TIME = '".$VT_TIME. "';\n";
print OUT "\$VT_RESET = '".$VT_RESET. "';\n";
print OUT "\$VT_RANK = '".$VT_RANK. "';\n";
print OUT "\$VT_RUI = '".$VT_RUI. "';\n";
print OUT "\$VT_RECO = '".$VT_RECO. "';\n";
print OUT "\$VT_RCRUI = '".$VT_RCRUI. "';\n";
print OUT "\$VT_COUNT = '".$VT_COUNT. "';\n";
print OUT "\$VT_CTRUI = '".$VT_CTRUI. "';\n";
print OUT "\$VRK_CK = '".$VRK_CK. "';\n";
print OUT "\$VRK_RS = '".$VRK_RS. "';\n";
print OUT "\$LAST_ID = '".$LAST_ID. "';\n";
print OUT "\n1;\n";
close(OUT);
}
No.1ベストアンサー
- 回答日時:
肝心な部分がないので・・・
連続投稿を禁止する手段として最も手軽なのは、クッキー(HTTP_COOKIE)の利用です。さらに厳密にしたい場合は、投稿者のIPアドレス(REMOTE_ADDR,REMOTE_HOST)とユーザーエージェント(HTTP_USER_AGENT)をセットにして時間とのtableを作成して参照すると良いでしょう。
HTTP要求ヘッダから、これらのデータを取得して、クッキーの値が指定された時間以内だったら「連続投票は出来ません」と返せばよいです。厳密にしたい場合は、タイムテーブルを作っておいて、そこにデータがあるIPアドレス/ユーザーエージェントは拒否するとかですね。
投票データと、管理データは分けるほうが良いです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- 英語 英文の添削お願いします。【長文です。】 マッチングアプリで相手を言い負かしている時のやつです。 色々 1 2023/07/01 02:12
- Visual Basic(VBA) データベースから絞り込んでデータを読み込み 1 2023/02/21 19:51
- 英語 文の構造をご教示ください 2 2023/01/01 18:03
- 英語 英語ができる方に質問です。 以下の文がネイティブの方に伝わるかどうかを確認していただけないでしょうか 7 2022/12/16 14:54
- PHP PHPの構文で間違えが分からない 5 2022/07/11 16:38
- PHP SQLとPHPの連結方法がわからないのでアドバイスお願い致します 1 2022/07/12 12:16
- PHP PHPでCookieを使った訪問回数について 1 2023/05/28 14:10
- PHP アコーディオンPHPが上手くいかない 3 2022/07/15 16:29
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
IIS の@INC ERRORについて教えて
-
wordの数式について 定積分を書...
-
ラジオボタンが両方とも選択で...
-
「value」に2つの値をセットす...
-
htmlからパラメータで、cgiに渡...
-
VB.net データーグリッドビュー...
-
select値をhiddenのvalueに渡し...
-
Perlでuse socketを使用してフ...
-
チェックボックスの返す値
-
postデータのあるページの再表示
-
[HTML]プルダウンメニューの横...
-
FORMのselectの選択肢を最初か...
-
一つの検索窓で複数のサイトか...
-
1つのformに2つのsubmitボタン
-
index.html(トップページ)か...
-
htmlでセルの値を取得して計算...
-
proftpdで困ってます。
-
Rubyのmechanizeを利用したファ...
-
別formのhidden項目を自form値...
-
MSPゴシックで、一番幅を取る文字
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
サーバーのテキストファイルを...
-
canonicalのURLエンコードについて
-
Perl CGI 初心者
-
sendmailの文字化け
-
If文について教えてください。
-
フォームメール確認用ページ
-
ヒアドキュメントが表示されない
-
サーバー(UNIX)上のフォルダ...
-
jcode.pl 使い方
-
perlでHTMLソースを解析してfor...
-
IIS の@INC ERRORについて教えて
-
IIS上でフリーCGIが動かない
-
SUN BBSの改造方法
-
ラジオボタンが両方とも選択で...
-
「value」に2つの値をセットす...
-
WEBページを強制的に横画面で見...
-
select値をhiddenのvalueに渡し...
-
チェックボックスの返す値
-
INPUT TYPE
-
wordの数式について 定積分を書...
おすすめ情報