务实,这是一个很好的方法。理论上(不确定这是否相关,例如可能会提供漏洞),它可能很容易被欺骗。我想这取决于你的背景是多么相关。
这里的一个略强的想法:
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 –