3

一.xss攻击方式
反射型、存储型
1.反射型
发出请求时,xss代码存在于URL中,作为输入提交到服务器端,服务器端解析后响应,xss代码随响应内容一起传回给浏览器,最后浏览器解析执行xss代码。
2.存储型
存储型xss代码和反射弧xss代码区别仅在于,提交的代码回存储在服务器端(数据库,内存,文件系统等),下次请求目标页面时不用再提交xss代码。

二.xss防御措施
编码 过滤 校正
1.编码
对用户输入的数据进行HTML Entity编码。
2.过滤
移除用户上传的DOM属性,如onerror等。
移除用户上传的style结点,script结点,iframe结点等。
3.校正
避免直接对HTML Entity解码。
使用DOM Parse转换,校正不配对的DOM标签。
`var HtmlUtil = {

    /*1.用浏览器内部转换器实现html转码*/
   htmlEncode:function (html){
      //1.首先动态创建一个容器标签元素,如DIV
      var temp = document.createElement ("div");
      //2.然后将要转换的字符串设置为这个元素的innerText(ie支持)或者textContent(火狐,google支持)
    (temp.textContent != undefined ) ? (temp.textContent = html) : (temp.innerText = html);
      //3.最后返回这个元素的innerHTML,即得到经过HTML编码转换的字符串了
     var output = temp.innerHTML;
     temp = null;
     return output;
 },
 /*2.用浏览器内部转换器实现html解码*/
 htmlDecode:function (text){
     //1.首先动态创建一个容器标签元素,如DIV
     var temp = document.createElement("div");
     //2.然后将要转换的字符串设置为这个元素的innerHTML(ie,火狐,google都支持)
     temp.innerHTML = text;
     //3.最后返回这个元素的innerText(ie支持)或者textContent(火狐,google支持),即得到经过HTML解码的字符串了。
     var output = temp.innerText || temp.textContent;
     temp = null;
     return output;
 },
 /*3.用正则表达式实现html转码*/
 htmlEncodeByRegExp:function (str){ 
     var s = "";
      if(str.length == 0) return "";
      s = str.replace(/&/g,"&");
      s = s.replace(/</g,"&lt;");
      s = s.replace(/>/g,"&gt;");
      s = s.replace(/ /g,"&nbsp;");
      s = s.replace(/\'/g,"&#39;");
      s = s.replace(/\"/g,"&quot;");
      return s; 
},
/*4.用正则表达式实现html解码*/
htmlDecodeByRegExp:function (str){ 
      var s = "";
      if(str.length == 0) return "";
      s = str.replace(/&amp;/g,"&");
      s = s.replace(/&lt;/g,"<");
      s = s.replace(/&gt;/g,">");
      s = s.replace(/&nbsp;/g," ");
      s = s.replace(/&#39;/g,"\'");
      s = s.replace(/&quot;/g,"\"");
      return s; 
}
};`

用于过滤xss的js文件:
https://segmentfault.com/a/1190000021169712
使用方法:
引入该文件,并设置黑白名单(即是否过滤,根据需求)

window.xss = new filterXSS.FilterXSS({
   whiteList: [], // 白名单为空,表示过滤所有标签
   stripIgnoreTag: true, // 过滤所有非白名单标签的HTML
   stripIgnoreTagBody: ["script"] // script标签较特殊,需要过滤标签中间的内容
});

在需要过滤的地方调用该方法,如下:
xss.process(xxx);

将不断更新完善,欢迎批评指正!


薇薇
298 声望24 粉丝

路漫漫其修远兮,吾将上下而求索


引用和评论

0 条评论