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