上次介紹了 HTML TextField 神奇之處
這次來介紹它衍伸出來的執行期型別檢查漏洞吧
東西作的太神奇,通常也越容易產生定義衝突與漏洞
像是 TextField 內可以再放 TextField, MovieClip, Sprite, 甚至 Video....
這些類別都屬於 DisplayObject,具有一個型別為 DisplayObjectContainer 的 parent 成員
咦? 這些東西不是放在 TextField 內嗎? TextField 根本不是一個 DisplayObjectContainer
那對 TextField 內的 DisplayObject 取用 parent 會怎樣呢?
實際來測試看看
package {
import flash.display.DisplayObjectContainer;
import flash.display.MovieClip;
import flash.text.TextField;
[SWF(width="300", height="200", backgroundColor="#FFFFFF")]
public class main extends MovieClip {
public function main() {
var txt:TextField = new TextField();
txt.border = true;
txt.x = 100;
txt.y = 50;
this.addChild(txt);
txt.htmlText = "Ticore's Blog<img id='img' src='flash.display.MovieClip' />";
var mc:MovieClip = txt.getImageReference('img') as MovieClip;
trace(mc); // [object MovieClip]
if (mc != null) {
var mcParent:DisplayObjectContainer = mc.parent;
trace(mcParent); // [object TextField]
trace(mcParent is DisplayObjectContainer); // false
trace(mcParent as DisplayObjectContainer); // null
}
}
}
}
// Ticore's Blog - http://ticore.blogspot.com/
由測試程式可以發現,TextField 內的 DisplayObject.parent 居然可以逃過 AS3 的型別檢查
將 TextField 指定到一個 DisplayObjectContainer 變數上
假如再次對該變數作 is 或是 as 運算就破功了~
































