我如何在Laravel中创建一个安全的upvote / downvote系统,例如reddits,甚至是无法用假ajax请求加载的堆栈溢出。 (对不起,如果我不知道该术语)。

我有3张桌子:

**User**
id

**Post**
id

**Vote**
id
user_id
post_id
vote (int)


我的一般想法是,当单击“ upvote”或“ downvote”按钮时,使用JQuery使用具有post_id和表决的POST数据来触发AJAX,其中1代表upvote,-1代表downvote。这将通过VotesController @ vote路线选择。表决方法将检查用户是否已通过身份验证,检查是否有来自同一用户和同一帖子的表决,以及表决是否存在:更改(下降),否则将添加(上升)。

继承人我的伪码

function vote()
{
    //Checks if user is logged in
    if(Auth::check()){

        //checks if ajax request
        if (Request::ajax())
        {
                            //get my data
            $post = Input::post('post');
                            $vote = Input::post('vote');
            $user = Auth::user()->id;

            //checks if user voted
            $vote = querythatisnotyetcoded

            //if row exists
            if($vote->count() > 0){
                //change row AKA DOWNVOTE
                Vote->vote = $vote // however you change values
            }
            else{
                //add new row AKA UPVOTE
                Vote::create([
                    'user_id' => $user,
                    'post_id' => $post,
                                'vote' => $vote
                ]);
            }
        }
        else{
            return "No Ajax Request";
        }
    }
    else{
        return "Not logged in";
    }
}


请让我知道该逻辑是否安全。

*编辑:不知道为什么我的代码是半褐色的(已修复!)

最佳答案

这样的事情应该可以解决问题。

function vote()
{
    if (Auth::check()) {

        if (Request::ajax())
        {
            $post = Input::post('post');
            $vote = Input::post('vote');
            $user = Auth::user()->id;

            // Grab the vote if it already exists.
            $entry = Vote::where('user_id', $user)->where('post_id', $post)->first();

            if ($entry->count())
            {
                $entry->vote = $vote;
                $entry->save();
            }
            else
            {
                $entry = new Vote;
                $entry->user_id = $user;
                $entry->post_id = $post;
                $entry->save();
            }
        }
        else
        {
            return "Not an AJAX request.";
        }
    }
    else
    {
        return "User not logged in.";
    }
}

10-08 08:45