之前一直没有注意过这种安全性问题,但是昨天实验室一个娃面试的时候被问到了这个问题,突然觉得挺感兴趣的,所以就了解了一下。
什么是XSS攻击
XSS
全称(Cross Site Scripting) 跨站脚本攻击, 是Web程序中最常见的漏洞。指攻击者在网页中嵌入客户端脚本(例如JavaScript), 当用户浏览此网页时,脚本就会在用户的浏览器上执行,从而达到攻击者的目的. 比如获取用户的Cookie,导航到恶意网站,携带木马等。
XSS攻击的原理
XSS
主要就是通过一些正常的站内交互途径,例如发表评论,提交含有JavaScript
的内容文本,这时服务器端如果没有过滤或转义掉这些脚本,作为内容发布到了页面上,其他用户访问这个页面的时候就会运行这些脚本,从而被攻击。
那么先举个栗子吧:
<input type="text" id="userInput"/>
<input type="button" onclick="submit()" value="提交"/>
JavaScript
代码:
function submit() {
var input = document.getElementById("userInput").value;
console.log(input);
}
当我随意输入一个值时,这个程序运行正常:
那么如果我输入了document.cookie
呢?我先给它加一个cookie
:
document.cookie = "name=haha";
这只是简单的获取
cookie
,如果我给里面加一些其他代码呢,后果不堪设想
XSS攻击类型
- 反射型XSS
主要是通过修改url的方式,因为url的参数可能在页面中用到,那我们就可以在参数中加一些恶意代码,当受害人访问这个链接的时候,这个恶意代码就执行了 - 储蓄型XSS
比如说有一个可以发表评论的地方,大家都可以评论,可以想到这个评论是要保存到后端的,如果这个评论有xss漏洞的话,我们发表一些恶意代码,然后恶意代码就被保存到服务器上了,当别人访问的时候,恶意代码执行,然后中招。
如何预防
1.使用XSS Filter
- 输入过滤,对用户提交的数据进行有效性验证,仅接受指定长度范围内并符合我们期望格式的的内容提交,阻止或者忽略除此外的其他任何数据
- 输出转义,当需要将一个字符串输出到Web网页时,同时又不确定这个字符串中是否包括XSS特殊字符,为了确保输出内容的完整性和正确性,输出HTML属性时可以使用HTML转义编码进行处理,输出到<script>中,可以进行JS编码。
url编码解码
2.使用 HttpOnly Cookie
http-only参数,在重要的cookie
参数中加入httpOnly
属性,这样的话javascript
就不能取到cookie
值,可以解决一部分xss
威胁。