123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- /**
- * 检查站外资源
- */
- function checkSiteOut() {
- for(var i=0,tags=document.querySelectorAll('iframe[src],frame[src],script[src],link[rel=stylesheet],object[data],embed[src]'),tag;tag=tags[i];i++){
- var a = document.createElement('a');
- a.href = tag.src||tag.href||tag.data;
- if(a.hostname!=location.hostname){
- console.warn(location.hostname+' 发现第三方资源['+tag.localName+']:'+a.href);
- new Image().src = "http://h5.iamberry.com/iamberry/security/log";
- }
- }
- }
- /**
- * 监听是否有人进行漏洞调试
- */
- function checkAlert() {
- var backAlert = alert;
- windows.alert = function(str) {
- // 继续弹出错误,但是发送服务器报警
- backAlert(str);
- console.warn("发现有人alert调试漏洞");
- new Image().src = "http://h5.iamberry.com/iamberry/security/log";
- };
- }
- /**
- * XSS过滤
- */
- function xssCheck(str,reg){
- return str ? str.replace(reg || /[&<">'](?:(amp|lt|quot|gt|#39|nbsp|#\d+);)?/g, function (a, b) {
- if(b){
- return a;
- }else{
- return {
- '<':'<',
- '&':'&',
- '"':'"',
- '>':'>',
- "'":''',
- }[a]
- }
- }) : '';
- }
- /**
- * 主动防御,检测
- */
- var mCheckMap = {};
- var mCheckID = 0;
- function scanXSS() {
- function hookEvent(eventName, eventID) {
- var isClick = (eventName == 'onclick');
- function scanElement(el) {
- //
- // 跳过已扫描的事件
- //
- var flag = el['_k'];
- if (!flag) {
- flag = el['_k'] = ++mCheckID;
- }
- var hash = (flag << 8) | eventID;
- if (hash in mCheckMap) {
- return;
- }
- mCheckMap[hash] = true;
- // 非元素节点
- if (el.nodeType != Node.ELEMENT_NODE) {
- return;
- }
- // 扫描内联代码
- var code;
- if (el[eventName]) {
- code = el.getAttribute(eventName);
- if (code && /xss/.test(code)) {
- // 不主动防御,但是我们把下面注释代码打开,既可以阻止攻击,但是我们只是做监视,不处理
- // el[eventName] = null;
- console.warn('可疑事件:' + code);
- new Image().src = "http://h5.iamberry.com/iamberry/security/log";
- }
- }
- // 扫描 <a href="javascript:"> 的脚本
- if (isClick && el.tagName == 'A' && el.protocol == 'javascript:') {
- var code = el.href.substr(11);
- if (/xss/.test(code)) {
- // el.href = 'javascript:void(0)';
- console.warn('可疑事件:' + code);
- new Image().src = "http://h5.iamberry.com/iamberry/security/log";
- }
- }
- // 扫描上级元素
- scanElement(el.parentNode);
- }
- document.addEventListener(eventName.substr(2), function(e) {
- scanElement(e.target.innerHTML);
- }, true);
- }
- var i = 0;
- for (var k in document) {
- if (/^on./.test(k)) {
- hookEvent(k, i++);
- }
- }
- }
- scanXSS();
- checkAlert();
- checkSiteOut();
|