我有一个很奇怪的问题。好吧,在我的网站上我有一个反馈和评论系统,都使用cookie来阻止人们发送大量评论(大量垃圾邮件),阻止撰写评论或反馈帖子,例如30秒。如果他们禁用cookie,他们就无法发表评论或反馈。我使用带有JQuery脚本的系统,使用PHP中的进程来刷新页面。
第一个问题 - 由于某种原因,在localhost(托管在我家)它运行正常,阻止人们。但是在主机上,如果我上传脚本(例如,如果我想进行更新),它会停止工作,我可以尽可能多地评论,它不会阻止。但它只是在我的电脑上(因为我测试过,在我兄弟的笔记本电脑上,在我的工作中工作正常)我也在IE,Firefox和Chrome上测试过。但是几天之后(随机,1-4)它开始工作正常。但是如果我更新脚本(即使不更改那个脚本),也会支持这个问题。
第二个问题 - 在投票(反馈)和评论系统上,如果'块系统'工作正常,它将阻止用户30秒。但是,当我提交评论时,在第一秒快速点击,它将提交两次。比如,做同样评论的2/3(有时是4次)。但如果我在30秒之前尝试再次发表评论,它将会阻止。如何防止人们重复提交?
以下是一些代码,它应该有所帮助。
的comments.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 = "";
未refresh.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);
}
});}
先谢谢。
答案 0 :(得分:0)
首先,请勿使用Cookie来阻止用户状态。它们可以被更改,或者在这种情况下被完全删除,从而绕过应用程序阻止输入的能力。
将其切换到快速PDO查找以查明用户发布的时间 - 如果您需要使用帖子IP地址和用户名,请添加新列 - 并对其进行验证。
或者使用JavaScript查询进行30秒倒计时以防止初始请求,然后使用DB来防止双击该按钮。
尽量不要使用cookies,但除非你也有,否则它们太容易操作,以后会更加容易;被偷了。
答案 1 :(得分:0)
cookie不会阻止垃圾邮件发送者。使用时间戳记录ipaddress并检查(例如)。你让自己太复杂了,垃圾邮件发送者太容易克服。
这是一个如何检查一个ipadress的帖子数量的示例:
//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
}