引用
作者:美团技术团队
前端安全系列之一:如何防止XSS攻击?
链接:https://juejin.im/post/5bad9140e51d450e935c6d64
前端安全系列之二:如何防止CSRF攻击?
链接:https://juejin.im/post/5bc009996fb9a05d0a055192
作者:BerL1n 链接:https://www.jianshu.com/p/d1d1c40f6d4c
作者:z3r0yu 链接:https://xz.aliyun.com/t/2115
1.XSS攻击
1.1XSS定义
Cross-Site Scripting(跨站脚本攻击)简称 XSS,是一种代码注入攻击。攻击者通过在目标网站上注入恶意脚本,使之在用户的浏览器上运行。利用这些恶意脚本,攻击者可获取用户的敏感信息如 Cookie、SessionID 等,进而危害数据安全。
XSS 的本质是:恶意代码未经过滤,与网站正常的代码混在一起;浏览器无法分辨哪些脚本是可信的,导致恶意脚本被执行。
1.2XSS注入方式
- 在 HTML 中内嵌的文本中,恶意内容以 script 标签形成注入。
- 在内联的 JavaScript 中,拼接的数据突破了原本的限制(字符串,变量,方法名等)。
- 在标签属性中,恶意内容包含引号,从而突破属性值的限制,注入其他属性或者标签。
- 在标签的 href、src 等属性中,包含
javascript:
等可执行代码。 - 在 onload、onerror、onclick 等事件中,注入不受控制代码。
- 在 style 属性和标签中,包含类似
background-image:url("javascript:...");
的代码(新版本浏览器已经可以防范)。 - 在 style 属性和标签中,包含类似
expression(...)
的 CSS 表达式代码(新版本浏览器已经可以防范)。
总之,如果开发者没有将用户输入的文本进行合适的过滤,就贸然插入到 HTML 中,这很容易造成注入漏洞。攻击者可以利用漏洞,构造出恶意的代码指令,进而利用恶意代码危害数据安全。
1.3预防方式
-
输入过滤:在用户提交时,由前端过滤输入,然后提交到后端。
- 缺点:会导致乱码问题,只能解决特定的XSS问题。
- 适用于有明确输入类型的数据的过滤:如数字、URL、电话号码、邮件地址等用户提交信息。
-
预防存储型和反射型XSS攻击:存储型和反射型 XSS 都是在服务端取出恶意代码后,插入到响应 HTML 里的,攻击者刻意编写的“数据”被内嵌到“代码”中,被浏览器所执行。预防这两种漏洞,有两种常见做法:
- 改成纯前端渲染,把代码和数据分隔开,浏览器先加载一个静态 HTML,此 HTML 中不包含任何跟业务相关的数据,然后执行HTML中JavaScript通过Ajax加载业务数据。-
- 对 HTML 做充分转义:使用更完善更细致的转义策略,设置自定的HTML转义规则。
-
预防 DOM 型 XSS 攻击:DOM 型 XSS 攻击,实际上就是网站前端 JavaScript 代码本身不够严谨,把不可信的数据当作代码执行了。要通过避免在字符串中拼接不可信数据。
2.CSRF攻击
2.1 CSRF定义
CSR