PHP请求垃圾邮件预防机制


PHP request spam prevention mechanism

我正在构建一个模型视图控制器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方法中的注释。我有两个问题,我的第一个问题是,这个机制是个好主意吗?或者有其他更好的方法来构建它吗?

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

到目前为止我得到的:

$_SESSION['requests']['postComment'] = array('latest' => microtime(true), 'interval' => 1000);
$difference = ($_SESSION['requests']['postComment'] - microtime(true));

此时,$difference返回浮动(106.984388113)(等待106秒)但我们想得到微时差,因为我们的间隔是1000(这是1秒,而不是1000)

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

第一个答案应该有助于次秒计时。microtime(true)

响应编辑:小数部分是次秒计时。.984是你想要的精度部分。500是你的500毫秒。我建议您根据这个浮动值设置间隔。

你可以将差值乘以1000,但如果你想调整到大于或小于毫秒的精度,那就更令人困惑了。我建议以后尽可能容易地对此进行调整。

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

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

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

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

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

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