Pragmatycznie to dobre podejście. Teoretycznie (nie wiem, czy jest to istotne, czy nie, np. Może zawierać luki), można je bardzo łatwo sfałszować. Przypuszczam, że to zależy od twojego kontekstu, jaki to ma znaczenie.
Oto nieco mocniejszy pomysł:
if (chrome &&
chrome.windows &&
chrome.windows.get &&
typeof chrome.windows.get === 'function' &&
chrome.windows.get.toString() === 'function get() { [native code] }')
Pomysł jest takie same, choć jest nieco silniejszy, ponieważ AFAIK mając obiekt będzie funkcją io to toString()
wartość ma ta wartość jest niemożliwe, ponieważ jest to niepoprawna składnia, więc nawet próba sfałszowania tej wartości nie zadziała, chyba że zmieniono kod natywny (który wymaga zupełnie innego poziomu hakera).
Nie od razu pamiętaj, że sprawdzanie takich rzeczy wymaga uprawnień, ale nie jest to jasne, mam nadzieję.
UPDATE
zdałem sobie sprawę, że "native code" składnia pomysł może się nabrać, przez aliasing istniejącą funkcję. Na przykład.
var FakeFn = Object.create;
FakeFn.toString(); // "function create() { [native code] }"
Ale można to załatwić przez staranny wybór, której funkcji używamy, ponieważ nazwa pojawia się w ciągu znaków. get
jest prawdopodobnie zbyt powszechny, ale jeśli weźmiemy niejasną nazwę funkcji (np. captureVisibleTab
z), która jest zaimplementowana tylko w rozszerzeniach chrome, to nadal jest bardzo przenośnym rozwiązaniem, ponieważ w przeciwieństwie do podstawowego sprawdzenia, gdzie kod może zostać oszukany przez innego użytkownika lokalnego kod, wiadomo z góry, że przeglądarki nie implementują żadnych natywnych funkcji o tej nazwie, więc jest nadal bezpieczny we wszystkich przeglądarkach i ze wszystkimi kodami użytkownika.
UPDATE
Jak @Mathew wskazał, ten pomysł jest foolable (choć pozornie tylko złośliwie). Pomyślałem, że mogę rozwiązać problem przez porównanie z Function.prototype.toString
, ale doszedłem do wniosku, że nawet to można zmylić, aliasingując oryginalną metodę toString
i tworząc nową, która dla pewnych funkcji zwraca fałszywe ciągi, a dla innych zwraca oryginalny ciąg.
Podsumowując, mój pomysł jest nieco silniejszy niż oryginał, ponieważ wyklucza praktycznie wszelką szansę przypadkowego zderzenia (nieco więcej niż idea PO), ale z pewnością nie jest obroną przed złośliwym atakiem, tak jak początkowo sądziłem może być.
You co Staraj się zdobyć umiędzynarodowione łańcuchy, chociaż sprawdzenie statusu rozszerzenia nie jest jego przeznaczeniem: http://code.google.com/chrome/extensions/i18n.html –