久々に、泣きそうになった話題
Webアプリの案件で、環境によって正常に機能したりしなかったりという状況が発生した。
IE6,7、FireFox2,3など様々な環境で動作確認するのだが、なんとも再現性がない。
正常に動作する場合としない場合で、HTMLソースを見比べていたら、うまく行かない場合のソースコードには、妙なスクリプトが挿入されていることに気づく。
これがキーになって、原因が判明した。
なんと、
「クライアントファイアウォールの広告ブロック機能が、ソースコードを改ざんする」
という驚くべき動作をしているのであった。
「全然知らなかったよ!」
IE6とNortonInternetSecurity(SymantecClientSecurity)の広告ブロックの組み合わせで発症する。
改ざんの内容は、window.Openやonload、onunloadイベントの抑止。
ページ先頭とページ後半にJavascriptを挿入してくれる。これがまた、prototype.jsなどでXMLHttpRequestを使っている場合にも挿入されるとのことなので、恐ろしい。デバッグでもエラーを特定できない。
広告ブロックを無効にして、ブラウザのキャッシュをすべてクリアしてから、改めてアクセスし直したら治った。
■ページの先頭に挿入されるスクリプト
<script language="JavaScript">
<!--
function SymError()
{
return true;
}
window.onerror = SymError;
var SymRealWinOpen = window.open;
function SymWinOpen(url, name, attributes)
{
return (new Object());
}
window.open = SymWinOpen;
//-->
</script>
■ページ後半に挿入されるスクリプト
<script language="JavaScript">
<!--
var SymRealOnLoad;
var SymRealOnUnload;
function SymOnUnload()
{
window.open = SymWinOpen;
if(SymRealOnUnload != null)
SymRealOnUnload();
}
function SymOnLoad()
{
if(SymRealOnLoad != null)
SymRealOnLoad();
window.open = SymRealWinOpen;
SymRealOnUnload = window.onunload;
window.onunload = SymOnUnload;
}
SymRealOnLoad = window.onload;
window.onload = SymOnLoad;
//-->
</script>
■参考URL
IE6+evalScripts+ノートン先生バグメモ
※IE6でprototype.jsびevalScripts()を呼び出しているとダメとの情報。助かりました。ホント