XSS产生的原因
xss是怎么产生的呢?是由于网站(包括前端部分和后端部分)没有对用户提交的数据过滤或者过滤不严导致服务器生成的HTML文件被破坏掉了原有的结构。
本来是要生成下面的HTML文档的
<body>
我在学习XSS
</body>
结果生成了
<body>
我在学习XSS</body><script src='bad.js'></script>
</body>
这和原本的HTML是完全不同的结构。
xss的防御
知道了问题产生的原因,自然防御的方法就有了。问题出在“没有对用户提交的数据过滤”上面,那么防御的方法自然就是过滤数据了,这是其一,其二我觉得浏览器本身可以在获取到HTML文件之后可以主动分析潜在的可能包含XSS的HTML。
1.在客户端js中过滤
我写了一个简单的小案例。
<!doctype html>
<html>
<head>
<script>
function checkText()
{
var a=document.getElementById('inputName');
var b=a.value;
if(b.indexOf("<")>=0)
{
alert('xss!');
a.value='';//清空输入框,重新输入
return false;//不提交数据
}
alert('good');
return true;//提交数据
}
</script>
</head>
<body>
<form method='get' >
<input type='text' id='inputName' name='name' value=''></input>
<input type='submit' onClick='return checkText();'></input>
<!--不能写成onClick='checkText();' 否则会永远提交数据 为什么?-->
</form>
</body>
</html>
2.在服务器端过滤
由于我不会php,就不写代码了,但是思路是和客户端过滤一样的。
3.浏览器本身的功能
这个功能我不知道现在的浏览器有没有,也不知道是不是我第一个想出来的,哈哈。暂时就把这个功能叫主动防御吧。具体思路就是浏览器把每个收到的html文件都分析一遍,查看有没有可能包含潜在的xss,具体策略可以是如下:
1.统计一个标签占用的字符数,如果某个标签占用的字符数异常了就给出提醒。
比如
<input type='text' id='inputName' name='name' value=''></input>
它可能平均占用的是64个字符,如果被xss了,那么就会导致input标签被截断,这就导致它占用的字符少于64个了。
2.统计一个HTML加载的js文件以及分析js文件和html文件的相关性,也可以从js的功能方面防御。
比如平常一个网站加载10个js文件,某天突然就加载了11个。
比如正常的js应该都是处理html的数据的,某天某个js用来获取cooke了。
现在不是机器学习和大数据很火嘛,个人觉得是可以让浏览器训练一下,给它十万个xss页面,让它自我学习一下,以后就可以直接提醒用户你访问的页面可能包含xss。