我的网站有一个 Javascript 方法,它发出 AJAX 请求以将商品添加到购物车,而无需重新加载页面并发出简单的通知。
AddToCart()
然而,使用任何 Javascript 控制台,我发现你可以用一个简单的语句来处理这个请求:
while (true) {AddToCart()}
并最终锁定服务器,直到浏览器崩溃。更稳定的浏览环境甚至可能无限期地锁定服务器。那么防止这种尝试的最佳方法是什么?
我的网站有一个 Javascript 方法,它发出 AJAX 请求以将商品添加到购物车,而无需重新加载页面并发出简单的通知。
AddToCart()
然而,使用任何 Javascript 控制台,我发现你可以用一个简单的语句来处理这个请求:
while (true) {AddToCart()}
并最终锁定服务器,直到浏览器崩溃。更稳定的浏览环境甚至可能无限期地锁定服务器。那么防止这种尝试的最佳方法是什么?
也许您应该只在私有命名空间中定义函数?
(function() {
function AddtoCart(){};
})();
这样你就不能通过控制台引用它。
这当然不是万无一失的,因为任何人都可以复制代码或向 URI 发出 HTTP 请求。
您无法停止 HTTP 请求,但您可以通过实现 CSRF 令牌来停止页面处理数据,这样它就不会进行繁重的处理,除非 CSRF 令牌匹配,这是从您的页面生成的,它根据变量创建 CSRF像时间戳等,所以它不能(容易?)复制。
服务器有很多方法可以保护自己免受恶意客户端的侵害。在这种特殊情况下,“速率限制”可能适用于服务器从客户端选择每分钟的最大操作数,它认为人类操作是合理的,并且当来自一个客户端的操作速率超过它保护自己的速率时. 它如何选择保护自己取决于。它可能会立即使每个新请求失败一段时间以避免使用许多服务器资源,它可能会注销客户端,它可能会静默失败或返回错误。
服务器应该知道,必须在服务器上完成对此类事情的真正保护,因为任何人都可以进行 ajax 调用,而不仅仅是您自己的客户端代码。
在客户端上,您可以通过多种方式防止恶意 javascript 被注入。在代码的下方,您还可以实现速率限制(就像在您进行实际 ajax 调用之前一样)并拒绝每分钟执行超过 X 次 ajax 调用。这并不能完全保护您的服务器,但可以保护您免受以这种方式使用的您自己的 AddToCart() 函数。
或者,您可以做到这一点,因此没有顶级全局命名空间函数不需要可以以这种方式调用的参数。您可以通过从全局命名空间中删除相关功能来做到这一点(使其成为需要适当“this”指针的对象之一的方法),或者您可以使函数需要一些相关的内部状态,而这些状态并不总是已知。
就个人而言,我真的不认为客户需要受到保护,以免其所有者可能对其施加的虐待,因为除了造成混乱之外,所做的事情没有任何合法目的。如果用户想做坏事导致他们自己的客户端崩溃,那很好。如果他们愿意,他们可以使用任务管理器关闭客户端。您确实希望保护它免于向您的服务器喷洒坏东西,并保护它免受合法正常用户操作可能发生的任何坏事,但如果用户想关闭他们自己的客户端,我不会为此失眠那。
他们可以使用具有高并发值的(Apache 基准测试)造成更大的破坏ab
,或者他们可以坐在那里按 F5。您需要一个较低级别的解决方案 - 速率限制,也许是 IP,或者一次性哈希,或者任何数量的其他解决方案。
一个请求就是一个请求,不管是不是 AJAX。相同的规则适用于常规 DOS 攻击。没有什么可以阻止人们直接调用您的 URL,即使没有 AJAX。
足够聪明的人可以找出你的代码,打开他们的浏览器控制台,然后输入while (true) {AddToCart()}
,甚至不需要浏览器(或你的代码)——他们可以wget
在无限循环中执行,或者如果目标真的是 DoS,使用脚本为了这个目的。
在服务器端,您正在处理如何减轻拒绝服务攻击。有很多策略;我首先想到的是使用Nginx反向代理。
您可以做的一件事是使该AddToCart
功能仅在尚未进行时才执行请求。
另一个你可以做的是混淆代码(有工具可以做到这一点,搜索javascript混淆)所以它不明显什么方法做什么。
这两种方法会有所帮助,但不会完全解决问题。服务器确实需要检测它是否收到来自一个客户端的请求的垃圾邮件并通过速率限制器限制它们。