2017-07-28 17 views
0

私はユーザー投稿用のシステムを持っています。私はajaxを使ってデータを取得しています。ユーザーがページの一番下までスクロールするとデータが取得されます。彼らがいるページに基づいたデータ。PHPとajax、デベロッパーコンソールのユーザー呼び出し機能を妨げる

私は、より良い、より安全な方法でこれを行うことができますので、ユーザーはコンソールを介してJS機能を呼び出すことはできませんし、無駄なajax呼び出し実際に投稿を好きではない。

これは、クライアント側でajaxリクエストを送信してデータを保存するためのJavaScriptコードです。現在のページ、最大ページ、ページアイテムをホームオブジェクトに保存します。

Home.all = { 
loader: $("div#allLoader"), 
isLoading: false, 
maxPosts: 0, 
likedIcon: '<i class="red-text material-icons">favorite</i>', 
unLikedIcon: '<i class="red-text material-icons">favorite_border</i>', 
lastLike: 0, 
liked: false, 
isToLoad: false, 
page: parseInt($("ul#posts-all").attr('data-page')), 
per_page: parseInt($("ul#posts-all").attr('data-per')), 
total_pages: parseInt($("ul#posts-all").attr('data-pages')), 
likePost: function (post_id) { 
    var post = $('#post-' + post_id); 
    var likes = parseInt(post.find('a.post-likes span').html()); 
    var now = $.now()/1000; 
    if(now - Home.all.lastLike > 1 && Home.all.liked) { 
     Home.all.liked = false; 
     Home.all.lastLike = now; 
     $.ajax({ 
      type: "POST", 
      url: "/post/like/" + post_id, 
      success: function (data) { 
       if(data.status === 1) { 
        post.find('a.post-likes i').remove(); 
        post.find('a.post-likes').prepend(Home.all.unLikedIcon); 
        Materialize.toast('You unliked this post.', 500); 
        likes -= 1; 
       } else if (data.status === 2) { 
        post.find('a.post-likes i').remove(); 
        post.find('a.post-likes').prepend(Home.all.likedIcon); 
        Materialize.toast('You liked this post.', 500); 
        likes += 1; 
       } 
       post.find('a.post-likes span').html(likes); 
      } 
     }); 
    } 
}, 
updatePage: function (page, per_page, total_pages) { 
    Home.all.page = parseInt(page); 
    Home.all.per_page = parseInt(per_page); 
    Home.all.total_pages = parseInt(total_pages); 
    $("ul#posts-all").attr('data-page', page); 
    $("ul#posts-all").attr('data-per', per_page); 
    $("ul#posts-all").attr('data-pages', total_pages); 
}, 
getPosts: function (page, per_page) { 
    if(Home.all.isToLoad) { 
     Home.all.isToLoad = false; 
     Home.all.loader.show(); 
     Home.all.isLoading = true; 
     Materialize.toast('Loading posts...', 1000); 
     setTimeout(function() { 
      $.ajax({ 
       type: "POST", 
       url: "/post/all/" + parseInt(page) + "?per_page=" + parseInt(per_page), 
       data: {}, 
       success: function (data) { 
        $("#posts-all").append(data.post_data); 
        Home.all.updatePage(page, per_page, data.total_pages); 
        Home.all.isLoading = false; 
       }, 
       complete: function() { 
        Home.all.loader.hide(); 
       } 
      }); 
     }, 1000); 
    } 
}}; 

投稿が好きで投稿を取得するための私のjqueryイベントです。

$(document).on('scroll', function() { 
    if(!Home.all.isLoading && Home.all.page != Home.all.total_pages) { 
     var bottomPosts = $('#posts-all').offset().top + $('#posts-all').outerHeight() - window.innerHeight; 
     if($(window).scrollTop() >= (bottomPosts) - 20) { 
      Home.all.isToLoad = true; 
      Home.all.getPosts(Home.all.page + 1, Home.all.per_page); 
     } 
    } 
}); 

$("#posts-all").on('click', '.post a.post-likes', function ($event) { 
    $event.preventDefault(); 
    Home.all.liked = true; 
    var postID = parseInt($(this).parents('.post').attr('id').split('-')[1]); 
    Home.all.likePost(postID); 
}); 

