前言
Web 应用中存在很多安全风险,这些风险可能会被黑客利用。轻则篡改网页内容,重则窃取网站内部数据。更为严重的,则是在网页中植入恶意代码,使用户受到侵害。
常见的安全漏洞:
XSS 攻击:
XSS(Cross-Site Scripting,
跨站脚本攻击
)攻击是最常见的 Web 攻击,其重点是跨域
和客户端执行
,主要防范方式
就是对 输入和输出的字符进行转义
XSS 攻击一般分为两类:
- 反射型的 XSS 攻击 (
Reflected XSS
), 防范:转义处理 - 存储型的 XSS 攻击 (
Stored XSS
)
Reflected XSS
反射型的 XSS 攻击,主要是由服务端接收到客户端的不安全输入
,在客户端触发执行从而发起 Web 攻击。比如:
在某购物网站搜索物品,搜索结果会显示搜索的关键词。搜索关键词填入 <script>alert('handsome boy')</script>
,点击搜索。页面没有对关键词进行过滤,这段代码就会直接在页面上执行,弹出 alert。
Stored XSS
基于存储的 XSS 攻击,是通过提交带有恶意脚本的内容存储在服务器上,当其他人查看这些内容时发起 Web 攻击。一般提交的内容都是通过一些富文本编辑器编辑的,很容易插入危险代码。
防范方式
:
-
escape 和 unescape:
escape
函数对字符串进行编码,将特殊字符转换为%
后跟两位十六进制数的格式。unescape
函数对使用escape
函数编码的字符串进行解码。- 这两个函数已经被废弃,不推荐使用
-
encodeURIComponent 和 decodeURIComponent:
encodeURIComponent
用于对URL的组成部分进行编码,只对某些字符进行编码,保留字母数字字符和- _ . ! ~ * ' ( )
。decodeURIComponent
用于解码使用encodeURIComponent
编码的字符串。
-
encodeURI 和 decodeURI:
encodeURI
对整个URI进行编码,只对某些字符进行编码,保留所有字母数字字符以及# $ & + , / : ; = ? @
。decodeURI
用于解码使用encodeURI
编码的URI。
代码实例:
// `escape`、`unescape`
let a={b:1}
escape(JSON.stringify(a)) //输出: '%7B%22b%22%3A1%7D'
unescape('%7B%22b%22%3A1%7D') // 输出:'{"b":1}'
// `encodeURIComponent`、`decodeURIComponent`
encodeURIComponent("<script>alert(123)</script>")
// 输出:'%3Cscript%3Ealert(123)%3C%2Fscript%3E'
decodeURIComponent('%3Cscript%3Ealert(123)%3C%2Fscript%3E');
// 输出:'\x3Cscript>alert(123)\x3C/script>'
// 使用 encodeURI 编码整个URI
var encodedURI =encodeURI("http://example.com/#/Hello, World!");
console.log(encodedURI); // 输出:'http://example.com/#/Hello,%20World!'
// 注意:encodeURI 不会对 # 进行编码
JSONP XSS
JSONP 的 callback 参数
非常危险,它有两种风险可能导致 XSS:
- callback 参数意外截断 js 代码,特殊字符单引号、双引号、换行符均存在风险。
- callback 参数恶意添加标签(如
http 头的设置
Content Security Policy(内容安全策略),简称 CSP,主要用来定义页面可以加载哪些资源,
减少 XSS 的发生
。防范方式
nginx 中添加:
server{
location / {
add_header Content-Security-Policy "...."; // html 中只有被允许的内容才会被加载
add_header X-Download-Options `noopen`; //禁用 IE 下载框的 Open 按钮
add_header X-Content-Type-Options `nosniff`; //禁用 IE8 的自动嗅探 MIME 功能
add_header X-XSS-Protection `"1; mode=block"`; // 提供 XSS 检测与防范机制
}
}
CSRF 攻击:
CSRF
(Cross-site request forgery 跨站请求伪造), 通常缩写为 CSRF 或者 XSRF,是一种对网站的恶意利用。CSRF 攻击会发起恶意伪造的请求
防范方式
通常来说,对 CSRF 攻击有一些通用的防范方案,简单介绍几种常用防范方案:
-
验证Referer头部:检查HTTP请求的Referer头部,确保请求是从合法的页面发起的。
-
自定义头部:信任带有
特定的 header
(比如 X-My-Name: java)的请求。 -
X-Frame-Options响应头:使用X-Frame-Options响应头,
防止页面被其他网站通过iframe嵌入
。 -
X-XSS-Protection响应头:启用X-XSS-Protection响应头,提供额外的XSS防护,间接帮助防范CSRF。
-
CSRF令牌存储:
将CSRF令牌存储在HTTPOnly的Cookie中
,这样JavaScript代码无法访问令牌。
钓鱼攻击:
利用网站的跳转链接或者图片制造钓鱼陷阱。
1. url 钓鱼 服务端未对传入的跳转 url 变量进行检查和控制,可能导致可恶意构造任意一个恶意地址,诱导用户跳转到恶意网站。通过转到恶意网站欺骗用户输入用户名和密码盗取用户信息,或欺骗用户进行金钱交易;
- 第一种:
若跳转的 url 事先是可以确定的
,包括 url 和参数的值,则可以在后台先配置好,url 参数只需传对应 url 的索引即可,通过索引找到对应具体 url 再进行跳转; - 第二种:
若跳转的 url 事先不确定
,但其输入是由后台生成的
(不是用户通过参数传入),则可以先生成好跳转链接然后进行签名;
防范方式
-
进行跳转的时候对 url 进行按规则校验:
判断 url 是否在应用授权的白名单内
。 -
跳转时弹窗给用户提示,告知这是第三方链接
2. 图片钓鱼 如果可以允许用户向网页里插入未经验证的外链图片,这可能出现钓鱼风险。
防范方式
- 对外联URL进行转义处理,避免在连接中植入xss攻击
3. iframe 钓鱼
通过内嵌 iframe 到被攻击的网页中,攻击者可以引导用户去点击 iframe 指向的危险网站,甚至遮盖,影响网站的正常功能,劫持用户的点击操作。
防范方式
## 表示该页面可以在相同域名页面的 frame 中展示
add_header X-Frame-Options SAMEORIGIN;
## 表示该页面可以在指定来源的 frame 中展示
#add_header X-Frame-Options "ALLOW-FROM http://domain.com";
HTTP 参数污染:
Http Parameter Pollution(HPP),即 HTTP 参数污染攻击。
在 HTTP 协议中是允许同样名称的参数出现多次
,而由于应用的实现不规范,攻击者通过传播参数的时候传输 key 相同而 value 不同的参数,从而达到绕过某些防护的后果。
HPP 可能导致的安全威胁有:
- 绕过防护和参数校验。
- 产生逻辑漏洞和报错,影响应用代码执行。
防范方式
对客户端传输 key 相同而 value 不同的参数时,强制使用第一个参数,因此不会导致 HPP 攻击。
其他漏洞攻防
DDOS 攻击
解决方案:
- 流量监控:使用
入侵检测系统(IDS)
和流量监控工具来检测异常流量模式。 - 分布式防御:利用内容分发网络(CDN)和分布式拒绝服务(DDoS)防护服务。
- 黑洞路由:在攻击期间,将流量导向一个
黑洞
,即一个不存在的地址,从而保护目标系统。
SQL 注入攻击
解决方案:
- 参数化查询:使用
参数化命令执行 SQL 语句
来防止恶意 SQL 代码的注入。 - 输入验证:对所有输入数据进行严格的验证,确保它们符合预期格式。
- 最小权限原则:确保数据库账户具有执行其功能所需的最小权限。
弱口令
解决方案:
- 强密码策略:强制执行包含
大小写字母、数字和特殊字符的复杂密码
。 - 密码过期:定期更换密码,并禁止重复使用旧密码。
- 多因素认证:增加一层额外的安全验证,如短信验证码、电子邮件确认或生物识别。
点击劫持攻击
解决方案:
- X-Frame-Options:使用 HTTP 头部
X-Frame-Options
来防止页面被其他站点框架。 - 内容安全策略:使用 CSP(Content Security Policy)来限制资源加载,防止点击劫持。
会话劫持攻击
解决方案:
- HTTPS:使用安全的 HTTP 来加密会话 cookie,防止中间人攻击。
- 安全的 cookie 属性:设置 cookie 的
HttpOnly
和Secure
属性,使它们不能被 JavaScript 访问,并且只能通过 HTTPS 传输。 - 会话超时:实施会话超时机制,减少会话劫持的风险。
文件包含漏洞
解决方案:
- 输入验证:确保所有文件包含操作都对输入进行了严格的验证。
- 限制文件访问:限制可包含的文件类型和路径,避免访问系统文件。
- 使用白名单:使用
白名单
来验证可包含的文件,而不是黑名单。
端口扫描
解决方案:
- 防火墙规则:
配置防火墙规则,仅允许必要的端口开放
。 - 入侵检测系统:使用 IDS 来监控和警报可疑的端口扫描行为。
- 网络监控:定期进行网络监控,以便快速响应任何异常活动。
中间人攻击
解决方案:
- HTTPS:
使用 HTTPS 来加密客户端和服务器之间的通信
,防止数据被截获和篡改。 - 证书验证:确保所有 SSL/TLS 证书都是由可信的证书颁发机构签发的,并启用证书验证。
- 网络隔离:使用虚拟专用网络(VPN)或专用网络来隔离敏感通信。
结语:
Web应用安全性不容忽视,面对XSS、CSRF、SQL注入等攻击手段,必须采取一系列防御措施。文章全面介绍了前端和后端的防护策略:如使用转义函数、设置HTTP响应头、参数化查询、强密码策略等,以及对点击劫持、会话劫持、文件包含漏洞等的预防方法。通过这些策略,可以大幅降低Web应用的安全风险,保障用户数据安全和网站稳定运行。