Cookies问题(PHP)

时间:2013-01-29 23:25:10

标签: php cookies

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

先谢谢。

2 个答案:

答案 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
}