如何防止PHP中的ajax垃圾邮件?

问题描述:

美好的一天,如何防止PHP中的ajax垃圾邮件?

我想知道如何保护我的网站免受ajax垃圾邮件。我正在寻求限制每个 用户的任何Ajax操作。假设每分钟执行8次ajax动作。

一个动作的例子是:一个按钮来添加/删除博客帖子“作为我的最爱”。

除非我错了,否则我相信最好的方法是使用$_SESSION的变量并避免有人/机器人清除cookie以避免我的保护。我只允许ajax函数登录用户。

使用数据库将使我的保护无用,因为它是我想要避免的不需要的数据库的写入。

我不得不提到我实际使用PHP作为服务器语言和jQuery的到我的收益ajax调用。

谢谢

编辑:

的sentense

......以保护我的网站......

是混乱的,但它不是关于跨域阿贾克斯。

编辑2011-04-20: 我给它增加了50的赏金。

+0

为什么我不改变日期以获得更多电话?此外,Cookie不适用于大多数/所有机器人。如果我理解正确,我可以使用PHP的curl轻松解决限制。 – 2011-03-04 16:57:38

+0

基本上,你限制行动,每分钟8,然后拒绝所有的行动。这可以工作,即使我不确定限制你的用户在Ajax电话是最好的事情:)没有人喜欢在使用网站的时间或数量有限 - 我当然不要 – Tsadiq 2011-03-04 16:59:15

+0

@Kevin,I怀疑你可以自己更改日期:这是一个会话变量。另外,即使使用cURL,您也必须发送与登录用户匹配的good sessionid,以便您可以执行任何操作。 – Cybrix 2011-03-04 17:06:59

由于您只允许AJAX操作登录用户,所以这非常容易解决。

  • 为每个帐户创建一个时间戳字段。您可以在数据库中执行此操作,或利用Memcached,或者使用平面文件。
  • 每次用户发出请求通过您的AJAX界面,当前时间戳添加到您的记录,以及:
  • 检查以确保八强时间戳不所有前一分钟前。

从那里,你可以添加额外的魔法,比如tempbanning公然违反限速账户,或针对已知垃圾邮件制造者,等等的黑名单比较违规的IP地址。

+0

+1很好的解决方案。让我们等一下看看其他解决方案,但我怀疑它会有很大的不同。 – Cybrix 2011-04-24 12:11:35

+0

@Cybrix,肯定的事情。作为一个附录,如果你发现你的账号限制模型已经发现了很多令人讨厌的AJAX请求,它会付出努力确保没有任何登录检查逻辑涉及复杂的数据库查询加入或不止一对夫妇查询整体。将过多的数据库开销暴露给易受攻击的进程(如会话检查)会使您容易受到DDoS攻击。 – 2011-04-25 15:44:10

是的,你的想法原则上是好的。有些事情要考虑,虽然:

  • 如果您追踪全球范围,那么你可能会遇到一个机器人DoS荷兰国际集团服务器和防止合法用户不能够使用你的“收藏”按钮的问题。
  • 如果您根据IP追踪请求,则有人可以使用bot网络(多个IP)绕过阻止。根据您的网站和您的偏好,可能会根据subnet of the IP进行限制。
  • 安装并使用Memcache来存储和跟踪请求,特别是如果您打算基于IP进行跟踪。这应该比使用会话变量更快(有人可能会纠正我)。
+0

问:Memcache对APC的好处是什么?(如果有的话) – 2011-03-04 17:35:12

+0

我不知道具体情况,但我建议Memcache纯粹用于将值存储在内存中,而不是将它们写入会话文件。 AFAIK APC做了类似的事情,所以要么使用。 – 2011-03-04 17:37:54

+0

我相信最有效的方法来限制ajax是每个用户,而不是每个功能。 – Cybrix 2011-03-04 18:26:49

您是否在谈论特定的ajax垃圾邮件到您的网站或一般的ajax垃圾邮件?

如果是后者,您可以使用散列来防止自动发送表单,即编写您的hash()单向函数,该函数需要字符串并对其进行sha1校验和。

所以这就是你如何使用它:

 
// the page is a blog post #357 
$id = 357; 
$type = 'post'; 
$hash = hash($_SERVER['REMOTE_ADDR'].$type.$id); 

放入隐藏字段是评论表单中,甚至隐藏的div,在页面底部的地方,哈希,并将其命名为“ control_hash“什么的。将它的值附加到表单提交中的ajax-request。当脚本收到表单时,请从$_REQUEST数据(不包括现有的$control_hash)中创建新的散列表,并检查它们是否匹配。

如果表单是由机器人提交的,它将不会有$control_hash,所以它不会通过。

+0

>> *如果表单是由bot提交的,它不会有$ control_hash,所以它不会通过。* 这是假设机器人是通用的,而不是针对特定的网站定制的。这不是一个安全的假设。 – 2011-04-24 06:12:34

+1

@Kerin“当你假设的时候,你和我做了一个屁股。” – 2011-04-24 06:21:29

+0

......是的,那差不多就是我说的。另外我不知道如何让你的评论失去理想,那是一个意外。 – 2011-04-24 06:24:24

如果您有权访问网站的源代码,您可以重写一些实际执行AJAX请求的JavaScript代码。即您的页面可以有一个隐藏的计数器字段,每次用户单击该按钮时该字段都会增加。此外,您还可以在页面上隐藏时间栏,以评估点击次数。

这个想法是,你甚至不需要发送任何东西到服务器 - 只需在脚本内的客户端检查它。当然,这对于直接向服务器直接传送机器人没有帮助。

这真的取决于这样的垃圾邮件的结果。如果您只是想避免写入数据库,那么所有这些检查最终可能会比实际写入数据库需要更多的资源。

最后是否证明了方法?

您还必须判断这种垃圾邮件的概率是多少。大多数机器人不是很聪明,并且在涉及一些伐木时会失败。

只要我2美分,其他答案完全有效,以避免垃圾邮件。

购买更强大的托管服务请求,不要限制他们。 每分钟8请求是荒谬的。
无论如何,如果请求是'合法的',您应该找到如何为请求提供服务的方法,而不是如何限制它们。如果不是'合法的' - 那么就没有任何'时间限制'就否认它们。

您可以使用带有全局变量的会话字段来保存上次ajax请求的时间。由于您想要允许8个请求,请将其设置为8号数组并检查时差。如果它增加,(重要的)它可能并不总是一个机器人。为用户提供验证码或类似的东西。(一个数学问题也许?)

一旦验证码进行验证,让接下来的几个帖子等。

但一定要确保你正在检查特定的会话和用户。

克林的回答很好,我只是想强调验证码。

是的,你需要在每个函数视图中都可以使用一个函数进行交互,而且,它应该在全局库中,这样你就可以在任何地方使用它。

if(is_logged_in()) 
{ 
    // do you code here 
} 

而被定义为is_logged如下

function is_logged_in($activated = TRUE) 
{ 
    return $this->ci->session->userdata('status') === ($activated ? STATUS_ACTIVATED : STATUS_NOT_ACTIVATED); 
} 

你应该设置状态会话时,用户登录成功。

+0

它将如何帮助防止垃圾邮件伴侣?因为用户可以登录并将Cookie传递给垃圾邮件脚本 – 2014-08-21 12:35:14