HOME HELP 新着記事 ツリー表示 スレッド表示 トピック表示 検索 過去ログ

■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にしています。
    試しにバイナリでアップロードしてみたりしましたが結果は変わりませんでした。

    もしよろしければアドバイスなど頂ければ幸いです。

引用返信 [メール受信/OFF] 削除キー/
■10390 / ResNo.1)  Re[1]: VOTE COMの連続投稿防止改造について
□投稿者/ りゅういち -(2005/01/16(Sun) 04:56:14)
http://www.cj-c.com/
    No10381に返信(南さんの記事)
    > > と、ログ内で改行させるなどさせてみました
    > 試したのは(\r\nと\nのみ)
    > ですが、改行されるだけで複数のIPアドレスを認知してくれませんでした。
    > > ip.logに関してはアスキーでアップロードし、属性は666にしています。
    > 試しにバイナリでアップロードしてみたりしましたが結果は変わりませんでした。

    なるほど、では、\n にして
    while (<IPI>){
    if($_ eq $addr){&er_("二重投票は禁止");}#IPがすでにある場合終わり
    }
    の部分を
    while (<IPI>){
    chomp($_);#改行を取りのぞく
    if($_ eq $addr){&er_("二重投票は禁止");}#IPがすでにある場合終わり
    }
    としてみてください。
引用返信 [メール受信/OFF] 削除キー/
■10406 / ResNo.2)  VOTE COMの同一IP連続投稿防止改造
□投稿者/ 南 -(2005/01/17(Mon) 23:53:48)
    > なるほど、では、\n にして
    > while (<IPI>){
    > if($_ eq $addr){&er_("二重投票は禁止");}#IPがすでにある場合終わり
    > }
    > の部分を
    > while (<IPI>){
    > chomp($_);#改行を取りのぞく
    > if($_ eq $addr){&er_("二重投票は禁止");}#IPがすでにある場合終わり
    > }
    > としてみてください。

    ご返答、誠に有難うございました。
    さっそくお教え頂いた修正部分を組み込んだ所、無事複数のIPアドレスを
    認知してくれました。
    本当に有難うございました。


    過去ログに入ったときに解りやすいよう
    最終的に組み込んだスクリプトを添えます。

    #改造ここから-----------------------------------
    open(IPI,"ip.log");
    while (<IPI>){
    chomp($_);#改行を取りのぞく
    if($_ eq $addr){&er_("接続されたIPアドレスで今日の分の投票を既に行っています");}#IPがすでにある場合終わり
    }
    close(IPI);
    if((-M "ip.log") < 1){#更新されてから1日以内ならIP追加
    open(IPO,">>ip.log");
    print IPO $addr;
    print IPO "\n";
    close(IPO);
    }else{#更新されて1日以上ならログをフォーマットして追加
    open(IPO,">ip.log");
    print IPO $addr;
    print IPO "\n";
    close(IPO);
    }
    #---------------------------------------------


    最初投稿したスクリプトで、\nを「""」で囲むのを忘れていていました;;
