关于这个问题,我的理解如下:
安全性问题
信息泄露风险:LocalStorage 是存储在用户浏览器中的数据存储机制,它以明文形式存储数据。如果用户的设备被恶意软件入侵或者浏览器存在安全漏洞,保存在 LocalStorage 中的用户 token 可能会被窃取。
跨站脚本攻击(XSS):如果应用程序存在 XSS 漏洞,攻击者可以注入恶意脚本,通过脚本访问 LocalStorage 中的 token。例如,攻击者可以在易受攻击的网页中注入一段 JavaScript 代码,这段代码可以读取 LocalStorage 中的 token 并将其发送到攻击者控制的服务器。
数据持久性和一致性问题
数据过期问题:LocalStorage 本身没有内置的过期机制。如果没有在应用程序中设计合适的 token 过期策略,token 可能会一直保存在 LocalStorage 中,即使它已经不再有效。这可能会导致一些异常情况,比如用户已经在服务器端注销了账户,但仍然可以使用保存在 LocalStorage 中的旧 token 访问部分受限资源。
除了跨站脚本攻击(XSS),你还了解哪些网络攻击方式?
SQL 注入攻击(SQL Injection)
原理:SQL 注入是一种通过将恶意 SQL 代码插入到应用程序的输入参数中,以利用数据库漏洞的攻击方式。攻击者试图改变 SQL 查询的原始意图,从而获取敏感信息、修改或删除数据库中的数据等。例如,在一个登录页面中,用户输入用户名和密码,应用程序将这些输入构建成一个 SQL 查询来验证用户身份。如果没有对输入进行适当的过滤,攻击者可以在用户名或密码字段中输入 SQL 代码,如 “' or 1 = 1--”,这样的话就会导致登录校验通过。
解决方案:
可限制特殊字符(如单引号、双引号、分号等 SQL 语句中的关键字符)的使用,或者对这些字符进行转义处理。
采用参数化查询(Prepared Statements)。在构建SQL时采用参数化的方式,将用户的输入作为参数传递给查询,而不是直接嵌入拼接到SQL中。例如我们可以使用JDBC操作数据库时,我们可以使用 PreparedStatements 类来构建查询。除此以外我们还可以通过Mybatis这种持久层框架(底层依然是JDBC)。
跨站请求伪造(CSRF)攻击
原理:CSRF 攻击利用用户在已登录网站 A 的情况下,诱使用户在不知情的情况下访问恶意网站 B。网站 B 包含一些恶意请求,这些请求会利用用户在网站 A 的登录状态,在网站 A 上执行某些操作。例如,攻击者创建一个恶意网页,其中包含一个自动提交的表单,该表单的目标是用户的银行网站。如果用户在访问这个恶意网页时已经登录了银行网站,表单就会在用户不知情的情况下向银行网站发送一个转账请求,导致用户资金被盗。
解决方案:
Cookie 的
HttpOnly
属性保障:将 token 存储在设置了HttpOnly
的 Cookie 中,这可以有效防止跨站脚本攻击(XSS)窃取 token。因为HttpOnly
属性使得 JavaScript 无法访问 Cookie 中的内容,这样攻击者就很难通过注入恶意脚本获取 token 来进行 CSRF 攻击。Token 在请求头中的使用:在请求头中携带 token,相比于将 token 放在请求体或 URL 参数中,增加了一定的安全性。因为请求头通常较难被篡改,并且服务器可以通过验证请求头中的 token 来确保请求的合法性。
CORS 限制与 URL 校验:CORS 只允许自己网站的域名访问资源,这可以有效减少来自其他恶意域名的跨域请求。后端再进行 URL 校验,例如检查请求的
Referer
头部或者验证请求路径是否符合预期,可以进一步增强安全性。
通常情况下这些防护措施来进行综合使用。
中间人攻击(Man - in - the - Middle Attack,MITM)
原理:攻击者在通信双方之间建立一个中间节点,拦截、篡改和转发通信双方的消息。例如,在用户通过公共 Wi - Fi 访问银行网站时,攻击者可以利用 Wi - Fi 的漏洞,将自己的设备设置为中间人。当用户发送登录请求和银行返回响应时,攻击者可以截获这些消息,获取用户的登录凭证,然后篡改响应消息,使银行和用户都无法发现攻击行为。
解决方案:
启用 HTTPS(SSL/TLS)
加密通信:HTTPS 使用 SSL/TLS 协议对通信数据进行加密,确保数据在传输过程中不会被窃取或篡改。
身份验证:通过数字证书验证服务器身份,确保客户端连接的是合法的服务器,而不是伪造的攻击者服务器。
注意:必须使用有效的 SSL/TLS 证书,避免使用自签名证书,确保服务器的证书是由可信的证书颁发机构(CA)签发的。
强制使用 HTTPS:HTTP Strict Transport Security(HSTS)
HSTS 是一种 HTTP 响应头,通过强制客户端(浏览器)只能通过 HTTPS 连接到服务器,防止中间人攻击通过将流量降级为 HTTP 协议来进行攻击。
配置:Strict-Transport-Security: max-age=31536000; includeSubDomains
使用最新的 SSL/TLS 协议
TLS 1.2 或 TLS 1.3:确保使用最新版本的 TLS 协议,避免使用过时的协议(如 SSL 3.0、TLS 1.0、TLS 1.1),因为这些协议存在已知的安全漏洞。
启用双因素认证(2FA)
双因素认证(2FA)通过要求用户提供两种不同的验证方式(如密码+手机短信验证码、密码+硬件令牌等)来增强账户安全性,即使攻击者获取了用户的密码,也难以登录用户账户。
双因素认证有效防止了攻击者利用窃取的凭证进行进一步的攻击。
还有像DNS 安全扩展(DNSSEC),使用 VPN 或安全的无线网络这些方案。
DDoS 攻击(分布式拒绝服务攻击,Distributed Denial of Service)
原理:攻击者利用大量的计算机(通常是被恶意软件控制的僵尸网络)向目标服务器发送海量的请求,使服务器资源(如带宽、CPU、内存等)被耗尽,从而无法正常响应合法用户的请求。例如,攻击者控制数千台被感染的计算机,同时向一个电子商务网站发送大量的 HTTP 请求,导致网站的服务器瘫痪,合法用户无法访问网站进行购物。
攻击类型:
网络层攻击(Layer 3)
ICMP Flood:攻击者通过发送大量的 ICMP(Internet Control Message Protocol)请求包(如 ping)来占用带宽,导致目标无法正常响应。
UDP Flood:通过向目标发送大量的 UDP(User Datagram Protocol)包,消耗目标网络的带宽和处理能力。
传输层攻击(Layer 4)
SYN Flood:攻击者通过发送大量的半连接请求(SYN 请求),但不完成握手过程,导致目标的连接表被占满,使得新连接无法建立。
ACK Flood:通过发送大量的 ACK 包(确认应答包),让目标系统不断进行连接确认,消耗 CPU 资源。
应用层攻击(Layer 7)
HTTP Flood:攻击者通过发送大量伪造的 HTTP 请求,模拟正常用户访问,消耗目标服务器的 CPU 和内存资源,导致目标服务器无法处理其他合法请求。
Slowloris:一种慢速攻击方式,攻击者通过保持连接的半打开状态,并持续向服务器发送少量数据,使得服务器长时间保持空闲连接状态,消耗资源。
解决方案(暂时没了解):各层 DDoS 攻击的防御方式
Layer 3(网络层):主要通过流量清洗、防火墙、增加带宽等方法缓解。
Layer 4(传输层):采用 SYN Cookies、SYN Proxy、负载均衡、深度包检测等手段防御。
Layer 7(应用层):通过 WAF、速率限制、验证码、缓存、流量清洗等方法有效防御。