点击按钮不止一次-PHP


Hitting the Button More Than Once - PHP

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

有什么PHP解决方案吗?我很新,所以请不要去说技术性的话。

谢谢。:)

没有办法从服务器端禁用该按钮。客户端正在提交多个请求,这些请求由为每个请求创建新线程的Web服务器单独执行。你需要检查用户是否已经提交了评论——一种方法是首先检查数据库中该线程/帖子中的最后一篇帖子,如果用户已经发布了你的请求——或者只呈现目标页面而不执行查询。

最简单的解决方案是将所有数据存储在会话中,您需要确定注释是唯一的。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禁用该按钮

您可以使用session来存储最后一条注释的内容和时间。我想Wordpress就是这么做的。

所以寻找

session_start()
$_SESSION

您只需在评论旁边记录一些内容来识别用户,例如IP,每分钟只允许一条评论,比如说5分钟和IP,同时丢弃该IP提交的任何其他评论。

您可以在单击时隐藏按钮,并使另一个假按钮可见。