務實,這是一個很好的方法。理論上(不確定這是否相關,例如可能會提供漏洞),它可能很容易被欺騙。我想這取決於你的背景是多麼相關。
這裏的一個略強的想法:
if (chrome &&
chrome.windows &&
chrome.windows.get &&
typeof chrome.windows.get === 'function' &&
chrome.windows.get.toString() === 'function get() { [native code] }')
的想法是你的一樣,雖然它的稍強,因爲AFAIK具有對象是一個函數,並具有它的toString()
值具有值是不可能的,因爲它是無效的語法,因此即使試圖欺騙該值也不會工作,除非您更改了本機代碼(這需要完全不同級別的黑客)。
不要手邊記住,如果檢查這樣的事情需要權限或不,但這個想法是明確的,我希望。
UPDATE
我只是意識到了「原生代碼」語法的想法可以通過混淆現有的功能所迷惑。例如。
var FakeFn = Object.create;
FakeFn.toString(); // "function create() { [native code] }"
但是,可以通過仔細選擇我們使用的函數來處理,因爲名稱出現在字符串中。 get
可能太常見了,但如果我們使用一個模糊的函數名稱(如的captureVisibleTab
)僅在chrome擴展中實現,它仍然是一個非常便攜的解決方案,因爲與其他本地用戶可能欺騙代碼的基本檢查不同代碼,事先知道瀏覽器不會使用這個名稱實現任何原生函數,所以它在所有瀏覽器和所有用戶代碼中都是安全的。
UPDATE
由於@Mathew指出,這種想法是foolable(雖然看似只有惡意)。我認爲我可以通過比較Function.prototype.toString
來修補問題,但認爲即使是這樣也可以通過假冒原始toString
方法並創建一個新方法來欺騙某些函數返回假字符串,併爲其他字符返回原始字符串。總之,我的想法比原來稍微強一點,因爲它幾乎可以排除所有意外碰撞的機會(稍微超過OP的想法),但當然不能防禦惡意攻擊,正如我第一次想到的那樣有可能。
You co儘管檢查擴展狀態並不是它的預期目的:http://code.google.com/chrome/extensions/i18n.html –