我将如何在Laravel中创建一个安全的upvote / downvote系统,如reddits,甚至是堆栈溢出,无法加载假的ajax请求。 (对不起,如果我不懂术语)。
我有3张桌子:
**User**
id
**Post**
id
**Vote**
id
user_id
post_id
vote (int)
我的一般想法是,当点击向上投票或向下投票按钮时,使用JQuery来发布具有post_id&的POST数据的AJAX。投票,1为upvote,-1为downvote)。这将由VotesController @ vote路由选择。投票方法将检查用户是否经过身份验证,检查是否存在来自同一用户和同一帖子的投票,以及投票是否存在:更改它(downvote),否则它将添加它(upvote)。
Heres my kinda-psudocode
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";
}
}
如果这个逻辑是安全的,请告诉我。
*编辑:不知道为什么我的代码是半棕色的(修正了!)
答案 0 :(得分:1)
你想要多安全?对于“完整”安全性,您需要运行HTTPS - 但如果没有它,您可以获得一定程度的安全性。
要防止用户伪造其他用户的投票,您需要检查用户是否已登录当前的HTTP会话。 HTTP会话由特定于客户端的令牌或cookie实现,通常只对该用户可见。
然而,这种简单的方法不会防止精心策划的流量嗅探或中间人攻击,这可能在概念上捕获会话令牌和攻击。伪造请求。防御这些只能通过HTTPS或客户已知的“共享秘密”(例如用户密码)来完成。服务器,但从未发送过,也就是使用散列。这使用HMAC函数来散列密码&挑战,只通过线路发送结果哈希。
这适用于登录屏幕。
不幸的是,对于投票,除非您可以在浏览器中保留密码,或者用于验证您的请求的其他共享密钥,否则它并不那么容易。单页AJAX应用程序可行,我不确定其他人。
答案 1 :(得分:1)
这样的事情应该可以解决问题。
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.";
}
}