我遇到了一个奇怪的问题。好吧,在我的网站上,我有一个反馈和评论系统,两者都使用 cookie 来防止人们发送大量评论(大量垃圾邮件),阻止撰写评论或反馈帖子,例如 30 秒。如果他们禁用 cookie,则无法评论或反馈。我将系统与 JQuery 脚本一起使用,使用 PHP 中的进程来不刷新页面。
第一个问题 - 出于某种原因,在本地主机(托管在我家)上它工作正常,阻止人们。但是在主机上,如果我上传脚本(例如,如果我想进行更新),它会停止工作,我可以随心所欲地发表评论,它不会阻止。但它只是在我的电脑上(正如我测试的那样,在我兄弟的笔记本上,在我的工作中工作正常),我也在IE,Firefox和Chrome上进行了测试。但是几天后(随机,1-4),它开始正常工作。但是,如果我更新脚本(即使不更改该脚本),也会支持该问题。
第二个问题 - 在投票(反馈)和评论系统上,如果"阻止系统"工作正常,它将阻止用户 30 秒。但是,当我提交评论时,在第一秒点击非常快,它将提交两次。比如,做 2/3(有时是 4)次相同的评论。但是如果我尝试在 30 秒之前再次发表评论,它会阻止。如何防止人们重复提交?
这里有一些代码给你,它应该会有所帮助。
评论.php
if (isset($_COOKIE["AbleCookie"])) //prevent disabled cookies
{
if (!isset($_COOKIE["time"])) //verify if the cookie time (to block comment) has been set
{
if (strlen($Comentario) != 0)
{
if (strlen($Comentario <= 500))
{
ob_start(); //need this?
setcookie("time", "anyvalue", time()+$Segundos);
ob_end_flush();
if (isset($Usuario))
{
$acharUsuario = "select query";
$resultado = mysql_query($acharUsuario, $conexao) or die (mysql_error());
$ExisteUsuario = mysql_num_rows($resultado);
if ($ExisteUsuario != 0)
{
$UsuarioID = mysql_result($resultado, 0, 'id_usuario');
$InserirComentario = "insert query";
mysql_query($InserirComentario, $conexao) or die (mysql_error());
$Mensagem = "Correct";
}
}
else
{
$InserirComentario = "insert query";
mysql_query($InserirComentario, $conexao) or die (mysql_error());
$Mensagem = "Correct";
}
}
else
$Mensagem = "<h3>Your comment must has less than 500 characters.</h3>";
}
else
$Mensagem = "<h3>To comment something, you have to write something, right?</h3>";
}
else
$Mensagem = "<h3>You just can do another comment after $Segundos seconds!</h3>";
}
else
$Mensagem = "Something went wrong! Please, take a look on our <a href='../faq'><b>FAQ</b></a>!";
echo $Mensagem;
$Mensagem = "";
不刷新.js
function InserirComentario(){
var uname = $('#PostComentario').val();
var postid = $('#CommentPostID').val();
var dataString = 'post_comentario='+ uname + '&comment_postid='+ postid;
$.ajax({
type: "POST",
url: "sucess/comments.php",
data: dataString,
cache: false,
success: function(result){
if (result=='Correct')
{
document.getElementById("PostComentario").value = "";
}
else
{
$("#ComentariosFullPost").html(result);}
},
error: function(xhr, ajaxOptions, thrownError){
alert("Error Status: " + xhr.status + " Thrown Errors: "+thrownError);
}
});}
提前谢谢。
首先,不要使用 cookie 来阻止用户状态。它们可以被更改或在这种情况下完全删除,从而绕过应用程序阻止输入的能力。
将其切换到快速PDO查找,以了解用户何时发布 - 如果需要,请使用帖子IP地址和用户名添加新列 - 并据此进行验证。
或者使用 JavaScript 查询执行 30 秒倒计时以防止初始请求,然后使用 DB 进行反向单击按钮。
尽最大努力远离cookie,除非你也有,否则它们太容易操纵了,以后会被偷走。
cookie 不会阻止垃圾邮件发送者。使用时间戳记录 IP 地址并检查(例如)。你让自己变得太复杂了,对于垃圾邮件发送者来说太容易克服了。
这是如何通过一个地址检查帖子数的示例:
//check posts
$ip = ip2long($_SERVER['REMOTE_ADDR']);
$q = $db->prepare("SELECT COUNT(id) as num FROM `posts`
WHERE `ipaddress` = ? && time > ?");
$q->execute( array( $ip, strtotime("-30 seconds") ) );
$numberOfPosts = $q->fetch(2);
$numberOfPosts = $numberOfPosts['num'];
if( $numberOfPosts > 0 ){
//not allowed
}