0

私は本当に奇妙な問題を抱えています。さて、私のウェブサイトにはフィードバックとコメントのシステムがあります。どちらも Cookie を使用して、人々が大量のコメント (大量のスパム) を送信するのを防ぎ、コメントの書き込みや投稿へのフィードバックを 30 秒間ブロックします。Cookie を無効にすると、コメントやフィードバックができなくなります。ページを更新しないように、PHP のプロセスを使用して JQuery スクリプトでシステムを使用しています。

最初の問題 - 何らかの理由で、(私の家でホストされている) ローカルホストで正常に動作し、人々をブロックします。しかし、ホストでは、スクリプトをアップロードすると (たとえば、更新を行いたい場合)、作業が停止し、好きなだけコメントでき、ブロックされません。しかし、それは私のコンピューター上だけです(私がテストしたように、兄弟のノートブックと私の仕事では問題なく動作します)IE、Firefox、およびChromeでもテストしました。しかし、数日後 (ランダム、1 ~ 4 日) に正常に動作し始めます。しかし、スクリプトを更新すると (そのスクリプトを変更しなくても)、問題が解決されます。

2 番目の問題 - 投票 (フィードバック) およびコメント システムでは、「ブロック システム」が正常に機能すると、ユーザーが 30 秒間ブロックされます。しかし、コメントを送信すると、最初の 1 秒で非常に速くクリックすると、2 回送信されます。同様に、同じコメントを 2/3 (場合によっては 4) 回行います。しかし、30 秒前にもう一度コメントしようとすると、ブロックされます。人々が重複して送信するのを防ぐにはどうすればよいですか?

ここにいくつかのコードがあります。役立つはずです。

コメント.php

if (isset($_COOKIE["AbleCookie"])) //prevent disabled cookies
{
    if (!isset($_COOKIE["time"])) //verify if the cookie time (to block comment) has been set
    {
        if (strlen($Comentario) != 0)
        {
            if (strlen($Comentario <= 500))
            {
              ob_start(); //need this?
              setcookie("time", "anyvalue", time()+$Segundos);
              ob_end_flush();

                if (isset($Usuario))
                {
                    $acharUsuario = "select query";
                    $resultado = mysql_query($acharUsuario, $conexao) or die (mysql_error());
                    $ExisteUsuario = mysql_num_rows($resultado);

                    if ($ExisteUsuario != 0)
                    {
                        $UsuarioID = mysql_result($resultado, 0, 'id_usuario');

                        $InserirComentario = "insert query";
                        mysql_query($InserirComentario, $conexao) or die (mysql_error());

                        $Mensagem = "Correct";
                    }
                }
                else
                {
                    $InserirComentario = "insert query";
                    mysql_query($InserirComentario, $conexao) or die (mysql_error());

                    $Mensagem = "Correct";
                }
            }
            else
              $Mensagem = "<h3>Your comment must has less than 500 characters.</h3>";
        }
        else
          $Mensagem = "<h3>To comment something, you have to write something, right?</h3>";
    }
    else
      $Mensagem = "<h3>You just can do another comment after $Segundos seconds!</h3>";
}
else
  $Mensagem = "Something went wrong! Please, take a look on our <a href='../faq'><b>FAQ</b></a>!";

echo $Mensagem;
$Mensagem = "";

not-refresh.js

function InserirComentario(){
var uname = $('#PostComentario').val();
var postid = $('#CommentPostID').val();
var dataString = 'post_comentario='+ uname + '&comment_postid='+ postid;

    $.ajax({
        type: "POST",
        url: "sucess/comments.php",
        data: dataString,
        cache: false,
        success: function(result){
                    if (result=='Correct')
                {
                  document.getElementById("PostComentario").value = "";
                }
                    else
                {
                  $("#ComentariosFullPost").html(result);}
                },
        error: function(xhr, ajaxOptions, thrownError){
          alert("Error Status: " + xhr.status + " Thrown Errors: "+thrownError);
        }
    });}

ありがとうございます。

4

2 に答える 2

0

まず、ユーザーの状態を防ぐために Cookie を使用しないでください。それらは変更されるか、この場合は完全に削除される可能性があるため、入力を防ぐアプリケーションの機能を回避できます。

クイック PDO ルックアップに切り替えて、ユーザーがいつ投稿したかを調べます。必要に応じて、投稿の IP アドレスとユーザー名を含む新しい列を追加し、それに対して検証します。

または、JavaScript クエリを使用して 30 秒のカウントダウンを実行して最初のリクエストを防ぎ、次に DB でボタンのダブルクリックを防ぎます。

Cookie を使用しないように最善を尽くしてください。ただし、Cookie を使用しない限り、操作が簡単すぎて後日になってしまいます。盗まれる。

于 2013-01-29T23:37:32.557 に答える
0

クッキーはスパマーを止めません。タイムスタンプを使用して ipaddress をログに記録し、それを確認します (たとえば)。あなたはそれを自分自身にとって複雑にしすぎており、スパマーにとって克服するのがあまりにも簡単です.

これは、1 つの IP アドレスで投稿数を確認する方法の例です。

//check posts
$ip = ip2long($_SERVER['REMOTE_ADDR']);
$q = $db->prepare("SELECT COUNT(id) as num FROM `posts` 
                   WHERE `ipaddress` = ? && time > ?");
$q->execute( array( $ip, strtotime("-30 seconds") ) );

$numberOfPosts = $q->fetch(2);
$numberOfPosts = $numberOfPosts['num'];

if( $numberOfPosts > 0 ){
 //not allowed
}
于 2013-01-29T23:37:35.213 に答える