xss的防御

2017-09-05  本文已影响0人  8c69eb57ee3a
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。

上一篇 下一篇

猜你喜欢

热点阅读