在我的评论系统中,我注意到一个小的安全漏洞。在加载页面的几秒钟内,用户可以多次单击"发布"按钮,向数据库提交多条评论,而不是一条。我用一个简单的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提交的任何其他评论。
您可以在单击时隐藏按钮,并使另一个假按钮可见。