マイhome.allのオブジェクトが「気に入っ」と最初にfalseに設定されている「isToLoad」変数、その後、ユーザーはこれらのイベントをトリガし(そのページの一番下までスクロールしている場合はtrueに設定されていますisToLoadをtrueに設定するか、.post-likesリンクセットをクリックしてtrueを選択し、それに基づいてajax関数がサーバーに呼び出されているかどうかを確認します。 post_likesテーブルでは、ユーザーは実際に 'Home.all.liked = true'、次に 'Home.all.likePost(4545454545)'というランダムな投稿IDを使用してデータベースを迷惑メールにすることができません。

私はMVCを使用して、ここではtogglのコントローラメソッドです次のような投稿があります:

public function likePost($params) { 
    $response = ['status' => 0]; 
    $postID = (int) Input::sanitizeInt($params['postid']); 
    $userID = $this->app->currentUser()->id; 
    if($this->app->post()->UserLiked($postID, $userID)) { 
     $response['status'] = 1; 
     $this->app->post()->removePostLike($postID, $userID); 
    } else { 
     $response['status'] = 2; 
     $this->app->post()->addPostLike($postID, $userID); 
    } 
    return response($response, 200); 
} 

これは生成されているHTMLです。

<ul id="posts-all" data-page="1" data-per="5" data-pages="5" class="collection"> 
       <li id="post-5" class="post collection-item avatar"> 
       <img src="http://paul.dev/profile/img/default.png" alt="" class="circle"> 
      <span class="post-title">post</span> 
    <p class="post-content"> 
     12312  </p> 

       <a href="#" class="post-likes secondary-content"> 
     <i class="red-text material-icons">favorite_border</i> 
    <span>1</span> likes</a>       <p class="post-info">Posted by <a href="http://paul.dev/profile/view/AlexEY">Alex Makarov (AlexEY)</a> on Saturday 27th, July 2019 07:08 PM</p> 
      <p class="post-info">Tags: 
         None 
       </p> 
</li> 
    <li id="post-33" class="post collection-item avatar"> 
       <img src="http://paul.dev/profile/img/29-07-2017-01-24-03-82d02e07efaf4cf.png" alt="" class="circle"> 
      <span class="post-title">1</span> 
    <p class="post-content"> 
     1  </p> 

       <a href="#" class="post-likes secondary-content"> 
     <i class="red-text material-icons">favorite_border</i> 
    <span>1</span> likes</a>       <p class="post-info">Posted by <a href="http://paul.dev/profile/view/PauLeK">Paul Paul (PauLeK)</a> on Saturday 29th, July 2017 12:13 AM</p> 
      <p class="post-info">Tags: 
         None 
       </p> 
</li> 
    <li id="post-32" class="post collection-item avatar"> 
       <img src="http://paul.dev/profile/img/29-07-2017-01-24-03-82d02e07efaf4cf.png" alt="" class="circle"> 
      <span class="post-title">1</span> 
    <p class="post-content"> 
     1  </p> 

       <a href="#" class="post-likes secondary-content"> 
     <i class="red-text material-icons">favorite_border</i> 
    <span>1</span> likes</a>       <p class="post-info">Posted by <a href="http://paul.dev/profile/view/PauLeK">Paul Paul (PauLeK)</a> on Saturday 29th, July 2017 12:13 AM</p> 
      <p class="post-info">Tags: 
         None 
       </p> 
</li> 
    <li id="post-17" class="post collection-item avatar"> 
       <img src="http://paul.dev/profile/img/29-07-2017-01-24-03-82d02e07efaf4cf.png" alt="" class="circle"> 
      <span class="post-title">12312</span> 
    <p class="post-content"> 
     23123  </p> 

       <a href="#" class="post-likes secondary-content"> 
     <i class="red-text material-icons">favorite_border</i> 
    <span>0</span> likes</a>       <p class="post-info">Posted by <a href="http://paul.dev/profile/view/PauLeK">Paul Paul (PauLeK)</a> on Saturday 29th, July 2017 12:11 AM</p> 
      <p class="post-info">Tags: 
         None 
       </p> 
</li> 
    <li id="post-18" class="post collection-item avatar"> 
       <img src="http://paul.dev/profile/img/29-07-2017-01-24-03-82d02e07efaf4cf.png" alt="" class="circle"> 
      <span class="post-title">1123</span> 
    <p class="post-content"> 
     sdgdfg  </p> 

       <a href="#" class="post-likes secondary-content"> 
     <i class="red-text material-icons">favorite_border</i> 
    <span>1</span> likes</a>       <p class="post-info">Posted by <a href="http://paul.dev/profile/view/PauLeK">Paul Paul (PauLeK)</a> on Saturday 29th, July 2017 12:11 AM</p> 
      <p class="post-info">Tags: 
         None 
       </p> 
</li> 
    </ul> 
+0

なぜユーザーがあなたのウェブサイトをスパムしようとしていると思いますか?これの背後にある動機は何ですか?気になるいくつかの考え:IPまたは認証されたユーザーによるリクエストを抑制する。次の要求と共に渡されなければならない各アクションと共に認証トークンを返す。 JavaScriptを難読化する – fubar

+0

私はあなたが最初のステップをやっていると思います。私が考えている唯一の他のものは、_underscore.jsやおそらくPHPのような、JavaScriptやJavaScriptの拡張機能を使用することです。https://github.com/jakiestfu/Throttle –

答えて

1

JavaScriptはクライアント側であり、ボットによる迷惑メールの可能性を避ける方法はありません。ユーザーがブラウザでできることは何でも、ボットはそれを自動化できます。サーバー側でajaxリクエストを確認する必要があります。また、スパムを取得した場合は、IPまたはその他のフィルタに基づいて要求を絞り込みます。

「セキュリティ」というクライアント側のことはありません。これは、自動化することを難読化し複雑にしてしまう問題です。しかし、それは本当にあなたの時間の良い使用ですか?

+0

私も始めました最近webpackを使用していて、プラグインjs uglifyはすばらしい仕事をしてすべての変数をmanglingするので、ユーザーは今では縮小されたバンドルjavascriptファイルからデータを呼び出すこともできませんが、サーバー側にIPスロットルを追加するだけです。 –

関連する問題