解決済み!
引用返信 [メール受信/OFF] 削除キー/
■10415 / ResNo.3)  VOTE COMの同一IP連続投稿防止改造時間設定版
□投稿者/ 南 -(2005/01/19(Wed) 21:33:45)
    2005/01/19(Wed) 21:45:02 編集(投稿者)
    2005/01/19(Wed) 21:34:02 編集(投稿者)

    こんばんわ、前回りゅういち様にスクリプトのアドバイスを頂いたのですが。
    前回のままだと、指定時間が到達する前に、誰かが投票を行うと
    そこから再び指定時間までのカウントが始まり、永遠に投稿できない人が出そうなので
    時間を記録して、そこから指定時間をカウントするスクリプトの改造を行ってみました。


    #◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇
    #◆◇◆◇◆◇◆◇◆◇◆◇【改造場所】◆◇◆◇◆◇◆◇◆◇◆◇
    #◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇
    open(IPI,"ip.log");
    while (<IPI>){
    chomp($_);#改行を取りのぞく
    if($_ eq $addr){&er_("今日の分の投票を既に行っています");}#IPがすでにある場合終わり
    }
    close(IPI);

    #ホストとIP収集ログファイル生成(コメント無し投票はIPが解らないので)
    #時間取得ルーチンはクッキーサブルーチンからパクリ
    #時間、IP、ホスト名記録
    $tukihime = $mong + 1;#月の取得は1月=0 12月=11だったので+1
    $nekomimi = $hourg + 9;#日本の標準時は世界標準時+9時間なので+9
    open(IPHO,">>iphost.csv");
    print IPHO "$yearg/$tukihime/$mdayg/$youbi,$nekomimi:$ming:$secg";
    print IPHO ",";
    print IPHO $addr;
    print IPHO ",";
    print IPHO $host;
    print IPHO "\n";
    close(IPHO);

    #ログの初期化用TIMEログ作成
    #記録用時間(秒)を計算
    $time55 = time;#判定用時間全部足し算、1970年1月1日からの秒数を代入(20??年問題に引っかかりそうだけど使う)

    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);
    }

    #◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇
    #◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇

    一応、簡単なテストで動作不具合が起きなかったです。
    これから改造する方で、投票数が多いサイトの方などにどうぞ。

    スクリプトの真中にあるのはおまけで出来上がった投票IP記録スクリプトです。
    年月とIPアドレス、ホストアドレスがCSV形式で保存されます。

    ip.log
    iphost.csv
    cleartime.log
    の空のファイルを作ってください。「cleartime.log」は念のため0と書いておいたほうが
    いいと思います。
    ファイル名を変えたときは、スクリプトのログファイル指定のところも変えてください。
    全部のログファイルはパーミッション「666」で上げてください。
解決済み!
引用返信 [メール受信/OFF] 削除キー/
■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;
    }

    #-------------------------------------------


    #念のため停止
    の部分は判定がきつすぎると思うのでコメントアウトしています。
    必要に応じてコメントアウトを解除してください。

解決済み!
引用返信 [メール受信/OFF] 削除キー/
■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);
    }

    #-------------------------------------------

解決済み!
引用返信 [メール受信/OFF] 削除キー/
■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);

    ↑この辺らしいのですが、どこが違ってエラーになってしまっているのか判りません。
    判るようでしたらご教授願えないでしょうか、よろしくお願いします。
引用返信 [メール受信/ON] 削除キー/
■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文法などのサイトで勉強して書いたものなので多分オリジナルだと思います…。
    そのオリジナル部分のスクリプトに関しては著作権を放棄します。
    よろしければりゅういち様の投票フォームのバージョンアップ時などに
    採用していただければ幸いです。
引用返信 [メール受信/OFF] 削除キー/
■10552 / ResNo.8)  Re[8]: 連続投稿防止部分のみソース
□投稿者/ 櫻 -(2005/02/26(Sat) 18:42:51)
    返事が遅くなって申し訳ありません。
    あのあと何度か試してみたところ、エラーは出なくなりました。
    ありがとうございます。

    私のサイトの投票は「3時間に1回の投票」「上限15,000票」と設定してあります。
    「好きなア−ティストへの投票」という形なので、競争が激しいです。
    好きなアーティストには1位にいて欲しいので、連続投票も激しさを増すばかりです。
    コメントもかなりきつい言葉が入ったりします。
    1日に何百票と入るので、メンテナンスもかなり辛いです。
    なのでせめて連続投票だけでもなくなってくれれば・・・と思うのですが、私のサイト自体気に入らない方もいるようで・・・。
    どのような改造をしても、かいくぐってくる人はいるようですね。
    管理人という立場上、ヒートアップしている方々になんと言って良いのやら・・・

    なんか愚痴みたいになってしまってすみません。
    来月からこのスクリプトでやってみようと思います。
    ありがとうございました。
解決済み!
引用返信 [メール受信/OFF] 削除キー/



スレッド内ページ移動 / << 0 >>

このスレッドに書きこむ

Pass/

HOME HELP 新着記事 ツリー表示 スレッド表示 トピック表示 検索 過去ログ

- Child Tree -