0

ユーザーによるスパム行為を防ぐにはどうすればよいですか? 同様に、ユーザーがコメントをすばやくすばやく、何度も何度も入力するのを防ぐにはどうすればよいでしょうか?

JSフィドル

HTML:

<p>
  <a href="javascript:void(0);" class="add_more">Add More</a>
</p>

<table border="0" width="500" cellspacing="0">
  <tbody class="append_data"></tbody>

  <tr>
    <td> 
      <textarea name="description" id="description"></textarea>
    </td> 
  </tr> 

</table>  

CSS:

#description{
  width:400px;    
}

.description_text{
  border:#333333 solid 1px;
  width:400px !important;
}

.append_data{
  white-space: pre-wrap;      /* CSS3 */   
  white-space: -moz-pre-wrap; /* Firefox */    
  white-space: -pre-wrap;     /* Opera <7 */   
  white-space: -o-pre-wrap;   /* Opera 7 */    
  word-wrap: break-word;      /* IE */
}

jQuery:

$('.add_more').click(function(){
    var description = $('#description').val();
    $(".append_data").append('<div class="description_text">'+description+'</div><br><br>');
  });
4

4 に答える 4

0

人間がスパム コメントを入れている場合は、 set-timeout などの関数を使用するか、jQuery Debounceなどのプラグインを使用して 60 秒に設定し、人々をイライラさせます。

仮説として、スパムコメントではなく「レート制限」を行っているだけの場合、上記の解決策は問題なく(「チャットルーム」のような行動などに役立ちます)、人々が次のようになるのを防ぎます

a

b

c

d

e

役職...

サーバー側を使用するほど強力ではありませんが、その半分程度までは可能です。

しかし、スパムボットの場合は、set-timeout では対応できないいくつかの異なるテクニックを使用できます (問題なく 1 日 24 時間サイトを攻撃できるため)。まず、何人かが指摘したように、サーバー側の検証です。彼らはAJAXリクエストを行い、あなたのサービスは応答し、あなたは彼らのプロファイルをチェックし、最後に投稿された変数を使用して、現在の時間と照合します. 現在時刻 - 最終投稿 < 間隔の場合、jQuery.ajax a la で処理できるメッセージを返します

.done(function(data) {
  if(data.timeoutCode == 1) {
    $.append("You can't post again so quickly");
  }})

また、スパムボットが通常入力する余分なフィールドを追加するという、非常に古いハッキー手法を使用することもできます...のように

<input type="text" name="location" style="display:none"></input>

スパムボットは盲目で、すべてのフィールドに入力し、失敗したというサーバーの応答が返ってくると考えています。しかし、JavaScript側では、送信するときにonclickボタンをチェックしてください if $("input[name='location']).val().length > 0... 長さが0より大きい場合、リクエストは無視されます (また、サーバー側の労力も少し節約されます)。フィールドが非表示になり、入力することができないため、通常のユーザーはそれに触れません。しかし、それは利用可能な POST 関数を使用しているだけの場合、クライアント側の検証は引き続き失敗し、サーバー側の検証でもバックアップする必要があります。

クライアント側のスパム ソリューションを提供するための絶対確実なソリューションはありません。クライアント側で支援することができます。

編集:アーチャーはまともなポイントを持ち出しました.

つまり、ユースケースも奇妙ですが、投稿が行われる前に event.which を使用して、ユーザーがボタンをクリックしたかどうか (または Enter などを使用したかどうか) を判断し、それを行った場合にのみ、コメントを作成している特定のユーザーに、実際に送信を押したりクリックしたり、自動化を使用して送信したりしていないことを示すことしかできませんでした。jQuery.append を使用している場合、サーバー経由でルーティングされていない限り、現在のセッションのビューに影響を与えるだけであり、サーバー経由でルーティングされている場合は、次のようにする必要があります。サーバー側で確認してください...

于 2013-09-16T16:45:08.797 に答える
0

sessionStorage 変数を使用して間隔を設定しました。これにより、コンテンツを追加してから 60 秒間追加ボタンをクリックできなくなります。

http://jsfiddle.net/vMcEE/

`sessionStorage.timer = 0;
  setInterval(function(){if (sessionStorage.timer > 0) {sessionStorage.timer--}},1000);
  $('.add_more').click(function(){
                         if (sessionStorage.timer == 0){
                             sessionStorage.timer += 30
                        var description = $('#description').val();
                        $(".append_data").append('<div class="description_text">'+description+'</div><br><br>');
                         }
                         });`
于 2013-09-16T16:18:09.243 に答える
0

U は、誰かが追加ボタンをクリックするたびに変数に + 1 を追加してみることができ、n 秒ごとに変数 = 0 になる setInterval を試すことができます

于 2013-09-16T16:08:44.737 に答える
0

これはどう...

http://jsfiddle.net/7jE9p/2/

「さらに追加」リンクをクリックすると、10秒間非表示になるようにしました...

$('.add_more').click(function() {
    var description = $('#description').val();
    $(".append_data").append('<div class="description_text">'+description+'</div><br><br>');
    var $this = $(this);
    $this.hide();
    setTimeout(function() {
        $this.show();
    }, 10000);
});
于 2013-09-16T16:16:30.277 に答える