在数据添加到DOM时候,我们可以需要对内容进行HtmlEncode或JavaScriptEncode,以预防XSS攻击。

JavaScriptEncode

使用“\”对特殊字符进行转义,除数字字母之外,小于127的字符编码使用16进制“\xHH”的方式进行编码,大于用unicode(非常严格模式)。

//使用“\”对特殊字符进行转义,除数字字母之外,小于127使用16进制“\xHH”的方式进行编码,大于用unicode(非常严格模式)。
var JavaScriptEncode = function(str){var hex=new Array('0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f');function changeTo16Hex(charCode){return "\\x" + charCode.charCodeAt(0).toString(16);}function encodeCharx(original) {var found = true;var thecharchar = original.charAt(0);var thechar = original.charCodeAt(0);switch(thecharchar) {case '\n': return "\\n"; break; //newlinecase '\r': return "\\r"; break; //Carriage returncase '\'': return "\\'"; break;case '"': return "\\\""; break;case '\&': return "\\&"; break;case '\\': return "\\\\"; break;case '\t': return "\\t"; break;case '\b': return "\\b"; break;case '\f': return "\\f"; break;case '/': return "\\x2F"; break;case '<': return "\\x3C"; break;case '>': return "\\x3E"; break;default:found=false;break;}if(!found){if(thechar > 47 && thechar < 58){ //数字return original;}if(thechar > 64 && thechar < 91){ //大写字母return original;}if(thechar > 96 && thechar < 123){ //小写字母return original;}        if(thechar>127) { //大于127用unicodevar c = thechar;var a4 = c%16;c = Math.floor(c/16); var a3 = c%16;c = Math.floor(c/16);var a2 = c%16;c = Math.floor(c/16);var a1 = c%16;return "\\u"+hex[a1]+hex[a2]+hex[a3]+hex[a4]+"";        }else {return changeTo16Hex(original);}}}     var preescape = str;var escaped = "";var i=0;for(i=0; i < preescape.length; i++){escaped = escaped + encodeCharx(preescape.charAt(i));}return escaped;
}

HtmlEncode

将字符转换成HTMLEntites,以对抗XSS。

var HtmlEncode = function(str){var hex = new Array('0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f');var preescape = str;var escaped = "";for(var i = 0; i < preescape.length; i++){var p = preescape.charAt(i);escaped = escaped + escapeCharx(p);}return escaped;function escapeCharx(original){var found=true;var thechar=original.charCodeAt(0);switch(thechar) {case 10: return "<br/>"; break; //newlinecase 32: return "&nbsp;"; break; //spacecase 34:return "&quot;"; break; //"case 38:return "&amp;"; break; //&case 39:return "'"; break; //'case 47:return "/"; break; // /case 60:return "&lt;"; break; //<case 62:return "&gt;"; break; //>case 198:return "&AElig;"; break;case 193:return "&Aacute;"; break;case 194:return "&Acirc;"; break; case 192:return "&Agrave;"; break; case 197:return "&Aring;"; break; case 195:return "&Atilde;"; break; case 196:return "&Auml;"; break; case 199:return "&Ccedil;"; break; case 208:return "&ETH;"; break;case 201:return "&Eacute;"; break; case 202:return "&Ecirc;"; break; case 200:return "&Egrave;"; break; case 203:return "&Euml;"; break;case 205:return "&Iacute;"; break;case 206:return "&Icirc;"; break; case 204:return "&Igrave;"; break; case 207:return "&Iuml;"; break;case 209:return "&Ntilde;"; break; case 211:return "&Oacute;"; break;case 212:return "&Ocirc;"; break; case 210:return "&Ograve;"; break; case 216:return "&Oslash;"; break; case 213:return "&Otilde;"; break; case 214:return "&Ouml;"; break;case 222:return "&THORN;"; break; case 218:return "&Uacute;"; break; case 219:return "&Ucirc;"; break; case 217:return "&Ugrave;"; break; case 220:return "&Uuml;"; break; case 221:return "&Yacute;"; break;case 225:return "&aacute;"; break; case 226:return "&acirc;"; break; case 230:return "&aelig;"; break; case 224:return "&agrave;"; break; case 229:return "&aring;"; break; case 227:return "&atilde;"; break; case 228:return "&auml;"; break; case 231:return "&ccedil;"; break; case 233:return "&eacute;"; break;case 234:return "&ecirc;"; break; case 232:return "&egrave;"; break; case 240:return "&eth;"; break; case 235:return "&euml;"; break; case 237:return "&iacute;"; break; case 238:return "&icirc;"; break; case 236:return "&igrave;"; break; case 239:return "&iuml;"; break; case 241:return "&ntilde;"; break; case 243:return "&oacute;"; break;case 244:return "&ocirc;"; break; case 242:return "&ograve;"; break; case 248:return "&oslash;"; break; case 245:return "&otilde;"; break;case 246:return "&ouml;"; break; case 223:return "&szlig;"; break; case 254:return "&thorn;"; break; case 250:return "&uacute;"; break; case 251:return "&ucirc;"; break; case 249:return "&ugrave;"; break; case 252:return "&uuml;"; break; case 253:return "&yacute;"; break; case 255:return "&yuml;"; break;case 162:return "&cent;"; break; case '\r': break;default:found=false;break;}if(!found){if(thechar>127) {var c=thechar;var a4=c%16;c=Math.floor(c/16); var a3=c%16;c=Math.floor(c/16);var a2=c%16;c=Math.floor(c/16);var a1=c%16;return "&#x"+hex[a1]+hex[a2]+hex[a3]+hex[a4]+";";        }else{return original;}}    }
}

Test

<button onclick='alert("1\x29\x3balert\x282\u54c8\u54c8\x29")'>测试JavaScriptEncode值</button>
<div>&lt;script&gt;alert('1哈哈'&nbsp;/);&lt;/script&gt;</div>

这些编码后的内容都能在页面上显示正常。

番外

还有人弄了简单HtmlEncode,有两种方式。

1. 用浏览器内部转换器实现html转码(但我觉得这种方式有风险的,因为内部转换器可能有漏洞)。

2. 只转一部分html字符(这种方式不完整)。

var HtmlUtil = {htmlEncode:function (html){var temp = document.createElement ("div");(temp.textContent != undefined ) ? (temp.textContent = html) : (temp.innerText = html);var output = temp.innerHTML;temp = null;return output;},htmlDecode:function (text){var temp = document.createElement("div");temp.innerHTML = text;var output = temp.innerText || temp.textContent;temp = null;return output;},htmlEncodeByRegExp:function (str){var s = "";if(str.length == 0) return "";s = str.replace(/&/g,"&amp;");s = s.replace(/</g,"&lt;");s = s.replace(/>/g,"&gt;");s = s.replace(/ /g,"&nbsp;");s = s.replace(/\'/g,"'");s = s.replace(/\"/g,"&quot;");return s;},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(/'/g,"\'");s = s.replace(/&quot;/g,"\"");return s;}
};

转自:http://www.cnblogs.com/lovesong/p/5211667.html

javascript Encode、htmlEncode 防止xss相关推荐

  1. 使用encode方法防止XSS攻击

    防御XSS攻击-encode用户输入内容的重要性 一.什么是xss 跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS) ...

  2. JavaScript encode

    javascript中存在几种对URL字符串进行编码的方法:escape(),encodeURI(),以及encodeURIComponent().这几种编码所起的作用各不相同. escape() 方 ...

  3. html使用js的变量_JS变异小技巧:使用JavaScript全局变量绕过XSS过滤器

    什么是JavaScript全局变量? JavaScript全局变量在函数外部声明或使用window对象声明,它可以通过任何函数访问. 假设你的目标Web应用程序容易受到映射到JavaScript字符串 ...

  4. JS变异小技巧:使用JavaScript全局变量绕过XSS过滤器

    什么是JavaScript全局变量? JavaScript全局变量在函数外部声明或使用window对象声明,它可以通过任何函数访问. 假设你的目标Web应用程序容易受到映射到JavaScript字符串 ...

  5. 前端Hack之XSS攻击个人学习笔记

    简单概述 **        此篇系本人两周来学习XSS的一份个人总结,实质上应该是一份笔记,方便自己日后重新回来复习,文中涉及到的文章我都会在末尾尽可能地添加上,此次总结是我在学习过程中所写,如有任 ...

  6. XSS与字符编码的那些事儿

    目录 0x00:基本介绍 0x01:html实体编码 0x02:新增的实体编码 实体编码变异以及浏览器的某些工作原理! 0x03:javascript编码 0x04:base64编码 0x05:闲扯 ...

  7. 网络安全必学知识点之XSS漏洞

    xss漏洞小结 一.初识XSS 1.什么是XSS XSS全称跨站脚本(Cross Site Scripting),为避免与层叠样式表(Cascading Style Sheets, CSS)的缩写混淆 ...

  8. 渗透测试 ( 0 ) --- XSS、CSRF、文件上传、文件包含、反序列化漏洞

    漏洞数据库:https://www.exploit-db.com/google-hacking-database 1.渗透测试 实用 浏览器插件 chrome.edge 插件:搜索 cookie,安装 ...

  9. Ajax hacking with XSS

    为 什么在Ajax hacking中使用XSS?它与传统的XSS又有什么区别?它们各有怎么样的利弊端?大型网站的所 谓XSS漏洞是否为鸡肋?下面我们一起来详细分析下. Ajax hacking Aja ...

最新文章

  1. 中秋祝福网页制作_中秋节祝福语不知怎么写?这3个小程序让你的祝福更精美...
  2. Grafana文档(升级Grafana)
  3. CSDN博客越来越垃圾了,到处放广告
  4. Python imp模块 实际使用中的坑
  5. aspx网页背景图片设置代码_python requests,BeautifulSoup批量下载360图片
  6. v-for中用elementUI实现分页
  7. STM32烧录HEX、BIN文件,使用ST-LINK
  8. TensorFlow Lite 实现首次移植到 Arduino!
  9. 常用的流式布局FlowLayout
  10. Transact-SQL 存储过程(c#调用执行)
  11. doubango TURN Data Indication报文代码
  12. live2d动态壁纸android,Live2DViewerEX动态壁纸
  13. cmpp具体java实例_cmpp3.0_JAVA_实现 - 源码下载|Windows编程|源代码 - 源码中国
  14. 中青杯数学建模竞赛是什么级别的比赛_2020年第三届中青杯全国大学生数学建模竞赛...
  15. Android多点触摸的判断
  16. 前端开发SEO搜索引擎优化方案
  17. linux清理缓存和垃圾,CentOS等Linux系统如何清理系统垃圾和日志?
  18. BPDU网桥协议数据单元和STP生成树协议
  19. 第13届蓝桥杯省赛真题剖析-2022年4月17日Scratch编程初中级组
  20. 速写在网站建设中的重要地位

热门文章

  1. Android 11.0 系统默认授予app安装权限(去掉app首次运行时权限授权弹窗)
  2. word怎么删除空白页?
  3. php实现摇一摇点名程序
  4. 虚拟机自动锁屏时间太短,总是要输入密码太麻烦了
  5. 魔域暗黑龙骑怎么显示连接服务器错误,魔域详细数据 证明暗黑龙骑为史上最强职业...
  6. 最小二乘法-回归实操
  7. 39 | MySQL的id自增主键一定都是连续的?(写的不错~)
  8. Linux文件复制命令cp
  9. 初学pyhon的几个练习小程序
  10. 安装Pycharm和Anaconda出现failed to create anacoda menue的解决办法