网络安全基础
总览
DDoS、DoS、XSS,CSRF攻击、DNS劫持和其对应的防护措施
# 网络通信的安全威胁
# DoS攻击
拒绝服务攻击,Denial-of-Service attack
使目标电脑的网络或系统资源耗尽,使服务暂时中断或停止,导致其正常用户无法访问
带宽消耗型: UDP洪水攻击、ICMP洪水攻击
资源消耗型:SYN洪水攻击、LAND攻击
# DDoS攻击
分布式拒绝服务攻击,Distributed Denial-of-Service attack
黑客使用网络上两个或以上被攻陷的电脑作为“僵尸”向特定的目标发动DoS攻击
# XSS攻击
Cross Site Scrit 跨站脚本攻击(为与 CSS 区别,所以在安全领域叫 XSS)指浏览器中执行恶意脚本(无论是跨域还是同域),从而拿到用户的信息并进行操作。
XSS 攻击的实现有三种方式——存储型、反射型和文档型。
存储型
存储型
,将恶意脚本存储了起来,存储型的 XSS 将脚本存储到了服务端的数据库,然后在客户端执行这些脚本,从而达到攻击的效果。
常见的场景是留言评论区提交一段脚本代码,如果前后端没有做好转义的工作,那评论内容存到了数据库,在页面渲染过程中直接执行
, 相当于执行一段未知逻辑的 JS 代码。这就是存储型的 XSS 攻击。
反射型
反射型XSS
指的是恶意脚本作为网络请求的一部分。
比如我输入:
http://sanyuan.com?q=<script>alert("xss")</script>
这杨,在服务器端会拿到q
参数,然后将内容返回给浏览器端,浏览器将这些内容作为HTML的一部分解析,发现是一个脚本,直接执行,这样就被攻击了。
之所以叫它反射型
, 是因为恶意脚本是通过作为网络请求的参数,经过服务器,然后再反射到HTML文档中,执行解析。和存储型
不一样的是,服务器并不会存储这些恶意脚本。
文档型
基于 DOM 的 XSS 攻击是不牵涉到页面 Web 服务器的。具体来讲,黑客通过各种手段将恶意脚本注入用户的页面中,比如通过网络劫持在页面传输过程中修改 HTML 页面的内容,这种劫持类型很多,有通过 WiFi 路由器劫持的,有通过本地恶意软件来劫持的,它们的共同点是在 Web 资源传输过程或者在用户使用页面的过程中修改 Web 页面的数据。
# XSS防范
无论是在前端和服务端,都要对用户的输入进行转码或者过滤。
利用 CSP(内容安全策略)
网站通过发送一个 CSP 头部,来告诉浏览器什么是被授权执行的与什么是需要被禁止的
CSP,即浏览器中的内容安全策略,它的核心思想就是服务器决定浏览器加载哪些资源,具体来说可以完成以下功能:
- 限制其他域下的资源加载。
- 禁止向其它域提交数据。
- 提供上报机制,能帮助我们及时发现 XSS 攻击。
CSP 的实质就是白名单制度,开发者明确告诉客户端,哪些外部资源可以加载和执行,等同于提供白名单。它的实现和执行全部由浏览器完成,开发者只需提供配置
利用 HttpOnly
很多 XSS 攻击脚本都是用来窃取Cookie, 而设置 Cookie 的 HttpOnly 属性后,JavaScript 便无法读取 Cookie 的值。这样也能很好的防范 XSS 攻击。
# CSRF攻击
Cross-Site Request Forgery 跨站请求伪造
对比XSS: 跟跨网站脚本(XSS)相比,XSS 利用的是用户对指定网站的信任,CSRF 利用的是网站对用户网页浏览器的信任。
CSRF攻击者不能获取到Cookie等信息,只是使用。
CSRF攻击攻击原理及过程如下:
- 用户C打开浏览器,访问受信任网站A,输入用户名和密码请求登录网站A;
- 在用户信息通过验证后,网站A产生Cookie信息并返回给浏览器,此时用户登录网站A成功,可以正常发送请求到网站A;
- 用户未退出网站A之前,在同一浏览器中,打开一个TAB页访问网站B;
- 网站B接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方站点A;
- 浏览器在接收到这些攻击性代码后,根据网站B的请求,在用户不知情的情况下携带Cookie信息,向网站A发出请求。网站A并不知道该请求其实是由B发起的,所以会根据用户C的Cookie信息以C的权限处理该请求,导致来自网站B的恶意代码被执行。
# CSRF防范
1. 利用Cookie的SameSite属性
SameSite
可以设置为三个值,Strict
、Lax
和None
。
a. 在Strict
模式下,完全禁止第三方 Cookie,跨站点时,任何情况下都不会发送 Cookie。换言之,只有当前网页的 URL 与请求目标一致,才会带上 Cookie,比如请求sanyuan.com
网站只能在sanyuan.com
域名当中请求才能携带 Cookie,在其他网站请求都不能。
b. 在Lax
模式,就宽松一点了,但是只能在 get 方法提交表单
况或者a 标签发送 get 请求
的情况下可以携带 Cookie,其他情况均不能。
c. 在None
模式下,也就是默认模式,请求会自动携带上 Cookie。
2. 验证来源站点
这就需要要用到请求头中的两个字段: Origin和Referer。
其中,Origin只包含域名信息,而Referer包含了具体
的 URL 路径。
这两者都是可以伪造的,通过 Ajax 中自定义请求头即可,安全性略差。
3. CSRF Token
Django
作为 Python 的一门后端框架,如果是用它开发过的同学就知道,在它的模板(template)中, 开发表单时,经常会附上这样一行代码:
{% csrf_token %}
这就是CSRF Token
的典型应用。那它的原理是怎样的呢?
首先,浏览器向服务器发送请求时,服务器生成一个字符串,将其植入到返回的页面中。
然后浏览器如果要发送请求,就必须带上这个字符串,然后服务器来验证是否合法,如果不合法则不予响应。这个字符串也就是CSRF Token
,通常第三方站点无法拿到这个 token, 因此也就是被服务器给拒绝
# DNS劫持
攻击者篡改了某个域名的解析结果,使得指向该域名的IP变成了另一个IP导致对相应网址的访问被劫持到另一个不可达的或者假冒的网址
# 参考
这一次彻底搞懂CSRF与XSS - 掘金 (juejin.cn) (opens new window)
XSS 和 CSRF 攻击详解 - 掘金 (juejin.cn) (opens new window)
(1.6w字)浏览器灵魂之问,请问你能接得住几个? - 掘金 (juejin.cn) (opens new window)