我正在构建一个模型视图控制器Web应用程序,我想建立一个请求垃圾邮件机制,为什么?让我简短地解释一下:
我们自己有一个ajax控制器,每个用户输入都是通过ajax接收的,在我的网络应用程序中没有直接$ _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)
我希望我的问题很明确,谢谢你的帮助。
答案 0 :(得分:1)
如果您使用microtime(true)
而不是microtime()
,则会返回浮点数而不是字符串。使用float,您将能够计算自原始请求以来经过的毫秒数。
确保在开始和结束时间都使用microtime
。
至于另一个问题,这绝对是限制请求数量的一种方式。可能还有其他方法,这个问题并不是Stack Overflow的设计目标。这是主观的。
答案 1 :(得分:1)
第一个答案应该有助于亚秒计时。 microtime(true)
响应编辑:小数部分是次秒时间。 .984是你在精确度方面寻找的部分。 .500是你的500毫秒。我建议根据此浮点值设置间隔。
您可以将差值乘以1000,但如果您想要调整到大于或小于毫秒的精度,那将更加令人困惑。我建议你尽可能轻松地调整它。
至于垃圾邮件防护机制,有很多选择,但它们将取决于您的应用程序需要的具体内容。
我能给你的最好的建议是以某种方式抽象它,它可以获得比你现在可能需要的更多关于AJAX调用的信息,并构建一个现在可用的简单系统并记录有关请求的信息审查。
垃圾邮件防护的最大问题是阻止合法用户并使他们烦恼。因此,您可以做的最好的事情是让您自己或其他开发人员更容易在将来更换您的机制。您还需要拥有请求的日志,以便能够确定垃圾邮件阻止是否阻止了哪些类型的请求。