Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP请求垃圾邮件预防机制_Php_Spam - Fatal编程技术网

PHP请求垃圾邮件预防机制

PHP请求垃圾邮件预防机制,php,spam,Php,Spam,我正在构建一个model view controller web应用程序,我想构建一个请求垃圾邮件机制,为什么?让我简单详细地解释一下: 我们为自己准备了一个ajax控制器,每个用户的输入都是通过ajax接收的,在我的web应用程序中没有直接的$\ POST 让我们想象一下Ajax控制器的一些操作,我们希望在其中设置垃圾邮件预防机制: class AjaxController{ private function setPrevention($interval){ $lat

我正在构建一个model view controller web应用程序,我想构建一个请求垃圾邮件机制,为什么?让我简单详细地解释一下:

我们为自己准备了一个ajax控制器,每个用户的输入都是通过ajax接收的,在我的web应用程序中没有直接的$\ POST

让我们想象一下Ajax控制器的一些操作,我们希望在其中设置垃圾邮件预防机制:

class AjaxController{
    private function setPrevention($interval){
        $latestActionRequest = $_SESSION['requests'][$this->action];

        if($prevention === null){
            $_SESSION['requests'][$this->action] = array('latest' => microtime(), 'interval' => $interval
        } else {
            // Calc difference here, and check if the interval was within range, else
            // the user was requesting the action method to quickly.
        }
    }

    public function _postComment(){
        $this->setPrevention(1000);

        // Apply validation, on the $_POST array, insert the to database.
    }
}
所以我们得到了一个发布评论的操作,我们只想允许用户每秒发布一条评论,所以我们在会话中应用了一个非常基本的预防方法

检查setPrevention方法中的注释。我有两个问题,第一个问题是,这个机制是个好主意吗?或者有其他更好的方法来建立这个

第二个问题是,如何检查最近的请求是否在间隔范围内?具有 microtime-microtime我以秒为单位获得差异,但有些操作需要应用500毫秒的间隔

到目前为止,我得到的是:

$_SESSION['requests']['postComment'] = array('latest' => microtime(true), 'interval' => 1000);
$difference = ($_SESSION['requests']['postComment'] - microtime(true));
此时,$差返回浮动(106.984388113)(等待106秒) 但是我们想要得到微时差,因为我们的时间间隔是1000(也就是1秒,不是1000)

我希望我的问题很清楚,谢谢你的帮助。

如果你使用
microtime(true)
而不是
microtime()
,它将返回一个浮点而不是字符串。使用float,您将能够计算自原始请求以来经过的毫秒数

确保在开始和结束时间都使用


至于另一个问题,这绝对是限制请求数量的一种方法。可能还有其他的方法,而这个问题并不是堆栈溢出的真正目的。这是主观的。

第一个答案应该有助于亚秒计时<代码>微时间(真)

响应编辑:小数部分为亚秒计时。就精度而言,.984是您需要的部件。500是你的500毫秒。我建议根据此浮动值设置间隔

您可以将差值乘以1000,但如果您想要调整到大于或小于毫秒的精度,则会更加混乱。我建议以后尽可能容易地调整

至于防止垃圾邮件的机制,有很多选择,但它们将取决于应用程序需要的具体内容

为此,我能给你的最好建议是以某种方式对其进行抽象,这样它就可以获得比你现在认为需要的更多的关于AJAX调用的信息,并构建一个现在可以工作的简单系统,并记录有关请求的信息以供审查


防止垃圾邮件的最大问题是阻止合法用户并骚扰他们。因此,您可以做的最好的事情是让您自己或其他开发人员在将来更容易地交换您的机制。您还需要有请求日志,以便能够确定哪些类型的请求正在被垃圾邮件预防系统阻止。

我不同意第二点,对于这种特殊情况,可能有最好的方法。回答这个具体案例的问题,然后可能在更一般化的案例中使用讨论,这是非常重要的。请修改我对您的编辑的回答。@MikeVercoelen没问题,只是不要忘记这应该是您审查和修改的内容,以限制它对可用性的影响