Прагматически это хороший подход.Теоретически (не уверен, является ли это актуальным или нет, например, может предоставить уязвимости), его можно очень легко подделать.Я полагаю, это зависит от вашего контекста, насколько это уместно.
Вот немного более сильная идея:
if (chrome &&
chrome.windows &&
chrome.windows.get &&
typeof chrome.windows.get === 'function' &&
chrome.windows.get.toString() === 'function get() { [native code] }')
Идея такая же, как у вас, хотя она немного сильнее, так как AFAIK имеетobject является функцией, и его значение toString()
иметь это значение невозможно, так как это недопустимый синтаксис, поэтому даже попытка подделать это значение не сработает, если вы не измените собственный код (который требует совершенно другого уровня хакера).
Не запомните, если проверка таких вещей требует разрешений или нет, но идея ясна, надеюсь.
ОБНОВЛЕНИЕ
Я простоПонял, что идею синтаксиса «нативного кода» можно обмануть, создав псевдоним существующей функции.Например,
var FakeFn = Object.create;
FakeFn.toString(); // "function create() { [native code] }"
Но об этом можно позаботиться, тщательно выбрав, какую функцию мы используем, поскольку имя появляется в строке.get
, вероятно, слишком распространено, но если мы возьмем непонятное имя функции (например, captureVisibleTab
из chrome.tabs.captureVisibleTab
), которое реализовано только в расширениях Chrome, это все еще очень переносимое решение, потому что в отличие от базовой проверки, где код можетбыть обманутым другим локальным пользовательским кодом, заранее известно, что браузеры не реализуют никаких собственных функций с этим именем, поэтому он по-прежнему безопасен во всех браузерах и со всем пользовательским кодом.
ОБНОВЛЕНИЕ
Как указывал @Mathew, эта идея глупа (хотя, по-видимому, только злонамеренно).Я думал, что смогу исправить проблему, сравнивая с Function.prototype.toString
, но решил, что даже это можно обмануть, наложив псевдоним на оригинальный метод toString
и создав новый, который для определенных функций возвращает ложные строки, а для других возвращает исходную строку.
В заключение, моя идея немного сильнее оригинальной, так как она исключает практически все шансы непреднамеренного столкновения (чуть больше, чем идея ОП), но, безусловно, не защищает от злонамеренной атаки, как я вначаледумал, что это может быть.