多次击中按钮 - PHP

时间:2012-03-21 10:48:34

标签: php mysql sql forms

在我的评论系统中,我注意到一个小小的安全漏洞。在加载页面的几秒钟内,用户可以多次单击“发布”按钮向数据库提交多个注释而不是一个。我设法用一个简单的Javascript输入禁用东西解决这个问题,但后来我记得人们可以使用Firebug或Inspect Element轻松编辑它。

是否有某种PHP解决方案?我很新,所以请不要说技术性话语。

感谢。 :)

5 个答案:

答案 0 :(得分:1)

无法从服务器端禁用该按钮。客户端正在提交多个请求,这些请求由Web服务器单独执行,该服务器为每个请求创建一个新线程。您需要检查用户是否已经提交了注释 - 这样做的方法是首先检查数据库中该帖子中该帖子的最后一个帖子,如果用户已经发布了您放弃该请求 - 或者只是渲染目标网页,而不执行查询。

答案 1 :(得分:0)

您可以使用会话来存储上次评论的内容和时间。我想这就是Wordpress如何做到的。

所以寻找

session_start()
$_SESSION

答案 2 :(得分:0)

你可以记录一些东西来识别用户以及评论,例如IP,并且只允许一个评论,例如5分钟和IP,同时丢弃该IP的任何其他提交的评论。

答案 3 :(得分:0)

您可以在点击时隐藏按钮,并显示另一个虚假按钮。

答案 4 :(得分:0)

最简单的解决方案是将所有数据存储在会话中,您需要确定该注释是唯一的。只要用户在您的网站上停留,另一个访问者将有另一个会话,则PHP会话处于活动状态。这意味着,要确定您的访问者是否点击了该按钮两次,您只需要a)消息和b)在哪个帖子(我假设)/他评论。

一个例子:

session_start();

// This is something you already have, sort-of
$message = $_POST['message']; // Message from user
$post    = $_GET['id']        // Id of post to which he commented

if (isset($_SESSION['message']
 && isset($_SESSION['id']
 && $message === $_SESSION['message']
 && $post === $_SESSION['id'])
{
  // We found out the user has already posted this
  echo 'Error: you clicked twice!';
  exit;
}

// Process message here as you already do

// Store now this just posted message in a session
$_SESSION['message'] = $message;
$_SESSION['id']      = $post;

使用此方法,您确定服务器中没有数据持续两次。但是,您仍然需要使用javascript禁用该按钮,因为只要您的请求正在进行,您就无法使用php禁用该按钮。