虽然说前端涉及安全问题的情况相对于后端较少,但还是会有安全问题,主要是XSS和CSRF。
XSS (Cross Site Script) - 跨域脚本攻击
为了与层叠样式表(CSS)区分,所以Cross缩写为X而不是C
XSS的本质是破坏文档、代码的结构。使用的漏洞是程序没有对用户输入(可以是提交表单、也可以是url)的字符编解码,导致把用户输入的内容以代码形式输出到页面显示或执行。
很多人讨论XSS时会分为三种,DOM based XSS、存储型XSS、反射型XSS。然而,我觉得这种细分并不合适,DOM based XSS其实是从发生地点来决定,而存储型和反射型其实是从手段或者过程上来决定。
常见漏洞:
- 直接获取url参数来进行DOM插入、更新,甚至执行JS(eval、setTimeout、setInterval、new Function等)
- 直接获取用户输入的值进行DOM插入、更新,甚至执行JS(eval、setTimeout、setInterval、new Function等)
- 把未经编解码(处理)的用户输入提交到数据库存储;从数据库读取到输出到页面的过程中,也不进行编解码或替换。需要注意的是,不仅仅涉及HTML,连JS也是会有可能涉及的
解决方案:
- 避免使用innerHTML,使用JS创建节点的方式或使用模板
- 对特殊字符进行转义
| 特殊字符 | 转义字符 |
|---|---|
| < | < |
| > | > |
| " | " |
| ' | ' |
| & | & |
| / | / |
- 严禁把url或用户输入的字符串作为代码执行
- 异步请求或表单提交参数时,对参数进行encoding(这是一个良好的习惯,无论是否针对XSS)
- 现代浏览器可以使用CSP(Content Security Policy)阻止非法资源(JS、CSS、iframe、图片、多媒体等)加载
宗旨:永不相信用户输入的信息!!!
CSRF (Cross Site Request Forgery) - 跨域请求伪造
CSRF的本质是利用网站使用cookie对用户进行验证的这一做法,诱骗用户访问有害的网页发送请求。
常见手法:
- 在网页上嵌入iframe、image、script等对目标网站发出GET请求进行数据处理(这更多是一个使用错误的请求方法的问题,GET方法本不应该进行除读取数据以外的操作)
- 在网页上提交form POST请求(可以是自动,也可以是诱骗用户点击)
解决方案:
- 只允许JSON API
AJAX请求和传统请求的区别是,请求头的X-Requested-With的值是XMLHttpRequest
- 不允许跨域请求或只允许可信域名请求
服务器的返回头添加Access-Control-Allow-Origin,设置为指定单个域名(含协议)或通配符*
-
服务器校验请求头的referrer
-
终极方案,使用CSRF token
延伸阅读