У меня есть сценарий, который обнаруживает ошибки Javascript на моем веб-сайте и отправляет их на мой сервер для сообщения:
<script> window.onerror = function(msg, url, line, col, error){ msg = msg || ''; url = url || ''; line = parseInt(line || 0); // Note that col & error are new to the HTML 5 spec and may not be supported in every browser. col = parseInt(col || 0); error = error || ''; try { // Ajax Request for IE 5.5+, Firefox, Opera, Chrome, Safari XHR object var x = new (this.XMLHttpRequest || ActiveXObject)('MSXML2.XMLHTTP.3.0'); x.open('POST', '/log.php', 1); x.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); x.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); x.send('msg='+encodeURIComponent(msg)+'&url='+encodeURIComponent(url)+'&line='+line+'&col='+col+'&error='+encodeURIComponent(error)); x.onreadystatechange = function() { if( (x.readyState > 3) && (x.status > 0 && x.status < 400)) window.console && console.log(x.responseText); }; } catch(e) { window.console && console.log(e); } return true; }; </script>
У меня есть серверный php-скрипт, который будет прослушивать запрос Ajax и записывать файл журнала
<?php if( $handle = fopen('log.txt', 'a') ) { $log = date('d/m/YH:i:s').PHP_EOL; if( isset($_REQUEST['msg']) ) $log .= 'msg:'.$_REQUEST['msg'].PHP_EOL; if( isset($_REQUEST['url']) ) $log .= 'url:'.$_REQUEST['url'].PHP_EOL; if( isset($_REQUEST['line']) ) $log .= 'line:'.$_REQUEST['line'].PHP_EOL; if( isset($_REQUEST['col']) ) $log .= 'col:'.$_REQUEST['col'].PHP_EOL; if( isset($_REQUEST['error']) ) $log .= 'error:'.$_REQUEST['error'].PHP_EOL; $log .= '---------------------------------------------'.PHP_EOL; fwrite($handle, $log); fclose($handle); echo 1; } else { echo 0; }
если на странице возникает исключение javascript, например:
<script> call_undefined_function(); </script>
записать в файл журнала …
25/10/2014 11:31:08 msg:ReferenceError: call_undefined_function is not defined url:http://www.test.it/ line:46 col:1 error:ReferenceError: call_undefined_function is not defined ---------------------------------------------
Все работает хорошо!
Но , я нахожу много журналов, поднятых плагинами, панелями инструментов, червями или расширениями браузера, используемыми пользователями …
например
24/10/2014 10:20:32 msg:Unsafe JavaScript attempt to access frame url: http://ads.XXXXXX.net/?XXXXXX line:0 col:0 error:Unsafe JavaScript attempt to access frame ---------------------------------------------
Очевидно, что этот сценарий не мой сайт и некоторые исследования, которые я нашел червем интернет-исследователя
мои вопросы: как я могу ограничить журналы своим собственным скриптом?
Вы всегда можете проверить URL:
// If the script is not being loaded from my domain if(url.indexOf('http://mydomain') == -1) { // Allow the error to propagate normally return false; }
Это может быть неэффективно, однако, если какая-либо третья сторона вводит встроенные скрипты, а не внешние.