JavaScript进阶系列-web安全
Cross-site scripting (XSS) 跨站脚本攻击
问题:什么是 XSS 攻击? 如何防范 XSS 攻击? 什么是 CSP ?
XSS 攻击就是攻击者想方设法的将可执行代码注入到网站中。可以放到网页,也可以通过网页放到数据库中,也可以在链接上做文章。攻击者通过执行恶意代码来获取用户信息。
容易发生 XSS 的应用场景:
- 数据从一个不可靠的链接进入 web 应用程序。
- 没有过滤到恶意代码的动态内容被发送给 web 用户。
最简单的就是在我们的输入表单进行注入代码。1
http://www.xxx.com?name=<script>alert(1)</script> // url 注入
这就为啥提醒小白不要去点击一些恶意链接来访问网站,而是直接去访问官网。
XSS 攻击代码一般主要是 JavaScript ,有时候也会包括HTML, FLASH。
攻击目的:
- 获取隐私数据 cookie、session
- 将受害者重定向到一个由攻击者控制的网站(传说中的钓鱼网站)
- 在受害者的机器上进行一些恶意操作(例如用你的机器挖比特币或者成为肉鸡攻击别人的网站)
XSS 类型大致分为以下三种:存储型(永久型)、反射型(非持久性)、基于 DOM
存储型XSS
注入型脚本永久存储在目标服务器上。当浏览器请求数据时,脚本从服务器上传回并执行。
这种情况造成损失非常严重,因为符合要求的访问都会受到攻击。
反射型XSS
当用户点击一个恶意链接,或者提交一个表单,或者进入一个恶意网站时,注入脚本进入被攻击者的网站。Web服务器将注入脚本,比如一个错误信息,搜索结果等 返回到用户的浏览器上。浏览器会执行这段脚本,因为,它认为这个响应来自可信任的服务器。
基于DOM的XSS
被执行的恶意脚本会修改页面脚本结构。
XSS 通常使用两种方式进行防御
- 对于用户的输入永远不信任,转义输入输出的内容,对于引号、尖括号、斜杠进行转义
1
2
3
4
5
6
7
8
9
10function escape(str) {
str = str.replace(/&/g, '&')
str = str.replace(/</g, '<')
str = str.replace(/>/g, '>')
str = str.replace(/"/g, '&quto;')
str = str.replace(/'/g, ''')
str = str.replace(/`/g, '`')
str = str.replace(/\//g, '/')
return str
}
对于需要输入代码的应用场景,比如富文本,就需要把正常的过滤,通常采用白名单的形式。
js-xss仓库1
2
3var xss = require("xss");
var html = xss('<script>alert("xss");</script>');
console.log(html);
Content-Security-Policy(CSP) 内容安全策略
CSP 本质上就是建立白名单,开发者明确告诉浏览器哪些外部资源可以加载和执行。我们只需要配置规则,如何拦截是浏览器实现的。 CSP 是一个额外的安全层,用于检测并削弱某些类型特定的攻击,包括 XSS 和数据注入攻击。
开启 CSP
- 设置网络服务器返回 HTTP 头部 ‘Content-Security-Policy: (CSP策略指令)’
- meta 添加 ‘‘
Content-Security-Policy设置
只允许加载本站资源
1
Content-Security-Policy: default-src 'self'
只允许加载 HTTPS 协议图片
1
Content-Security-Policy: img-src https://*
允许加载任何来源框架
1
Content-Security-Policy: child-src 'none'
总结
输入输出过滤,长度限制。
加载资源限制(http添加资源策略,添加白名单),cookie 操作限制,用户身份令牌+时间戳,https,参数加密解密
CSRF
跨站请求伪造:诱导用户进入第三方网站,携带当前网站的登录凭证 cookie ,然后使用用户的身份信息进行请求的操作。
添加额外的用户凭证是为了放在
防御手段
添加验证码
一般在转账,交易,登录等操作使用
检查 Referer
Referer 可以作为一种辅助手段,来判断请求的来源是否是安全的,但是鉴于 Referer 本身是可以被修改的,因为不能仅依赖于 Referer
token 令牌
普通是 将令牌加密,用户请求携带,服务端校验
高级版要加上时间戳,每个请求的时间都是不一样的
ddos 攻击
js 接口调用安全
身份验证+时间戳
参数加密
https(http+ssl)
http 存在中间人攻击威胁,跳转过程可能被恶意网站利用来直接接触用户信息。