2010-05-25 60 views
2

我想阻止用户意外发表评论两次。 我使用PRG(post重定向get)方法,以便将数据插入另一个页面,然后将用户重定向到显示注释的页面。这允许用户根据需要刷新多次。但是,当用户返回并单击再次提交或单击提交100次时,这不起作用。我不想要100条相同的评论。有哪些方法可以防止表单中的重复发布? (PHP)

我看了SO上的相关问题,发现一个令牌是最好的。但是我在使用它时遇到了麻烦。

//makerandomtoken(20) returns a random 20 length char. 

<form method="post" ... > 
<input type="text" id="comments" name="comments" class="commentbox" /><br/> 
<input type="hidden" name="_token" value="<?php echo $token=makerandomtoken(20); ?>" /> 
<input type="submit" value="submit" name="submit" /> 
</form> 

if (isset($_POST['submit']) && !empty($comments)) 
{ 
    $comments= mysqli_real_escape_string($dbc,trim($_POST['comments'])); 

    //how do I make the if-statment to check if the token has been already set once? 
    if (____________){ 
     //don't insert comment because already clicked submit 
    } 
    else{ 
     //insert the comment into the database 
    } 
} 

所以我有令牌作为隐藏值,但如何使用它来防止多次点击提交。

方法: 有人建议使用会话。我会将随机标记设置为$ _SESSION ['_ token']并检查该会话标记​​是否等于$ _POST ['_ token'],但我该怎么做?当我尝试时,它仍然不检查

+0

您可能要修改标题,但对问题的其余部分不是100%准确。 – jcolebrand 2010-05-25 03:03:25

回答

0

我会跳过整个随机标记的东西,只是在会话中存储(散列)注释。如果它与存储在会话中的现有值相匹配,则放弃该评论。如果没有,让它通过。显然有问题:

  • 它停止用户在不同的地方张贴相同的评论。如果这是一个问题,请存储评论的散列和其评论对象的ID。
  • 用户可以按“返回”并提交不同的评论。我认为这是一个功能(比放弃评论更好,因为它匹配之前评论的随机标记)。将其自动解释为注释编辑并不容易。
  • 如果用户在备用选项卡上按下“提交”,则不起作用。 (我认为这是不可能的,而且它不需要多个随机令牌的存储。)

你可能想要一个随机令牌,以防止XSRF无论如何,但这是另一个问题(在这种情况下,要确保随机令牌与“应该是什么”相同;我会在会话中存储一个长寿命的令牌)。

另外,请考虑使用预准备语句。

6

如果要防止双重提交,则必须存储“已提交”状态与“未提交”状态。你有几个选择来保存这些信息。

  • 数据库 - 添加隐藏字段与自动生成的值是唯一的(你可以生成一个短的随机字符串,并追加当前时间)。此值也可用于识别对话 - 如果您需要有状态的Web对话。将此值添加到数据库并使其唯一。缺点:数据库冗余存储,注释插入性能下降,必须生成一个唯一的字符串。
  • 会话 - 添加相同隐藏的字段,其值类似。当用户提交表单时,如果该表单中没有该值,请将该值保存在会话中。如果是,那是双重提交。缺点:您仍然需要生成唯一的令牌。
  • 浏览器 - (1)添加一些JavaScript以禁用点击提交按钮后。 (2)具有以值0开始的隐藏字段,并且当用户单击提交按钮时变为1。如果用户再次点击该按钮,则检查该值是否为1,如果是则中止。优点:没有独特的字符串。缺点:需要启用javascript;无论如何,您可能需要字符串来实现有状态的Web对话。
+0

谢谢,我会试试看,看看我得到了什么! – jpjp 2010-05-25 03:34:25

0

你也可以在jquery中做到这一点非常简单。

$(document).on('click', '.className', function(){ 
    $(this).css('pointer-events', 'none'); 
}); 
相关问题