Issue with Cookies (PHP)


Issue with Cookies (PHP)

我遇到了一个奇怪的问题。好吧,在我的网站上,我有一个反馈和评论系统,两者都使用 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
}