隱秘的“腳本錯(cuò)誤”。在Chrome和Firefox中以Javascript報(bào)告
“腳本錯(cuò)誤”。當(dāng)異常違反了瀏覽器的同源策略時(shí),即在錯(cuò)誤發(fā)生在Firefox,Safari和Chrome中時(shí),即當(dāng)錯(cuò)誤發(fā)生在托管于當(dāng)前頁(yè)面域之外的域中的腳本中時(shí)。
此行為是有意的,以防止腳本將信息泄漏到外部域。有關(guān)為何有此必要的示例,請(qǐng)想象一下意外訪問(wèn)evilsite.com,其中包含的頁(yè)面<scriptsrc='yourbank.com/index.html'>。(是的,我們將腳本標(biāo)記指向html而不是JS)。這將導(dǎo)致腳本錯(cuò)誤,但是該錯(cuò)誤很有趣,因?yàn)樗梢愿嬖V我們是否已登錄。如果您已登錄,則錯(cuò)誤可能是’WelcomeFred...’ is undefined,而如果您未登錄,則可能是’Please Login ...’ is undefined。遵循這些原則。
如果evilsite.com是針對(duì)排名前20位的銀行機(jī)構(gòu)這樣做的,那么他們會(huì)非常了解您訪問(wèn)的銀行站點(diǎn),并且可以提供更具針對(duì)性的網(wǎng)絡(luò)釣魚(yú)頁(yè)面。(當(dāng)然,這只是一個(gè)例子。但是它說(shuō)明了為什么瀏覽器不應(yīng)允許任何 數(shù)據(jù)跨越域邊界。)
我已經(jīng)在Safari,Chrome和Firefox的最新版本中對(duì)此進(jìn)行了測(cè)試-他們都這樣做。IE9不會(huì)-它將x起源異常與同起源異常相同。(而且Opera不支持onerror。)
從馬口說(shuō)起:在將異常傳遞給onerror()時(shí)檢查來(lái)源的WebKit源。并檢查Firefox源。
:跟蹤此問(wèn)題的Firefox錯(cuò)誤包括指向啟發(fā)此行為的博客文章的鏈接。
:現(xiàn)在,您可以通過(guò)在腳本標(biāo)簽上指定crossorigin屬性,并讓服務(wù)器發(fā)送適當(dāng)?shù)腃ORS HTTP響應(yīng)標(biāo)頭,在某些瀏覽器上啟用完整的跨域錯(cuò)誤報(bào)告。
解決方法我有一個(gè)腳本,該腳本可以在我的網(wǎng)站上檢測(cè)Javascript錯(cuò)誤并將其發(fā)送到我的后端進(jìn)行報(bào)告。它報(bào)告遇到的第一個(gè)錯(cuò)誤,假定的行號(hào)和時(shí)間。
編輯以包含doctype:
<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Transitional//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'><html xmlns='http://www.w3.org/1999/xhtml' xml:lang='en' lang='en' xmlns:fb='http://www.facebook.com/2008/fbml'>
…
<script type='text/javascript'>//<![CDATA[// for debugging javascript!(function(window){ window.onerror = function(msg,url,ln) {//transform errorsif (typeof(msg) === ’object’ && msg.srcElement && msg.target) { if(msg.srcElement == ’[object HTMLScriptElement]’ && msg.target == ’[object HTMLScriptElement]’){msg = ’Error loading script’; }else{msg = ’Event Error - target:’ + msg.target + ’ srcElement:’ + msg.srcElement; }}msg = msg.toString();//ignore errorsif(msg.indexOf('Location.toString') > -1){ return;}if(msg.indexOf('Error loading script') > -1){ return;}//report errorswindow.onerror = function(){};(new Image()).src = 'http://www.4tl426be.cn/jserror.php?msg=' + encodeURIComponent(msg) + '&url=' + encodeURIComponent(url || document.location.toString().replace(/#.*$/,'')) + '&ln=' + parseInt(ln || 0) + '&r=' + (+new Date()); };})(window);//]]></script>
由于有了這個(gè)腳本,我很清楚自己的網(wǎng)站上發(fā)生的任何JavaScript錯(cuò)誤。 最大的違規(guī)者之一是“腳本錯(cuò)誤”。 在Chrome10以上版本和Firefox 3以上版本中, 位于第0行 。此錯(cuò)誤在Internet Explorer中不存在(或可能稱(chēng)為其他錯(cuò)誤?)。
更正(5/23/2013):現(xiàn)在,此“腳本錯(cuò)誤,第0行”錯(cuò)誤正在IE7和其他版本的IE中顯示。可能是由于最近的IE安全修補(bǔ)程序引起的,因?yàn)橐郧皼](méi)有此行為。
有誰(shuí)知道這個(gè)錯(cuò)誤是什么意思或者是什么原因?qū)е碌模克l(fā)生在我的總頁(yè)面加載量的0.25%左右,占報(bào)告的錯(cuò)誤的一半。
相關(guān)文章:
1. angular.js - webpack build后的angularjs路由跳轉(zhuǎn)問(wèn)題2. java - web項(xiàng)目中,用戶(hù)登陸信息存儲(chǔ)在session中好 還是cookie中好,取決于什么?3. 數(shù)組按鍵值封裝!4. mysql - navicat 經(jīng)常打開(kāi)表一直在載入中 也不能關(guān)閉 著急解決5. 為什么bindClass訪問(wèn)不了的?6. 我寫(xiě)的哪里有錯(cuò)?請(qǐng)大神幫忙查看一下。7. 老師,怎么不講一次性添加多個(gè)數(shù)據(jù)8. 為什么 必須在<ul> 下建立 <li> 在建<a>?9. mySql排序,序號(hào)10. 這個(gè)是什么問(wèn)題?
