【问题标题】:Multiple vote casting prevention code lets users vote twice多重投票预防代码让用户投票两次
【发布时间】:2017-12-12 11:03:24
【问题描述】:

我有一个赞成按钮和一个反对按钮,我正在尝试使用 cookie 来防止同一用户在他们已经投票后投票,但我的代码让他们在投票按钮变灰之前准确投票两次.我的代码有什么问题?

<html>
<form action="" method="post">
<input type="hidden" name="action" value="submit"/>
<input id="upvote" type="submit" name="submit" value="Upvote" 
    <?php 
    if (isset($_COOKIE['chocolatechip']) and $_COOKIE['chocolatechip'] = 
"voted=1") 
        {
        echo "disabled";
        } 
    ?>>
<input id="downvote" type="submit" name="submit" value="Downvote"
    <?php 
    if (isset($_COOKIE['chocolatechip']) and $_COOKIE['chocolatechip'] = 
"voted=1") 
        {
        echo "disabled";
        } 
    ?>>
</form>
</html>

<?php

if (isset($_POST['action']))
{
if ($_POST['submit'] == "Upvote") // if upvoted clicked
    {
    mysqli_query($conn,"UPDATE object_votes_table SET upvotes = upvotes + 1 
WHERE object = 'Ceramic'");
    setcookie('chocolatechip', 'voted=1');
    }
if ($_POST['submit'] == "Downvote") // if downvoted clicked
    {
    mysqli_query($conn,"UPDATE object_votes_table SET downvotes = downvotes 
+ 1 WHERE object = 'Ceramic'");
    setcookie('chocolatechip', 'voted=1');
    }
}
?>

【问题讨论】:

  • 您在此处分配$_COOKIE['chocolatechip'] = "voted=1",而不是比较。再添加一个 = 就可以了。
  • 除了比较运算符问题,您必须记住,您只能通过 next 请求从 $_COOKIE 读取 cookie,而不是直接在您所在的脚本实例中设置他们。所以首先你应该扭转你的逻辑 - 先处理表单数据,然后输出表单,这样你就可以在你刚刚成功处理投票之后已经在按钮上设置禁用属性。
  • 另外,您当然需要注意,禁用的按钮并不意味着没有人可以再向您的脚本发送此类请求。因此,在向数据库添加另一个投票之前,您至少应该检查 cookie ...
  • 好吧,我照你说的做了。我将数据库投票增量代码并在 html 表单代码上方设置 cookie 代码,但它没有改变任何东西。也没有将 = 更改为 ==。我确实尝试在增加数据库中的任何值之前进行 cookie 检查,这样可以防止同一用户的两次投票在数据库中注册,但他们仍然可以在按钮变灰之前单击两次。纯粹出于审美原因,我想解决这个问题。

标签: php


【解决方案1】:

试试

...and $_COOKIE['chocolatechip'] == "voted=1"

而不是

...and $_COOKIE['chocolatechip'] = "voted=1"

我无法解释为什么您的代码在 时间之后工作,但希望这会有所帮助...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-18
    • 2012-03-15
    • 2012-02-16
    相关资源
    最近更新 更多