安全对于一个系统网站来说是十分重要的,需要在项目架构的时候就考虑进去,虽然安全的工作主要还是得靠服务端,例如 ddos
攻击,广告注入,http 劫持, 网络,服务器的架设也是十分关键的一环。
当然前端作为其中的一环,与用户最直接接触,也需要注意安全相关的问题。
前端最主要的两个攻击手段是 XSS(跨站脚本攻击) 和 CSRF (跨站请求伪造)
XSS
XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript,但实际上也可以包括Java、 VBScript、ActiveX、 Flash 或者甚至是普通的HTML。
- 存储型 XSS
- 攻击者将恶意代码提交到目标网站的数据库中。
- 用户打开目标网站时,网站服务端将恶意代码从数据库取出,拼接在 HTML 中返回给浏览器。
- 用户浏览器接收到响应后解析执行,混在其中的恶意代码也被执行。
- 恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作
常见于带有用户保存数据的网站功能,如论坛发帖
、商品评论
、用户私信
等
- 反射型 XSS
- 攻击者构造出特殊的 URL,其中包含恶意代码
- 用户打开带有恶意代码的 URL 时,网站服务端将恶意代码从 URL 中取出,拼接在 HTML 中返回给浏览器。
- 用户浏览器接收到响应后解析执行,混在其中的恶意代码也被执行。
- 恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作。
常见于通过 URL 传递参数的功能,如 网站搜索
、跳转
等
-
预防手段
- 输入过滤,转义(因非法字符无法穷举,因此可以使用白名单)
- 对于明确的输入类型,例如数字、URL、电话号码、邮件地址等等内容,进行输入过滤
- DOM 中的内联事件监听器,如
location
,onclick
、onerror
、onload
、onmouseover
等, 标签的href
属性,JavaScript
的eval()
、setTimeout()
、setInterval()
等,都能把字符串作为代码运行。如果不可信的数据拼接到字符串中传递给这些 API,很容易产生安全隐患,请务必避免。 - 输入内容长度控制
- HTTP-only Cookie: 禁止
JavaScript
读取某些敏感Cookie
,攻击者完成XSS
注入后也无法窃取此Cookie
。 - 验证码:防止脚本冒充用户提交危险操作。
CSRF
CSRF(Cross Site Request Forgery, 跨站域请求伪造)是一种网络的攻击方式,该攻击可以在受害者毫不知情的情况下以受害者名义伪造请求发送给受攻击站点,从而在并未授权的情况下执行在权限保护之下的操作,有很大的危害性。
这一个攻击过程可以用这样一个例子来阐述:
1. 受害者登录 a.com,并保留了登录凭证(Cookie)。
2. 攻击者引诱受害者访问了 b.com。
3. b.com 向 a.com 发送了一个请求:a.com/act=xx。浏览器会默认携带 a.com 的 Cookie 。
4. a.com 接收到请求后,对请求进行验证,并确认是受害者的凭证,误以为是受害者自己发送的请求。
5. a.com 以受害者的名义执行了 act=xx 。
6. 攻击完成,攻击者在受害者不知情的情况下,冒充受害者,让 a.com 执行了自己定义的操作。
-
特点:
- 攻击一般发起在第三方网站,而不是被攻击的网站。被攻击的网站无法防止攻击发生。
- 攻击利用受害者在被攻击网站的登录凭证,冒充受害者提交操作;而不是直接窃取数据。
- 整个过程攻击者并不能获取到受害者的登录凭证,仅仅是“冒用”。
跨站请求可以用各种方式:图片URL、超链接、CORS、Form提交等等。部分请求方式可以直接嵌入在第三方论坛、文章中,难以进行追踪。
-
预防
- 阻止不明外域的访问
- 同源检测
- Origin Header
- Referer Header(Referer的值是由浏览器提供的,虽然HTTP协议上有明确的要求,但是每个浏览器对于Referer的具体实现可能有差别,并不能保证浏览器自身没有安全漏洞)
- Samesite Cookie
- 同源检测
- 提交时要求附加本域才能获取的信息
- CSRF Token(目前很多网站采用Encrypted Token Pattern方式。这种方法的Token是一个计算出来的结果,而非随机生成的字符串。这样在校验时无需再去读取存储的Token,只用再次计算一次即可。这种Token的值通常是使用UserID、时间戳和随机数,通过加密的方法生成。这样既可以保证分布式服务的Token一致,又能保证Token不容易被破解。)
- 双重Cookie验证(在用户访问网站页面时,向请求域名注入一个Cookie,内容为随机字符串(例如csrfcookie=v8g9e4ksfhw)。
在前端向后端发起请求时,取出Cookie,并添加到URL的参数中(接上例POST https://www.a.com/comment?csrfcookie=v8g9e4ksfhw)。
后端接口验证Cookie中的字段与URL参数中的字段是否一致,不一致则拒绝。)
- 阻止不明外域的访问