一个前端DOMXSS过滤器
时间:2022-07-26
本文章向大家介绍一个前端DOMXSS过滤器,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
最近热衷于刷twitter,各种大牛的东西让我应接不暇,感觉确实新有干货,前几天看到Yosuke发状态了:
是发的一个DOMParser处理、过滤html的小程序。想想觉得还是挺新颖的,以前自己也做了一个XssHtml过滤类(http://phith0n.github.io/XssHtml/),但都是基于后端语言的,不能处理前端比如DOMXSS。
看了他的代码感觉挺好的,思路也是基于白名单的过滤机制,将允许存在的标签和属性列在javascript对象中,遍历DOM后将允许的标签和属性保留,不允许的丢弃。
我改了改,加了点过滤,做了个类,代码如下:
function Jsdxss(allows){
this.allows = allows || {
"a" : [ "title", "ping", "href", "class", "target", "style" ],
"b" : [ "class", "style" ],
"img" : [ "src", "class", "style" ],
"div" : [ "class", "style"],
"p" : ["class", "style"]
}
var buildNodes = function( node ){
var i, newNode, attributes, child;
switch( node.nodeType ){
case 1: // ELEMENT_NODE
attributes = allows[ node.tagName.toLowerCase() ];
if( attributes === undefined ) return undefined;
newNode = document.createElement( node.tagName );
for( i = 0; i < node.attributes.length; i++ ){
if( attributes.indexOf( node.attributes[ i ].name ) != -1 ){
switch(node.attributes[ i ].name){
case "href": node.attributes[ i ] = _deal_href(node.attributes[ i ]);break;
case "style": node.attributes[ i ] = _deal_style(node.attributes[ i ]);break;
}
newNode.setAttribute( node.attributes[ i ].name, node.attributes[ i ].value );
}
}
for( i = 0; i < node.childNodes.length; i++ ){
child = buildNodes( node.childNodes[ i ] );
if( child !== undefined ){
newNode.appendChild( child );
}
}
return newNode;
case 3: // TEXT_NODE
return document.createTextNode( node.textContent );
default:
return undefined;
}
}
var _deal_href = function(attr){
var href = attr.value;
if (href.indexOf("http://") === 0 || href.indexOf("http://") === 0) {
attr.value = href;
}else{
attr.value = "http://" + href;
}
return attr;
}
var _deal_style = function(attr){
var style = attr.value;
var re = /expression/gim
style = style.replace(/\/g, ' ').replace(/&#/g, ' ').replace(//*/g, ' ').replace(/*//g, ' ');
attr.value = style.replace(re, ' ');
return attr;
}
this.filter = function(html, target){
try{
var parser = new DOMParser();
var newDoc = parser.parseFromString( html, "text/html" );
}catch(e){
var doc = new ActiveXObject ("MSXML2.DOMDocument");
var newDoc = doc.loadXML(html);
}
var newBody = newDoc.body;
var target = document.getElementById( target );
var i, childeNode;
target.innerHTML = "";
for( i = 0; i < newBody.childNodes.length; i++ ){
childNode = buildNodes( newBody.childNodes[ i ] );
if( childNode !== undefined ){
target.appendChild( childNode );
}
}
}
}
使用方法:
var html = "HTML CODE";
(new Jsdxss()).filter(html, "target");
运行完成后会将过滤后的代码输出在id为target的元素中。
github:https://github.com/phith0n/Jsdxss
大家可以在这个页面测试:http://phith0n.github.io/Jsdxss/test.html
- Java中的宏变量,宏替换详解。
- 类、变量、块、构造器、继承初始化顺序,终极解答。
- Spring Boot Debug调试
- Maven精选系列--classifier元素妙用
- PostgreSQL里面的一些命令小结
- Java中创建String的两道面试题及详解
- PostgreSQL主备环境搭建
- Tomcat集群session复制与Oracle的坑。。
- 用Keras+TensorFlow,实现ImageNet数据集日常对象的识别
- JavaWeb项目架构之Elasticsearch日志处理系统
- 分布式服务防雪崩熔断器,Hystrix理论+实战。
- JavaWeb项目架构之Kafka分布式日志队列
- 如何让Git记住用户名和密码
- 金融系统中正确的金额计算及存储方式
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Laravel框架实现抢红包功能示例
- Laravel5.1 框架模型创建与使用方法实例分析
- php实现单笔转账到支付宝功能
- PHP发送邮件确认验证注册功能示例【修改别人邮件类】
- PHP实现微信退款功能
- 从零开始玩转PerfDogService---------初探篇
- php+laravel依赖注入知识点总结
- PHP获取当前系统时间的办法小结
- Laravel 中使用简单的方法跟踪用户是否在线(推荐)
- 浅析php怎么实现爬取数据原理
- 在 Laravel 中动态隐藏 API 字段的方法
- php 与 nginx 的处理方式及nginx与php-fpm通信的两种方式
- Thinkphp 5.0实现微信企业付款到零钱
- 实现php删除链表中重复的结点
- YII分模块加载路由的实现办法