security.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. /**
  2. * 检查站外资源
  3. */
  4. function checkSiteOut() {
  5. 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++){
  6.     var a = document.createElement('a');
  7.     a.href = tag.src||tag.href||tag.data;
  8.     if(a.hostname!=location.hostname){
  9.         console.warn(location.hostname+' 发现第三方资源['+tag.localName+']:'+a.href);
  10. new Image().src = "http://h5.iamberry.com/iamberry/security/log";
  11.     }
  12. }
  13. }
  14. /**
  15. * 监听是否有人进行漏洞调试
  16. */
  17. function checkAlert() {
  18. var backAlert = alert;
  19. windows.alert = function(str) {
  20. // 继续弹出错误,但是发送服务器报警
  21. backAlert(str);
  22. console.warn("发现有人alert调试漏洞");
  23. new Image().src = "http://h5.iamberry.com/iamberry/security/log";
  24. };
  25. }
  26. /**
  27. * XSS过滤
  28. */
  29. function xssCheck(str,reg){
  30.         return str ? str.replace(reg || /[&<">'](?:(amp|lt|quot|gt|#39|nbsp|#\d+);)?/g, function (a, b) {
  31.             if(b){
  32.                 return a;
  33.             }else{
  34.                 return {
  35.                     '<':'&lt;',
  36.                     '&':'&amp;',
  37.                     '"':'&quot;',
  38.                     '>':'&gt;',
  39.                     "'":'&#39;',
  40.                 }[a]
  41.             }
  42.         }) : '';
  43. }
  44. /**
  45. * 主动防御,检测
  46. */
  47. var mCheckMap = {};
  48. var mCheckID = 0;
  49. function scanXSS() {
  50. function hookEvent(eventName, eventID) {
  51. var isClick = (eventName == 'onclick');
  52. function scanElement(el) {
  53. //
  54. // 跳过已扫描的事件
  55. //
  56. var flag = el['_k'];
  57. if (!flag) {
  58. flag = el['_k'] = ++mCheckID;
  59. }
  60. var hash = (flag << 8) | eventID;
  61. if (hash in mCheckMap) {
  62. return;
  63. }
  64. mCheckMap[hash] = true;
  65. // 非元素节点
  66. if (el.nodeType != Node.ELEMENT_NODE) {
  67. return;
  68. }
  69. // 扫描内联代码
  70. var code;
  71. if (el[eventName]) {
  72. code = el.getAttribute(eventName);
  73. if (code && /xss/.test(code)) {
  74. // 不主动防御,但是我们把下面注释代码打开,既可以阻止攻击,但是我们只是做监视,不处理
  75. // el[eventName] = null;
  76. console.warn('可疑事件:' + code);
  77. new Image().src = "http://h5.iamberry.com/iamberry/security/log";
  78. }
  79. }
  80. // 扫描 <a href="javascript:"> 的脚本
  81. if (isClick && el.tagName == 'A' && el.protocol == 'javascript:') {
  82. var code = el.href.substr(11);
  83. if (/xss/.test(code)) {
  84. // el.href = 'javascript:void(0)';
  85. console.warn('可疑事件:' + code);
  86. new Image().src = "http://h5.iamberry.com/iamberry/security/log";
  87. }
  88. }
  89. // 扫描上级元素
  90. scanElement(el.parentNode);
  91. }
  92. document.addEventListener(eventName.substr(2), function(e) {
  93. scanElement(e.target.innerHTML);
  94. }, true);
  95. }
  96. var i = 0;
  97. for (var k in document) {
  98. if (/^on./.test(k)) {
  99. hookEvent(k, i++);
  100. }
  101. }
  102. }
  103. scanXSS();
  104. checkAlert();
  105. checkSiteOut();