前端安全
学习参考演示:github.com/digininja/D…
XSS
XSS 的全称是 Cross-site Scripting,跨站脚本攻击。注入恶意代码到网页,并使用户加载执行。
目的可能有:
- 获取当前用户在这个网站的cookies,从而拿到用户的敏感信息;
- 以当前用户的身份发起一些非用户本意的操作请求,比如删除网站好友,发帖,发私信,显示伪造的文章或图片,等等;
- 实现DDos攻击(分布式拒绝服务(DDoS)攻击是通过大规模互联网流量淹没目标服务器或其周边基础设施,以破坏目标服务器、服务或网络正常流量的恶意行为)
XSS的危害大致有:
- 获取页面数据
- 获取Cookies
- 劫持前端逻辑
- 发送请求
- 偷取网站的任意数据
- 偷取用户的资料
- 偷取用户的秘密和登录态
- 欺骗用户
攻击方式:
一、非持久型攻击(反射型)
反射型 XSS 反射型 XSS 只是简单的把用户输入的数据“反射”给浏览器,XSS 脚本出现在 URL 请求参数里,也就是说需要诱使用户“点击”一个恶意链接,才能攻击成功。反射型 XSS 也叫作非持久型 XSS。
二、dom型攻击
DOM Based XSS 基于 DOM 的 XSS,通过对具体 DOM 代码进行分析,根据实际情况构造 DOM 节点进行 XSS 跨站脚本攻击。
三、持久型攻击(存储型)
储存型 XSS 存储型 XSS 也被称为持久型 XSS,当攻击者输入一段恶意脚本后,被服务端接受保存,当用户访问这个页面时,恶意脚本就会被执行,从而造成漏洞。
防御方式
- 使用HTML转译。对所有外部插入的代码都应该做一次转义,将script,& < > " ' / 等危险字符做过滤和转义替换,同时尽量避免使用innerHTML,document write, outerHTML,eval等方法,用安全性更高的textContent,setAttribute等方法做替代;
富文本来说,显然不能通过上面的办法来转义所有字符,因为这样会把需要的格式也过滤掉。对于这种情况,通常采用白名单过滤的办法,当然也可以通过黑名单过滤,但是考虑到需要过滤的标签和标签属性实在太多,更加推荐使用白名单的方式。
- 开启CSP防护。 (CSP, Content Security Policy) 是一个附加的安全层,用于帮助检测和缓解某些类型的攻击,包括跨站脚本 (XSS) 和数据注入等攻击。 CSP 本质上就是建立白名单,开发者明确告诉浏览器哪些外部资源可以加载和执行。我们只需要配置规则,如何拦截是由浏览器自己实现的。我们可以通过这种方式来尽量减少 XSS 攻击。
在HTTP响应头中设置Content-Security-Policy:
// 只允许加载本站资源
Content-Security-Policy: default-src 'self'
// 只允许加载 HTTPS 协议图片 (https可以溯源追踪,安全性较高)
Content-Security-Policy: img-src https://*
// 不允许加载任何来源框架
Content-Security-Policy: child-src 'none'
- HttpOnly Cookie
这是预防XSS攻击窃取用户cookie最有效的防御手段。Web应 用程序在设置cookie时,将其属性设为HttpOnly,就可以避免该网页的cookie被客户端恶意JavaScript窃取,保护用户cookie信息。
如何使用:将敏感cookie设置HttpOnly为true
CSRF
CSRF (Cross-site request forgery),中文名称跨站请求伪造。
流程:
- 用户登录目标网站A;
- 用户以某种方式接触到恶意网站B的链接;
- 用户点击链接访问网站B,网站B中的js代码执行,偷偷向目标网站A发送某个请求;
- 由于用户登录过网站A,因此请求携带了网站A的相关cookie凭证,最后请求成功执行 。
大致的危害:
- 利用用户登录态
- 用户不知情
- 完成业务请求
- 盗取用户资金(转账,消费)
- 冒充用户发帖背锅
- 损害网站声誉
防御方式
- 人机图形验证码,邮箱验证,短信等手段进行二次验证
- 服务端通过请求头中的referer和origin字段,判断请求来源(referer https无效,基本无用)
- 服务端算法设置CSRF token
点击劫持
点击劫持是一种视觉欺骗的攻击手段。攻击者将需要攻击的网站通过 iframe 嵌套的方式嵌入自己的网页中,并将 iframe 设置为透明,在页面中透出一个按钮诱导用户点击。
防御方式
- X-FRAME-OPTIONS
X-FRAME-OPTIONS 是一个 HTTP 响应头,在现代浏览器有一个很好的支持。这个 HTTP 响应头是为了防御用 iframe 嵌套的点击劫持攻击。
该响应头有三个值可选,分别是
- DENY,表示页面不允许通过 iframe 的方式展示
- SAMEORIGIN,表示页面可以在相同域名下通过 iframe 的方式展示
- ALLOW-FROM,表示页面可以在指定来源的 iframe 中展示
这样设置无用,需要在nginx ,Apache或后端设置。
其他一些攻击
- sql注入 防御一般使用 ? 等占位
- OS命令注入 非法的shell脚本,或者shell脚本存在疏漏
- 请求劫持
1)DNS劫持(DNS解析各个步骤)被篡改,修改了域名解析的结果,使得访问到的不是预期的ip
2)HTTP劫持 运营商劫持,此时大概只能升级HTTPS了
- DDOS (上面有介绍) 1)扩容 2)动态防御 3)公告 等手段
安全算法
共享密钥加密(对称加密)
概念:共享密钥加密是加密和解密都使用相同密钥的一种加密方式。由于使用的密钥相同,所以这种算法也被称为“对称加密”。
常见类型:实现共享密钥加密的算法有凯撒密码、AES、DES、动态口令等,其中AES的应用最为广泛。
弊端:对称加密的一大缺点是密钥的管理与分配,换句话说,如何把密钥发送到需要解密你的消息的人的手里是一个问题。在发送密钥的过程中,密钥有很大的风险会被黑客们拦截。
图形理解:
假设A准备通过互联网向B发送数据。由于有被窃听的风险,所以需要把想要保密的数据加密后再发送。A使用密钥加密数据。A将密文发送给B。B收到密文后,使用相同的密钥对其进行解密。这样,B就取得了原本的数据。只要是加密好的数据,就算被第三者恶意窃听也无须担心。
问题:A和B无法直接沟通,B并不知道A加密时使用的是什么密钥。所以A需要将用某种方式将密钥发送给B,过程中密钥可能被X窃听。
公开密钥加密(非对称加密)
概念:公开密钥加密是加密和解密使用不同密钥的一种加密方法。由于使用的密钥不同,所以这种算法也被称为“非对称加密”。加密用的密钥叫作“公开密钥”,解密用的叫作“私有密钥”。
常见类型:实现公开密钥加密的算法有RSA算法、椭圆曲线加密算法等,其中使用最为广泛的是RSA算法。
特点:
- 产生一对秘钥
- 公钥负责加密
- 私钥负责解密
- 私钥无法解开说明公钥无效 - 抗抵赖
- 计算复杂对性能有影响(极端情况下 1000倍) (通常针对对称加密的密钥进行加密,降低数据复杂度对性能影响,也减少非对称加密次数)
图解:
假设A准备通过互联网向B发送数据。首先,需要由接收方B来生成公开密钥和私有密钥。然后把公开密钥发送给A。A使用B发来的公开密钥加密数据。A将密文发送给B, B再使用私有密钥对密文进行解密。这样,B就得到了原本的数据。
问题:中间人攻击(man-in-the-middle attack)
解决: 数字证书。
- 数字证书就是由 CA 机构使用自己私钥,对证书申请者的公钥进行签名认证。
- 数字证书解决了如何安全分发公钥的问题,也奠定了信任链的基础。