Ваш код JavaScript и код JavaScript из какого-либо другого расширения являются одинаковыми - указав, какой из них надежно вряд ли будет возможен. Однако, если вы можете выделить часть своего кода, которая должна работать с данными, вы можете просто использовать собственные механизмы JavaScript. В частности, блокировки могут обращаться к переменным, к которым не имеет доступа никакой другой код. Пример:
function storeLoginData()
{
var user = prompt("Please enter your user name");
var pass = prompt("Please enter your password");
return function(testUser, testPass)
{
return testUser == user && testPass == pass;
};
}
var verifier = storeLoginData();
if (verifier("foo", "bar"))
alert("Your login credentials are foo:bar");
Обратите внимание, что код вне функции storeLoginData
может вызвать только закрытие вернулся, но не имеет доступа к своим переменным. В этом примере ограничивается проверка правильности комбинации имени пользователя и пароля. И вы можете удалить даже эту лазейку, если вы сделаете свой изолированный код действовать автономно, по таймеру или что-то вроде этого:
function storeData(data)
{
var timer = Components.classes["@mozilla.org/timer;1"]
.createInstance(Components.interfaces.nsITimer);
timer.initWithCallback(function()
{
// Do something with data here
}, 1000, timer.TYPE_ONE_SHOT);
return function() {};
}
var data = ...;
var dataStorage = storeData(data);
data = null;
Обратите внимание, как основной код передает переменную data
в storeData
и нули его после этого - вся ссылки на переменную теперь находятся внутри функции storeData
. Закрытие, возвращенное здесь, бесполезно, и его единственной целью является сохранение ссылки на переменную timer
- без этого таймер будет собирать мусор и никогда не будет срабатывать. Безопасность этого решения основана на том факте, что нет способа перечислить все таймеры в системе - это верно для объектов таймера, но не для прослушивателей событий или наблюдателей, например.
Конечно, данные остаются незашифрованными в памяти - этого трудно избежать. Следовательно, любой двоичный код все равно сможет его прочитать, защита работает только против JavaScript.
Я могу только дать краткий обзор того, как это сделать (предполагая, что надстройки структурированы аналогично хромовым расширениям): На вашей фоновой странице (или аналогичной) вы создаете свой объект магазина. Затем также в своем расширении вы передаете значения от пользователя (действительно .... шифрование в JS - ложное обещание ... лучше всего вы можете реализовать обходной мусор и base64 или обфускать свой код ... двоичный все остальное было бы излишним для небезопасного метода) - фоновые страницы (по крайней мере, в хроме) не позволяют веб-сайтам напрямую взаимодействовать с ними. Это ваша мера безопасности ... – rlemon
Итак, сценарий будет принимать пользовательские данные, (зашифровать?), Отправить его на фоновый рисунок, который хранит его в своем собственном контексте. У вас есть другая специальная функция для возврата этих данных (с учетом ключа?) - и потому, что это переменная, работающая на фоновой странице в течение всего сеанса, как только браузер закрывается, данные теряются. Но опять же, так я бы сделал это в Chrome. Я должен предположить, что расширения аналогичны (или я отсюда?) – rlemon