防止Javascript中的AJAX泛滥

Prevent AJAX flooding in Javascript

本文关键字:泛滥 AJAX 中的 Javascript 防止      更新时间:2023-09-26

我的网站有一个Javascript方法,它使一个AJAX请求添加一个项目到购物车,而不需要重新加载页面和做一个简单的通知。

 AddToCart()
然而,使用任何Javascript控制台,我发现你可以用一个简单的语句淹没这个请求:
while (true) {AddToCart()}
并最终锁定服务器,直到浏览器崩溃。一个更稳定的浏览环境甚至可能无限期地锁定服务器。那么,防范这种企图的最佳方式是什么呢?

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

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

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

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

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

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

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

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

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

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

就我个人而言,我真的不认为客户需要被保护免受其所有者可能施加的虐待,当所做的事情除了造成混乱之外没有合法目的时。如果用户想做一些让自己的客户机崩溃的坏事,那也没关系。如果他们愿意,他们可以用任务管理器打倒客户端。您确实希望防止它向您的服务器喷出有害的东西,并保护它免受合法的正常用户操作可能发生的任何不良事件的影响,但如果用户想要关闭他们自己的客户端,我不会为此而失去任何睡眠。

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

一个足够聪明的人知道你的代码,打开他们的浏览器控制台,输入while (true) {AddToCart()}甚至不需要浏览器(或你的代码)–他们可以在无限循环中执行wget,或者如果目标确实是DoS,则使用脚本来实现此目的。

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

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

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

那两种方法有帮助,但不能完全解决问题。服务器确实需要检测它是否收到了来自某个客户端的垃圾请求,并通过速率限制器限制它们。