2011-09-21 152 views
3

我的网站有一个JavaScript方法,使一个AJAX请求将项目添加到购物车无需重新加载页面,并制作一个简单的通知。防止AJAX洪水在Javascript

AddToCart() 

然而,使用任何JavaScript控制台,我发现您可以填充这个要求用一个简单的声明:

while (true) {AddToCart()} 

而最终锁定服务器,直到浏览器崩溃。更稳定的浏览环境甚至可能无限期地锁定服务器。那么防止这种尝试的最佳方法是什么?

+0

检查项目是否已经在购物车?服务器端和客户端。 –

+0

客户可以添加多个项目的数量 –

回答

5

也许你应该只在私有名称空间中定义函数?

(function() { 
    function AddtoCart(){}; 
})(); 

这样你就不能通过控制台引用它。

这当然是没有防弹任何人都可以复制代码或向URI发出HTTP请求。

您无法停止HTTP请求,但您可以通过实施CSRF令牌来停止页面处理数据,以便它不会执行繁重的处理,除非CSRF令牌匹配(从您的页面生成),从而创建CSRF基于诸如时间戳等变量,因此不能(容易地)重现。

2

的请求是一个请求,AJAX或没有。常规的DOS攻击也适用同样的规则。即使没有AJAX,也没有什么可以阻止人们直接调用您的网址。

3

有很多是服务器保护自己免受恶意的客户端的方式。在这种特殊情况下,当服务器从客户端选择每分钟最大操作次数时,“限速”可能是合适的,因为它认为人工操作是合理的,并且当来自一个客户端的操作速率超过其自身保护的速率时。它如何选择保护自己取决于。它可能会立即使每个新请求都失败一段时间以避免使用多个服务器资源,它可能会将客户端记录在外,它可能会以失败方式失败或返回错误。

服务器应该知道,对这种类型的东西真正的保护具有在服务器上完成,因为Ajax调用任何人都可以做,不只是你自己的客户端代码。

在客户端,你可以从恶意的JavaScript保护被注入多种方式。在你的代码中较低的位置,你也可以实现速率限制(就像在进行实际的ajax调用之前)并拒绝每分钟执行超过X个Ajax调用。这并不能完全保护你的服务器,但是保护你免受你自己的以这种方式使用的AddToCart()函数的影响。

或者,你可以把它所以没有顶级的全局命名空间功能,无需参数可以这样调用。你可以通过从全局命名空间中删除相关功能(使其成为需要适当的“this”指针的对象之一的方法),或者可以使该功能需要某些相关的内部状态,而这些状态并不总是众所周知。

就个人而言,我真的不一样下跌客户需要得到保护免遭虐待它的主人可能会在它造成时,有对什么是正在做除了引起混乱不合法的目的。如果用户想要做不好的事情,让自己的客户崩溃,那很好。如果他们想要的话,他们可以用任务管理器关闭客户端。你确实想要保护它免受不良情况的影响,并保护它免受合法的普通用户操作可能发生的任何不良情况的影响,但是如果用户想要取下自己的客户端,我不会失眠那。

0

你可以做的一件事是让AddToCart函数只在请求没有进行时才执行请求。

另一个认为你可以做的就是混淆代码(有工具可以做到这一点,做一个JavaScript混淆搜索),所以它不明显什么方法做什么。

这两种方法将有所帮助,但不会完全解决问题。服务器确实需要检测是否通过一个客户端的请求发送垃圾邮件并通过限速器限制它们。

3

他们可以使用ab(Apache基准测试)以较高的并发值进行更多的破坏,或者他们可以坐在那里碰到F5。您需要一个较低级别的解决方案 - 速率限制,可能是IP,或一次性哈希或任何其他解决方案。

1

有人足够聪明弄清楚你的代码,打开浏览器的控制台,然后输入while (true) {AddToCart()}甚至不需要一个浏览器(或代码)–他们可能只是在一个无限循环中执行wget,或者如果真正的目标是一个DoS,为此使用script

在服务器端,您正在处理如何减轻拒绝服务攻击。有很多strategies;使用Nginx反向代理是我首先想到的。