# Web 安全
# 关于前端
# XSS
:跨站脚本攻击(Cross Site Scripting)
- 原理:
- 攻击者向网页源代码中注入恶意代码,然后被浏览器执行。
- 按注入方式分类:
- 反射型:如果网页源代码会从 URL 中提取参数,则可以把恶意代码写入到 URL 中,诱使用户点击该链接,当用户跳转之后就被注入了恶意代码。
- 存储型:将恶意代码作为表单内容(比如留言栏)上传到服务器。当其他用户在浏览器中查看该内容时,恶意代码就会被执行。
- 按攻击来源分类:
- 恶意网站 B 与网站 A 不在同一个域名下。
- 恶意网站 B 与网站 A 在同一个域名下,比如子应用。
- 对策:
- 服务器不应该信任前端发来的数据,总是要检查该数据是否合法。
# CSRF
:跨站请求伪造(Cross-site request forgery)
- 原理:
- 用户访问网站 A 时,一般会保持 session 或留下 cookies 。此时攻击者诱使用户点击网站 B 中的一个链接,该链接是向网站 A 发送一个 HTTP 请求,这样就能冒用用户的身份访问网站 A ,执行冒名操作。
- 对策:
- 服务器检查每个 HTTP 请求的 Origin 或 Referer 字段,如果是跨站发来的请求就拒绝。
- 不过这可能拦截从搜索引擎跳转过来的正常用户请求,也无法防御客户端故意伪造的请求。
- 向网页源代码中加入一个随机 token ,当用户发出 HTTP 请求时都要带上该 token ,证明请求是从该网页发出的。
- 例如在请求的 URL 中加入 token :
http://www.test.com?csrftoken=123456
- 例如在 POST 表单里加入 token :
<input type="hidden" name="csrftoken" value="123456"/>
- 例如在请求的 URL 中加入 token :
- 服务器检查每个 HTTP 请求的 Origin 或 Referer 字段,如果是跨站发来的请求就拒绝。
# 关于后端
# DoS
- 拒绝服务(Distributed Denial of Service ,DoS)攻击
- :攻击者发出大量请求到服务器,使服务器处于忙碌状态,占用带宽、CPU、内存等资源,导致不能处理其他正常用户的请求。
- 分布式拒绝服务(Distributed Denial of Service ,DDoS)攻击
- :与 DoS 相比,攻击者会操纵大量 IP 不同的主机作为客户端,或者使用大量 IP 不同的代理。
- 攻击方法举例:
- Smurf :攻击者冒充目标主机的 IP 地址向大量主机发送广播消息,导致目标主机被大量的应答消息冲击。
- Land :发送源地址和目的地址都是目标主机的 IP 地址的数据包,导致目标主机反复接收和发送该数据包,浪费资源。
- ICMP Flood :向服务器发送大量 ICMP 数据包,产生流量洪水。
- UDP Flood
- NTP Flood
- DNS Query Flood
- SYN Flood :向服务器发出大量 SYN=1 的 TCP 包,请求建立连接,但并不完成 TCP 握手的第三步。导致服务器上产生大量等待握手的连接,占用大量资源。
- CC 攻击 :向服务器发出大量合法的 HTTP 请求,导致服务器处于忙碌状态。
- 对策:
- 提高服务器本身的性能,比如网络带宽。
- 缺点:性价比很低,因为服务器扩容的成本比 DDoS 攻击的成本高很多。
- 租用某些平台的高防 IP ,让该平台对访问流量进行清洗、过滤之后再发给服务器处理。
- 优点:容易使用,可以防御常见类型的 DDoS 攻击。
- 缺点:价格较贵。
- 对访问 IP 设置黑名单。
- 优点:成本很低。
- 缺点:容易防御 DoS 攻击,但难以防御 DDoS 攻击,因为难以区分攻击者的 IP 与正常用户的 IP 。
- 将一些经常被访问的资源通过 CDN 缓存,从而减轻源服务器的负载。
- 缺点:效果低,只能防御少数类型的攻击。
- 提高服务器本身的性能,比如网络带宽。
# 非授权访问
原理:
- 攻击者没有访问权限,但是通过服务器的某个漏洞非法访问了服务器资源,比如私密数据。
- 授权用户越权访问也属于非授权访问。
对策:
- 做渗透测试,修补漏洞。
# 冒名访问
原理:
- 攻击者冒充某个用户的身份,获得其对服务器的访问权限。
- 最严重的情况是,攻击者窃取到某个用户的用户名及密码,通过正常流程登录,难以判断出该用户是冒充的。
对策:
- 保证正确鉴定每个访问者的身份,按身份给他们分配权限。(比如分成未登录者、普通用户、管理员)
- 服务器可以根据登录 IP 异常、敏感操作等信息推测出登录的用户是否为本人,
# 越权访问
原理:
- 攻击者作为一个正常用户登录之后,访问到该用户无权访问的资源。
对策:
- 保证对所有资源(比如文件、端口)加上权限控制,收到访问请求时总是验证其访问权限。
# SQL 注入
原理:
- 攻击者在客户端上传的表单数据中,插入恶意的 SQL 代码,等待被服务器误执行。
对策:
- 服务器不能相信客户端或前端发来的数据,必须先检查其格式是否正确、是否包含非法字符。
# 关于通信
# 报文截获
原理:
- 攻击者截取到客户端与服务器的通信报文,从其中窃取重要数据。
对策:
- 使用 HTTP 协议通信会暴露报文内容,应该使用 HTTPS 协议进行加密通信。
# 报文丢失
:Web 服务器通信过程中的某些报文被丢失。可能是网络原因,也可能是遭到攻击者攻击。
# 关于客户端
即使 Web 网站本身足够安全,用户也可能在访问该网站之前就被攻击,因此还需要考虑客户端的安全问题。
# 钓鱼网站
原理:
- 攻击者建立一个恶意网站(可能还会伪装成正常网站),诱使用户访问该网站。当用户访问该网站时,一不小心就下载了木马或病毒。
- 或者攻击者将恶意网站伪装成目标网站(页面、域名相像),诱使用户登录该网站。当用户登录时,就将自己的用户名、密码泄露给了攻击者。
对策:
- 使用安全工具检测用户的电脑运行环境。
# 挂马攻击
原理:
- 攻击者成功入侵网站服务器,在网页中嵌入恶意代码。当用户访问网页时,就会植入木马。
对策:
- 用户在电脑上安装安全工具,保护自己。
# 键盘记录
原理:
- 攻击者用工具记录用户的键盘输入,窃取到用户输入的密码。
对策:
- 让用户使用 Web 网页上的位置随机的图形键盘输入密码。
# 破解客户端
原理:
- 攻击者下载了客户端程序或 Web 网页之后,看穿其运行原理,绕过其中的访问限制或截取重要信息。
对策:
- 服务器不要将重要的信息保存在客户端,不要依靠客户端进行安全验证等操作,因为那不可靠。