Web 开发的安全之旅 | 青训营
跨站脚本攻击(Cross-Site Scripting,XSS),跨站请求伪造(Cross-Site Request Forgery,CSRF),注入(Injection),拒绝服务攻击(Denial of Service,DoS),分布式拒绝服务攻击(Distributed Denial of Service,DDoS)以及中间人攻击(Man-in-the-Middle,MitM)都是网络安全领域中的常见攻击类型。
跨站脚本攻击(XSS)
攻击者通过向目标网页插入恶意脚本,使得用户在浏览该页面时执行这些脚本,从而实现盗取用户信息、会话劫持等攻击。
跨站请求伪造(CSRF)
攻击者通过诱使受害者在已登录的状态下执行恶意请求,从而实现未经授权的操作,比如更改密码、发表评论等。
注入(Injection)
攻击者通过将恶意代码注入到应用程序的输入参数中,从而欺骗应用程序执行非预期的操作,最常见的是SQL注入和代码注入。
拒绝服务攻击(DoS)
攻击者通过发送大量恶意流量或请求,使目标系统资源耗尽,导致合法用户无法正常访问。
中间人攻击(MitM)
攻击者劫持通信的过程,使其能够拦截、修改或注入通信内容,从而能够窃取敏感信息或执行恶意操作。
分布式拒绝服务攻击(DDoS)
类似于DoS攻击,但攻击流量来自多个来源,通常通过控制大量的僵尸计算机(或“僵尸网络”)来协同发动攻击,使其更具破坏性和难以防范。这种攻击旨在削弱目标系统的可用性,使其无法为合法用户提供服务。因为攻击流量来自多个来源,往往难以简单地通过阻止单个IP地址来抵御。
为了防范DDoS攻击,组织通常会采用各种方法,包括使用专业的防火墙和入侵防御系统、配置负载均衡以分散流量、使用内容分发网络(CDN)等。
当涉及防御不同类型的网络攻击时,有相对应每种攻击的防御方法:
XSS 的防御
- 输入验证和过滤:对所有用户输入数据进行严格的验证和过滤,确保只允许合法的字符和数据。
- 输出编码和转义:在将用户输入嵌入到网页中时,对其进行适当的编码和转义,以防止恶意脚本的执行。
- 使用 CSP(内容安全策略):通过设置适当的CSP头,限制允许加载的资源和脚本,阻止非法的脚本执行。
- 不信任用户输入:不要将用户输入作为直接的HTML代码或JavaScript执行,始终将其视为潜在的安全风险。
- 限制特权:在应用程序中使用最小特权原则,限制脚本的访问和执行权限。
防御 CSRF 的正确姿势
- 使用随机令牌:为每个用户会话生成随机的CSRF令牌,并将其包含在表单中,确保请求只能来自合法的源。
- 校验 Referer 头:检查HTTP请求的Referer头部,确保请求来自预期的源。
- 双因素认证:对于敏感操作,要求用户进行额外的身份验证,以减少CSRF攻击的风险。
- 同源策略:合理使用同源策略,限制网页上的脚本只能与同一源站点进行通信。
防御 DoS
- 限制连接数:配置网络设备或防火墙以限制单个IP地址或IP地址段的连接数量。
- 流量监测和分析:使用入侵检测系统(IDS)和入侵防御系统(IPS)来监测异常流量和攻击行为。
- 负载均衡:使用负载均衡器来分发流量,减轻单个服务器的压力。
- 限制请求频率:实施限速策略,限制单个IP地址或用户的请求频率。
防御 Injection
- 使用参数化查询:使用预编译语句和参数化查询来防止SQL注入。
- 输入验证和过滤:对所有用户输入进行严格验证和过滤,确保只允许预期的字符和数据。
- 最小特权原则:将数据库用户的权限限制到最低必要级别,减少攻击者可能获取的权限。
- 编码输出:在将数据返回给用户之前,对其进行适当的编码和转义。
防御中间人
- 使用加密通信:确保所有通信都使用加密协议(如HTTPS),以保护通信内容的机密性和完整性。
- 校验证书:在客户端验证服务器的证书,以确保通信与正确的服务器建立连接。
- 公共密钥基础设施(PKI):使用PKI来管理和分发数字证书,以建立安全的通信通道。
总结
XSS 的防御:
- 永远不要信任用户提交的内容:所有用户输入数据都应该被视为潜在的安全风险,进行适当的验证和过滤。
- 不要将用户提交内容直接转换成 DOM:确保对用户输入进行适当的编码和转义,以防止恶意脚本注入。
- 使用 DOMParser() 进行安全的字符串到 DOM 转换:这是一种更安全的方式来将字符串转换为 DOM 对象,可以减少对恶意代码的风险。
- 上传 svg 时进行扫描:确保上传的 svg 图片不包含恶意的脚本标签,可以使用安全的图像处理库来扫描和过滤恶意内容。
CSRF 的防御:
- 同源策略(SOP):合理使用同源策略,限制网页上的脚本只能与同一源站点进行通信。
CSP 的防御: 内容安全策略(CSP)是一种通过白名单控制浏览器能够加载哪些内容的方法。通过在HTTP响应头中添加CSP策略,可以减少XSS攻击的风险,限制允许加载的资源和脚本。