javascript Encode、htmlEncode 防止xss
在数据添加到DOM时候,我们可以需要对内容进行HtmlEncode或JavaScriptEncode,以预防XSS攻击。
JavaScriptEncode
使用“\”对特殊字符进行转义,除数字字母之外,小于127的字符编码使用16进制“\xHH”的方式进行编码,大于用unicode(非常严格模式)。
![](/assets/blank.gif)
//使用“\”对特殊字符进行转义,除数字字母之外,小于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; }
![](/assets/blank.gif)
HtmlEncode
将字符转换成HTMLEntites,以对抗XSS。
![](/assets/blank.gif)
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 " "; break; //spacecase 34:return """; break; //"case 38:return "&"; break; //&case 39:return "'"; break; //'case 47:return "/"; break; // /case 60:return "<"; break; //<case 62:return ">"; break; //>case 198:return "Æ"; break;case 193:return "Á"; break;case 194:return "Â"; break; case 192:return "À"; break; case 197:return "Å"; break; case 195:return "Ã"; break; case 196:return "Ä"; break; case 199:return "Ç"; break; case 208:return "Ð"; break;case 201:return "É"; break; case 202:return "Ê"; break; case 200:return "È"; break; case 203:return "Ë"; break;case 205:return "Í"; break;case 206:return "Î"; break; case 204:return "Ì"; break; case 207:return "Ï"; break;case 209:return "Ñ"; break; case 211:return "Ó"; break;case 212:return "Ô"; break; case 210:return "Ò"; break; case 216:return "Ø"; break; case 213:return "Õ"; break; case 214:return "Ö"; break;case 222:return "Þ"; break; case 218:return "Ú"; break; case 219:return "Û"; break; case 217:return "Ù"; break; case 220:return "Ü"; break; case 221:return "Ý"; break;case 225:return "á"; break; case 226:return "â"; break; case 230:return "æ"; break; case 224:return "à"; break; case 229:return "å"; break; case 227:return "ã"; break; case 228:return "ä"; break; case 231:return "ç"; break; case 233:return "é"; break;case 234:return "ê"; break; case 232:return "è"; break; case 240:return "ð"; break; case 235:return "ë"; break; case 237:return "í"; break; case 238:return "î"; break; case 236:return "ì"; break; case 239:return "ï"; break; case 241:return "ñ"; break; case 243:return "ó"; break;case 244:return "ô"; break; case 242:return "ò"; break; case 248:return "ø"; break; case 245:return "õ"; break;case 246:return "ö"; break; case 223:return "ß"; break; case 254:return "þ"; break; case 250:return "ú"; break; case 251:return "û"; break; case 249:return "ù"; break; case 252:return "ü"; break; case 253:return "ý"; break; case 255:return "ÿ"; break;case 162:return "¢"; 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;}} } }
![](/assets/blank.gif)
Test
<button onclick='alert("1\x29\x3balert\x282\u54c8\u54c8\x29")'>测试JavaScriptEncode值</button> <div><script>alert('1哈哈' /);</script></div>
这些编码后的内容都能在页面上显示正常。
番外
还有人弄了简单HtmlEncode,有两种方式。
1. 用浏览器内部转换器实现html转码(但我觉得这种方式有风险的,因为内部转换器可能有漏洞)。
2. 只转一部分html字符(这种方式不完整)。
![](/assets/blank.gif)
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,"&");s = s.replace(/</g,"<");s = s.replace(/>/g,">");s = s.replace(/ /g," ");s = s.replace(/\'/g,"'");s = s.replace(/\"/g,""");return s;},htmlDecodeByRegExp:function (str){var s = "";if(str.length == 0) return "";s = str.replace(/&/g,"&");s = s.replace(/</g,"<");s = s.replace(/>/g,">");s = s.replace(/ /g," ");s = s.replace(/'/g,"\'");s = s.replace(/"/g,"\"");return s;} };
转自:http://www.cnblogs.com/lovesong/p/5211667.html
javascript Encode、htmlEncode 防止xss相关推荐
- 使用encode方法防止XSS攻击
防御XSS攻击-encode用户输入内容的重要性 一.什么是xss 跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS) ...
- JavaScript encode
javascript中存在几种对URL字符串进行编码的方法:escape(),encodeURI(),以及encodeURIComponent().这几种编码所起的作用各不相同. escape() 方 ...
- html使用js的变量_JS变异小技巧:使用JavaScript全局变量绕过XSS过滤器
什么是JavaScript全局变量? JavaScript全局变量在函数外部声明或使用window对象声明,它可以通过任何函数访问. 假设你的目标Web应用程序容易受到映射到JavaScript字符串 ...
- JS变异小技巧:使用JavaScript全局变量绕过XSS过滤器
什么是JavaScript全局变量? JavaScript全局变量在函数外部声明或使用window对象声明,它可以通过任何函数访问. 假设你的目标Web应用程序容易受到映射到JavaScript字符串 ...
- 前端Hack之XSS攻击个人学习笔记
简单概述 ** 此篇系本人两周来学习XSS的一份个人总结,实质上应该是一份笔记,方便自己日后重新回来复习,文中涉及到的文章我都会在末尾尽可能地添加上,此次总结是我在学习过程中所写,如有任 ...
- XSS与字符编码的那些事儿
目录 0x00:基本介绍 0x01:html实体编码 0x02:新增的实体编码 实体编码变异以及浏览器的某些工作原理! 0x03:javascript编码 0x04:base64编码 0x05:闲扯 ...
- 网络安全必学知识点之XSS漏洞
xss漏洞小结 一.初识XSS 1.什么是XSS XSS全称跨站脚本(Cross Site Scripting),为避免与层叠样式表(Cascading Style Sheets, CSS)的缩写混淆 ...
- 渗透测试 ( 0 ) --- XSS、CSRF、文件上传、文件包含、反序列化漏洞
漏洞数据库:https://www.exploit-db.com/google-hacking-database 1.渗透测试 实用 浏览器插件 chrome.edge 插件:搜索 cookie,安装 ...
- Ajax hacking with XSS
为 什么在Ajax hacking中使用XSS?它与传统的XSS又有什么区别?它们各有怎么样的利弊端?大型网站的所 谓XSS漏洞是否为鸡肋?下面我们一起来详细分析下. Ajax hacking Aja ...
最新文章
- 第三节 MemcachedProviders之SesstionStateProvider(关于Session的讨论)
- ESXI | ESXI6.7如何在网页端添加用户并且赋予不同的权限
- 台积电获苹果A10大量订单 三季度销售额将增长20%
- win8下notepad++无法设置文件关联
- 算法基础:最大递减数问题(Golang实现)
- ubutnu16.04安装ros2
- Madplay移植到mini2440开发板【转】
- 连续时间系统与离散时间系统的时域分析对比
- linux5.5 里dns,RedHat 5.5搭建各种DNS服务器(3)
- TodoMVC中的Backbone+MarionetteJS+RequireJS例子源码分析之三 Views
- Linux系统文件误删除恢复方法;宿主机windows与Linux文件共享!
- Java 8 新日期时间 API ( 上 ) – 本地日期时间
- 2005开启服务器文件夹,vss2005图文教你如何安装与配置?
- autocad 如何摆正显示_AutoCAD使用技巧问答
- 关于 DXGI 截图 截屏 获取屏幕
- Vant 3 - 有赞出品的开源移动UI组件库,基于 Vue3 重构发布
- win10如何设置保护色保护眼睛
- 动词的过去式过去分词表
- 计算机系一班班会,天津科技大学计算机学院读书节10102i1班班会.ppt
- navicat导数据速度_快速解决mysql导数据时,格式不对、导入慢、丢数据的问题