■記事リスト / ▼下のスレッド
/ ▲上のスレッド
■10381 / 親記事) |
VOTE COMの連続投稿防止改造について
|
□投稿者/ 南 -(2005/01/12(Wed) 20:45:12)
| 古い記事への返信で申し訳ないのですが No10237,10223,10122 の関連記事にあるように
votec.cgi412行目 $addr = $ENV{'REMOTE_ADDR'};
の下に、
open(IPI,"ip.log"); while (<IPI>){ if($_ eq $addr){&er_("二重投票は禁止");}#IPがすでにある場合終わり } close(IPI); if((-M "ip.log") < 1){#更新されてから1日以内ならIP追加 open(IPO,">>ip.log"); print IPO $addr; close(IPO); }else{#更新されて1日以上ならログをフォーマットして追加 open(IPO,">ip.log"); print IPO $addr; close(IPO); }
と書き込みスクリプトを改造しました。 試しに複数のアドレスで投票してみると、 IP1個目は無事規制されip.logにアドレスは追加されるものの、 2個目以降、IPアドレスが追加されるとIPアドレス規制がなくなってしまいました。 そうすると、1個目のIPアドレスはもちろん2個目、3個目以降のIPアドレスでも連続 投稿が可能になってしまいました。 その時、ip.logを覗いてみると
「192.168.1.0162.168.1.1255.255.255.201……」
の様に、IPアドレスが区切りなく連続で1行に記録されていました。
試しに if((-M "ip.log") < 1){ open(IPO,">>ip.log"); print IPO $addr; print IPO \r\n; close(IPO); } else{#更新されて1日以上ならログをフォーマットして追加 open(IPO,">ip.log"); print IPO $addr; print IPO \r\n; close(IPO); }
と、ログ内で改行させるなどさせてみました 試したのは(\r\nと\nのみ) ですが、改行されるだけで複数のIPアドレスを認知してくれませんでした。
ip.logに関してはアスキーでアップロードし、属性は666にしています。 試しにバイナリでアップロードしてみたりしましたが結果は変わりませんでした。
もしよろしければアドバイスなど頂ければ幸いです。
|
|
|
▽[全レス8件(ResNo.4-8 表示)]
■10416 / ResNo.4) |
Re[4]: VOTE COMの同一IP連続投稿防止改造時間設定版
|
□投稿者/ 南 -(2005/01/19(Wed) 22:09:37)
| 2005/01/19(Wed) 22:10:02 編集(投稿者)
すいません、先ほどのスクリプトに「$host」を取得する部分を忘れていました。 ついでにとあるスクリプト http://fairyland.cside.com/marine/tinkcgi/index.html Sugiura様のTinkCGI HPで公開している「Ana-Vote」 内に書かれていたプロクシ制限スクリプトを お借りした改造スクリプトもつけておきます
votec.cgiの 3行目:require './jcode.pl'; 以下に以下のスクリプトを入れてください。
#プロクシらしいIPをはじく------------------- #=============================== #環境変数を取得するサブルーチン #=============================== sub get_user_data { $addr = $ENV{'REMOTE_ADDR'}; $host = gethostbyaddr(pack('C4',split(/\./,$addr)),2); $client =$ENV{'HTTP_CLIENT_IP'}; $via = $ENV{'HTTP_VIA'}; $xfor = $ENV{'HTTP_X_FORWARDED_FOR'}; $for = $ENV{'HTTP_FORWARDED'}; $agent = $ENV{'HTTP_USER_AGENT'}; if ($xfor ne "") {$xfor_name = gethostbyaddr(pack('C4',split(/\./,$xfor)),2) || $xfor; } $referer = $ENV{'HTTP_REFERER'}; }
#================================== #投票制限対象を判定するサブルーチン #================================== sub reject_check { #プロクシ規制 if ($reject_proxy == "1"){ $ip = $host; $ip =~ s/[0-9\.]//g; #念のため停止 if ($ip eq "") {$rejection = 1;} if ($host =~ /^firewall|^router|proxy|^prx|cache|delegate|^gate|^gw|^host|^dns|keeper|cust|^mail|^www/i) {$rejection = 1;} #念のため停止 if ($host !~ /\.jp$/i && $host !~ /\.bbtec\.net$/i) {$rejection = 1;} #念のため停止 if ($via ne "" || $client ne "") {$rejection = 1;} } #教育機関、政府機関の規制 if ($reject_acgo == "1"){ if ($host =~ /kencho|pref|\.ac\.jp$|\.go\.jp$/i) {$rejection = 1;} } #フリープロバイダーの規制 if ($reject_free == "1"){ if ($host =~ /freecom.ne.jp|freeserve.ne.jp|freejpn.com|freenavi.net|livedoor.com/i) {$rejection = 1;} } #その他規制ホスト if ($reject_host ne ""){ if ($host =~ /$reject_host/i) {$rejection = 1;} elsif ($addr =~ /$reject_host/i) {$rejection = 1;} }
#特別に投票を許可するホスト if ($escape_host ne ""){ if ($host =~ /$escape_host/i) {$rejection = 0;} elsif ($addr =~ /$escape_host/i) {$rejection = 0;} } }
$reject_proxy = "1"; #プロクシによる投票を規制をするか 0=規制しない 1=規制する $reject_acgo = "0"; #教育機関や政府機関からの投票を規制するか 0=規制しない 1=規制する $reject_free = "0"; #フリープロバイダーからの投票を規制するか 0=規制しない 1=規制する $reject_host = ""; #その他、規制するホスト(ホスト名又はIPの一部でも可。複数のときは「|」で区切って指定) $escape_host = ""; #上の4つの投票規制対象に該当しても、特別に投票を許可するホスト(ホスト名又はIPの一部でも可。複数のときは「|」で区切って指定)
#================================== #実行形式例 #================================== &get_user_data; &reject_check;
if ($rejection == 1){ print "Content-type: text/html\n\n"; print "<html><body>プロクシ接続です</body></html>"; exit; }
#-------------------------------------------
#念のため停止 の部分は判定がきつすぎると思うのでコメントアウトしています。 必要に応じてコメントアウトを解除してください。
|
解決済み! |
|
■10428 / ResNo.5) |
VOTE COMの同一IP連続投稿防止改造時間設定版 バグ直し
|
□投稿者/ 南 -(2005/01/21(Fri) 23:43:06)
| No10415で書いたホストとIP収集ログは、取得した時間の変数の内容が変な バグがあったので以下に替えてください。 ついでに投票内容を取得するようにもしました。
#ホストとIP収集ログファイル #時間取得ルーチンはクッキーサブルーチンからパクリしていたけど日本標準時が変なのでローカルのほうからパルリ変更 #時間、IP、ホスト名記録 &time_;#現在時刻取得サブルーチン呼び出し open(IPHO,">>iphost.csv"); print IPHO $vote;#投票内容が書いている変数を読み込んで書き込む print IPHO ","; print IPHO $date; print IPHO ":";#$dateには秒が無いので追加 print IPHO $sec; print IPHO ","; print IPHO $addr; print IPHO ","; print IPHO $host; print IPHO "\n"; close(IPHO);
あと、前回のスクリプトのままだと、IPが登録されていないユーザーが 投票を行わない限りログ消去の処理が行われなかったので votec.cgiの 3行目:require './jcode.pl'; 以下に以下のスクリプトを入れてください。
#------------------------------------------- #アクセス時ログの初期化用TIMEログ作成 #記録用時間(秒)を計算 $time55 = time;#判定用時間全部足し算、1970年1月1日からの秒数を代入(20??年問題に引っかかりそうだけど使う)
open(TMI,'<','cleartime.log'); $time66 = <TMI>;#ログファイルの時間情報を読み込み close(TMI);
#現在の時間から記録された時間を引いて一日経っていたら判定、一日は86400秒 if($time55 - $time66 >= 86400){#1日以上経っていたら判定 open(TMO,">cleartime.log");#現在時間秒を記録(上書き) print TMO $time55; close(TMO);
open(IPO,">ip.log");#IPログに(「>」は上書き指定)上書きで""空白書き込み print IPO ""; close(IPO); }
#-------------------------------------------
|
解決済み! |
|
■10496 / ResNo.6) |
Re[6]: VOTE COMの同一IP連続投稿防止改造時間設定版 バグ直し
|
□投稿者/ 櫻 -(2005/02/07(Mon) 20:42:02)
| こんにちは、未だに試行錯誤しています。
南さんが書いたとおりvotec.cgiを書き換えてみたのですが、どうしても500エラーになってしまいます。 文法チェックをかけてみたら
#ログの初期化用TIMEログ作成 #記録用時間(秒)を計算 $time55 = time; #判定用時間全部足し算、1970年1月1日からの秒数を代入(20??年問題に引っかかりそうだけど使う)
open(TMI,'<','cleartime.log'); $time66 = <TMI>;#ログファイルの時間情報を読み込み close(TMI);
↑この辺らしいのですが、どこが違ってエラーになってしまっているのか判りません。 判るようでしたらご教授願えないでしょうか、よろしくお願いします。
|
|
|
■10522 / ResNo.7) |
連続投稿防止部分のみソース
|
□投稿者/ 南 -(2005/02/15(Tue) 14:52:38)
| こんにちは、櫻様。 私の現在使用しているCGIの部分と見比べても違いが無かったので 別の所がまずいかもしれません。 ですので、こちらで改造した最終的な形のスクリプトを貼り付けておきます。 念のため、無改造で新品状態のVOTE COMを再度ダウンロードし、 それを改造するといいかも知れません。 何時の間にか、別な場所を弄ってしまっているかも知れませんしね。
※投票収集ログを生成する部分はややこしくなりそうなので消しています
#『無改造votec.cgiの412行目の $addr = $ENV{'REMOTE_ADDR'}; の下に入れてください。』 #◆◇◆◇◆◇◆◇◆◇◆◇【改造場所】◆◇◆◇◆◇◆◇◆◇◆◇ open(IPI,"ip.log"); while (<IPI>){ chomp($_);#改行を取りのぞく if($_ eq $addr){&er_("投票を既に行っています");}#IPがすでにある場合終わり } close(IPI);
#ログの初期化用TIMEログ作成 #記録用時間(秒)と投票時の時間(秒)を計算する
#「time」は時間を1970年から秒で数えた数値を自動的に取り出すperlの機能 #これで投票した時刻を取得する。 $time55 = time;
open(TMI,'<','cleartime.log'); $time66 = <TMI>;#ログファイルの時間情報を読み込み close(TMI);
#現在の時間から記録された時間を引いて一日経っていたら実行、一日は86400秒 if($time55 - $time66 >= 86400){ open(TMO,">cleartime.log");#現在時間秒を記録(上書き) print TMO $time55; close(TMO); open(IPO,">ip.log");#ログに(「>」は上書き指定)上書きでIP書き込み print IPO $addr; print IPO "\n"; close(IPO); }else{#更新時間が記録された時間以下ならIPをログに追加 open(IPO,">>ip.log");#ログに(「>>」は追加指定)上書きでIP書き込み print IPO $addr; print IPO "\n"; close(IPO); }
#◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇
あとは予想でしか物を言えないのですが、 改造時に追加した部分だけ漢字コードや改行コードが違ってエラーになる事があるかも しれません…。 私の使っているテキストエディタはterapadと言うものです。 「http://www5f.biglobe.ne.jp/~t-susumu/」 漢字コードや改行コードを自動判別してくれる為便利です。
なにぶんCGIを勉強し始めたのがこの改造からだったりしますので 専門的な原因とか解らなくてすいません(汗
追伸:りゅういち様、長々とスクリプトの貼り付けなどして申し訳ないです。 No10416のような別のCGIからの引用や過去ログからの引用は別として 他の部分の改造はCGI文法などのサイトで勉強して書いたものなので多分オリジナルだと思います…。 そのオリジナル部分のスクリプトに関しては著作権を放棄します。 よろしければりゅういち様の投票フォームのバージョンアップ時などに 採用していただければ幸いです。
|
|
|
■10552 / ResNo.8) |
Re[8]: 連続投稿防止部分のみソース
|
□投稿者/ 櫻 -(2005/02/26(Sat) 18:42:51)
| 返事が遅くなって申し訳ありません。 あのあと何度か試してみたところ、エラーは出なくなりました。 ありがとうございます。
私のサイトの投票は「3時間に1回の投票」「上限15,000票」と設定してあります。 「好きなア−ティストへの投票」という形なので、競争が激しいです。 好きなアーティストには1位にいて欲しいので、連続投票も激しさを増すばかりです。 コメントもかなりきつい言葉が入ったりします。 1日に何百票と入るので、メンテナンスもかなり辛いです。 なのでせめて連続投票だけでもなくなってくれれば・・・と思うのですが、私のサイト自体気に入らない方もいるようで・・・。 どのような改造をしても、かいくぐってくる人はいるようですね。 管理人という立場上、ヒートアップしている方々になんと言って良いのやら・・・
なんか愚痴みたいになってしまってすみません。 来月からこのスクリプトでやってみようと思います。 ありがとうございました。
|
解決済み! |
|
■記事リスト /
レス記事表示 →
[親記事-8]
|