DoS介绍
DoS(Denial Of Service),拒绝服务的缩写,是指故意攻击网络协议实现的缺陷或直接通过野 蛮手段耗尽被攻击对象的资源,目的是让目标计算机或网络无法提供正常的服务,使目标系统停止响应甚至崩溃。这些服务资源包括网络带宽,文件系统空间容量,开放的进程或者允许的连接。这种攻击会导致资源的匮乏,无论计算机的处理速度多快、内存容量多大、网络带宽的速度多快都无法避免这种攻击带来的后果。
大多数的DoS攻击是需要相当大的带宽的,而以个人为单位的黑客没有可用的高带宽资源。为了克服这个缺点,DoS攻击者开发了分布式的攻击。攻击者利用工具集合许多的网络带宽来同时对同一个目标发动大量的攻击请求,这就是DDoS(Distributed Denial Of Service)攻击。可以说DDoS攻击是由黑客集中控制发动的一组DoS攻击的集合,这种方式被认为是最有效的攻击形式,难以抵挡.
如何预防网站被DoS/DDoS攻击
DoS/DDoS预防涉及硬件和软件,这里只介绍Web应用如何预防,如果我们的web系统遭受攻击,整个系统可能会因为内存泄漏,CPU资源耗尽,连接数被耗尽等,使得网站无法提供服务。
-
首先,所有的http/https请求,必须通过身份的验证,没有登录的用户拒绝响应。这是必须做的,身份验证会增加攻击的难度。
-
控制数据包的大小,根据自己的业务,设置数据包的最大值,当大于这个值的情况下可以拒绝服务。(业务最大只需要3M, 那么100M的请求就被拒绝了)
-
对调用的参数进行校验,比如传输一个很大的数组给后台服务器,在多个请求同时遍历大数组的情况下,会导致CPU资源耗尽。
-
除登录用户的校验,还必须增加随机数校验,解决跨站请求伪造的同时,大大增加了Dos攻击的难度。
-
在服务器响应中,不能无限启动新的线程。如果需要多线程处理,需要使用线程池的机制,并控制线程的数量。同时保证线程池不能过多,不能再请求中生成线程池。
-
请求要有超时机制,防止请求线程被长时间占用,从而导致线程中的资源无法释放。
CSRF介绍
跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click attack 或者 session riding,通常缩写为 CSRF 或者 XSRF, 是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。
简单的说,就是利用游览器对用户的信任,比如,用户已经登录了ww.aaa.com,自然aaa这个网站就会将用户的登录状态session存在cookie中;
然后,aaa.com这个网页有一个对作品点赞的功能,点赞提交地址为aaa.com/api.like?id=66;
这时,另外一个叫www.bbb.com的网站,放了这样一个元素 <img src="aaa.com/api.like?id=77">
,这样的话,一旦用户进入这个bbb.com页面,就会请求aaa.com这个网站的点赞接口,而且点赞的用户对象是77;
最后因为用户的登录信息尚未过期,那就等于给id为77这个作品点赞了,然而,用户并不知情。
防御方式
有两种方法:
- 后端判断referer是否合法(不推荐)
通过HTTP的referer可知道,用户是通过哪个网站发送这个请求的。但是referer的判断并不是好方法,有各种方式可以绕过的方法. - 每次请求带上token(这种靠谱)
比如laravel,在后端模板渲染的时候会提供一个csrf的token,这样的话,不同域的网站是拿不到token的,所以也就防止了csrf了。
补充
使用iframe会引出一些不安全的问题,比如绕过referer验证,比如资源盗用等,所以,很多网站会设置X-Frame-Options 为 DENY,这也是一个安全的补充点。
Q&A
问:既然请求静态资源都是get请求,那么要是后端把点赞接口改为post的方式也可以吧?
答:不可以。因为,bbb.com网站完全可以设置一个form表单,action为bbb.com,method为post,接着input的name为id,value为888,然后,script代码直接submit表单。为了页面不重定向,还可以在form外层加一个iframe。由于form表单其实是直接跳转,所以不存在跨域的问题。
链接:https://juejin.im/entry/59ba95b0f265da0648443605
https://juejin.im/post/5a631ffa518825732739b2a2