防止Javascript中的AJAX泛滥

防止Javascript中的AJAX泛滥,javascript,ajax,security,ddos,Javascript,Ajax,Security,Ddos,我的网站有一个Javascript方法,它可以发出AJAX请求,在不重新加载页面和发出简单通知的情况下向购物车添加项目 AddToCart() 但是,使用任何Javascript控制台,我发现您都可以使用一条简单的语句来处理此请求: while (true) {AddToCart()} 并最终锁定服务器,直到浏览器崩溃。更稳定的浏览环境甚至可能无限期地锁定服务器。那么,防止这种尝试的最佳方法是什么呢?也许您应该在私有名称空间中定义函数 (function() { function A

我的网站有一个Javascript方法,它可以发出AJAX请求,在不重新加载页面和发出简单通知的情况下向购物车添加项目

 AddToCart()
但是,使用任何Javascript控制台,我发现您都可以使用一条简单的语句来处理此请求:

while (true) {AddToCart()}

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

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

(function() {
   function AddtoCart(){};
})();
这样,您就无法通过控制台引用它

这当然不是防弹的,因为任何人都可以复制代码或向URI发出HTTP请求


您不能停止HTTP请求,但您可以通过实现CSRF令牌来停止页面处理数据,这样它就不会进行繁重的处理,除非CSRF令牌匹配,这是从您的页面生成的,该页面基于时间戳等变量创建CSRF,所以它不可能(很容易?)复制。

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

服务器有很多方法可以保护自己免受恶意客户端的攻击。在这种特殊情况下,“速率限制”可能适用于服务器从客户端选择其认为合理的每分钟最大操作数,以及来自一个客户端的操作速率超过其自身保护的情况。它选择如何保护自己取决于。它可能会立即使每个新请求失败一段时间,以避免使用许多服务器资源,它可能会注销客户端,它可能会以静默方式失败或返回错误

服务器应该知道,针对这类事情的真正保护必须在服务器上完成,因为ajax调用可以由任何人完成,而不仅仅是您自己的客户机代码

在客户端上,您可以通过多种方式防止流氓javascript被注入。在代码的下面,您还可以实现速率限制(就像在进行实际ajax调用之前),并拒绝每分钟执行超过X个ajax调用。这并不能完全保护您的服务器,但可以防止您自己的AddToCart()函数以这种方式使用

或者,您可以这样做,即不存在顶级全局命名空间函数,该函数不需要以这种方式调用的参数。您可以通过从全局名称空间中删除相关功能(使其成为一个对象上需要适当“this”指针的方法)或使该函数需要一些不总是已知的相关内部状态来实现这一点


就我个人而言,我并不认为一个客户需要受到保护,不受其所有者可能对其施加的虐待,因为这样做除了造成混乱之外,没有任何合法的目的。如果用户想做一些让自己的客户端崩溃的坏事,那没关系。如果需要,他们可以使用任务管理器关闭客户端。您确实希望保护它,使其不会向您的服务器喷洒坏东西,并保护它不受合法正常用户操作可能发生的任何坏情况的影响,但是如果用户想要关闭自己的客户端,我不会因此而失眠。

您可以做的一件事是让
AddToCart
函数仅在请求尚未进行时执行请求

您可以做的另一件事是混淆代码(有一些工具可以做到这一点,搜索javascript混淆),因此不清楚什么方法做什么


这两种方法会有帮助,但不能完全解决问题。服务器真的需要检测它是否收到来自一个客户端的垃圾邮件,并通过速率限制器限制它们。

使用具有高并发值的
ab(Apache基准测试),它们可能会造成更大的破坏,或者它们可以坐在那里按F5。您需要一个较低级别的解决方案—可能通过IP限制速率,或者一次使用哈希,或者任何数量的其他解决方案。

有足够聪明的人来理解您的代码,打开浏览器控制台,键入
,而(true){AddToCart()}
甚至不需要浏览器(或您的代码)–他们可以在无限循环中执行
wget
,或者如果目标真的是DoS,那么就使用一个


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

检查商品是否已经在购物车中?服务器端和客户端。客户可以添加多个数量的项目