0

私はFirefoxアドオンに取り組んでおり、一部のユーザーデータを安全に保存する必要があります(他の拡張機能はありません.Webサイトはそれにアクセスでき、データはブラウザセッションが閉じられるまで保存する必要があります).

使用するストレージについてアドバイスをいただけますか?

これがファイルとして保存するのが良い考えだと思われる場合は、暗号化して飛行中に復号化する方法を教えてもらえますか?

4

1 に答える 1

0

あなたの 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その後 null にするかに注意してください。変数へのすべての参照はstoreData関数内にあります。ここで返されるクロージャーは役に立たず、その唯一の目的はtimer変数への参照を保持することです。そうしないと、タイマーはガベージ コレクションされ、決して起動しません。このソリューションのセキュリティは、システム内のすべてのタイマーを列挙する方法がないという事実に依存しています。これはタイマー オブジェクトには当てはまりますが、たとえばイベント リスナーやオブザーバーには当てはまりません。

もちろん、データは暗号化されずにメモリに残ります。これは避けられません。したがって、バイナリ コードは引き続き読み取ることができ、保護は JavaScript に対してのみ機能します。

于 2012-07-03T15:10:09.603 に答える