一、什么是XSS?
XSS(Cross Site Scripting)即跨站点脚本攻击。恶意攻击者在web页面中注入恶意脚本程序,当用户浏览页面时,恶意脚本程序运行,达到攻击用户的目的。
二、XSS的分类
反射型XSS
反射型XSS为非持久性XSS,恶意攻击者诱导用户点击一个嵌有恶意代码的链接,用户点击后恶意程序在用户浏览器中运行,达到攻击的目的。反射型XSS主要有以下步骤:
- 黑客诱导用户点击一个有恶意程序的URL
- 用户点击后,浏览器将包含有恶意程序的请求发送给服务器
- 服务器获取请求体后拼接恶意程序代码和html文件后返回给客户端
- 客户端收到后恶意程序在浏览器中运行,恶意程序可能会窃取用户的信息
存储型XSS
存储型XSS为持久型XSS,黑客将恶意攻击程序上传到服务器中,下次当用户浏览相关资源时,恶意程序会在用户浏览器上运行。存储型XSS主要有以下步骤:
1.黑客将恶意程序代码(如在留言板中写脚本)上传到服务器
2.当用户浏览相关资源时,返回包含有恶意程序的资源,浏览器解析执行恶意程序
3.此时用户信息就有可能被窃取
DOM-based型
DOM-based型XSS为非持久性XSS,由于客户端的JS可以对DOM进行读写,修改。当客户端从URL中读取数据后在浏览器中执行,如果在该URL中包含恶意程序,同时客户端又不对URL的内容不做处理判断就执行,有可能就会遭受XSS攻击。DOM-based XSS主要有以下步骤:
- 黑客构造好含有恶意程序的URL如:http://127.0.0.1/xsstest.html?url=javascript:alert(‘xsstest’);
- 客户端提取请求参数中的URL,并使用以下方法写入到DOM中,便会执行恶意程序代码
使用如下方法,可能遭受XSS:
a). document.write直接输出数据(包含a标签,href
=url(上面含有javascript:的代码))
b). 使用innerHTML直接输出数据(包含a标签,href
=url(上面含有javascript:的代码))
c). 使用location、location.href、location.replace、iframe.src、document.referer、window.name等
三、预防XSS
1.预防存储型和反射型XSS
渲染模式改为前端渲染,避免后端拼接HTML
,使用前端渲染的好处就是,使用js来更新DOM
,在更新DOM
时,我们会明确的告诉浏览器:下面要设置的内容是文本(.innerText
),还是属性(.setAttribute
),还是样式(.style
)等等。浏览器不会被轻易的被欺骗,执行预期外的代码了。
注意!纯前端渲染还需注意避免
DOM
型XSS
漏洞(例如onload
事件和href
中的javascript:xxx
等)
如果拼接HTML
是必须的,就是用合适的转义库对HTML
拼接的地方进行转义(若不是必须就不用转义,因为转义有可能引起乱码问题)
2.预防DOM-based型XSS
在使用innerHTML
,document.write()
时要特别小心,不能把不可信任的内容插入到页面上,尽量使用.textContent
,setAttribute()
。如果使用Vue
,React
等技术栈,并且不使用 v-html/dangerouslySetInnerHTML
功能,就在前端 render
阶段避免 innerHTML
、outerHTML
的 XSS
隐患。
DOM 中的内联事件监听器,如 location
、onclick
、onerror
、onload
、onmouseover
等,<a>
标签的 href
属性,JavaScript
的 eval()
、setTimeout()
、setInterval()
等,都能把字符串作为代码运行。因此要对这些操作在使用前对内容进行检查。
3.其他一些预防措施
- 对输入内容长度进行控制
- 开启
HTTP-Only
,防止攻击脚本获取用户信息 - 使用验证码
参考博文:
[1]: https://www.cnblogs.com/tugenhua0707/p/10909284.html
[2]: https://juejin.cn/post/6844903685122703367#heading-18