セキュリティのベストプラクティス

この翻訳は不完全です。英語から この記事を翻訳 してください。

ここに拡張機能ユーザーの安全を保つために従うべき、すべてのベストプラクティスがあります。このベストプラクティスに従わないと、addons.mozilla.org でのレビューに不合格となり、アドオンの配布ができなくなったり、Firefox でのインストールができなくなったりすることがあります。

  • リモートスクリプトを挿入・組み合わせない
    拡張機能で使いたいサービスを指定する場合、リモートソースからそのサービスのスクリプトを挿入しないでください。こうしたアプローチは危険で、なぜならコードが知らないうちに—そして、重要なことに、拡張機能のユーザーの知らないうちに—変更されうるためで、拡張機能のセキュリティに侵入することになります。このためスクリプトのコピーを拡張機能のコードに追加します。
  • リモートコンテンツが安全に挿入されることを確かめる
    拡張機能がリモートコンテンツを利用する時は、次のベストプラクティスに従っていることを確認します:
    • 安全なネイティブ DOM 操作メソッドを使って文字列を挿入する: document.createElement, Element.setAtttribute, Node.textContent
    • 文字列挿入に jQuery関数 attr()text() を使う。
    • DOMPurify で HTML コンテンツをサニタイズする
    • あらゆる HTML挿入前にエスケープするテンプレートエンジンコマンドを使う。

    より詳しくは、Safely inserting external content into a page を見てください。

  • Google Analytics 用の XHR を使う
    If you want to add Google Analytics to your extension don't insert the Google Analytics JavaScript code. Rather, it’s recommended that the Google Analytics REST API is used in an XHR call, such as:
    let request = new XMLHttpRequest();
    let message =
      "v=1&tid=" + GA_TRACKING_ID + "&cid= " + GA_CLIENT_ID + "&aip=1" +
      "&ds=add-on&t=event&ec=AAA&ea=" + aType;
          
    request.open("POST", "https://www.google-analytics.com/collect", true);
    request.send(message);
    You can find more information in the blog post Using Google Analytics in Extensions.
  • 標準の拡張機能の content security policy (CSP) を使う
    The standard policy restricts the sources from which your extension can load <script> and <object> resources, and disallows potentially unsafe practices such as the use of eval(). While the manifest.json key content_security_policy enables you to modify the content security policy for your extension, this isn’t recommended as the policy helps prevent extensions from inadvertently executing malicious content. If your modified CSP allows remote script injection your extension will get rejected from AMO during review.
    For more information, see Default content security policy.
  • ページ内 JavaScript でのオブジェクト共有には気をつける
    Firefox provides wrappedJSObject so a content script can access JavaScript objects created by page scripts. The danger here is that a malicious web page could, 例えば、modify the functions of JavaScript objects to run code of its own.
    For more information, see Accessing page script objects from content scripts.
  • コンテンツスクリプトで window.eval() を使う時は注意する
    You should be very careful when running code in the context of a page. A malicious web page could attempt to run code of its own by exploiting the use of window.eval(). It might do this by, 例えば、redefining objects your code might want to evaluate.
    For more information, see Don't use eval needlessly!
  • 拡張機能コンポーネントで UI を作る
    Create the UI for your extension using the built-in extension UI features, such as bundled pages, pageAction, and popups on pageAction and browserAction. Don’t add UI elements, such as buttons or toolbars, directly to web pages. If you do, scripts on the web page could compromise your extension. See Keybase Browser Extension Insecure for an example of the potential issues.
    If the standard UI components aren’t sufficient for your needs use iframes with data URLs to prevent fingerprinting, or add iframes to the extension code so a page can’t interact with your UI content, such as buttons.
  • ESLint に eslint-plugin-no-unsanitized を加える
    If you make use of ESLint to check your extension code, consider adding eslint-plugin-no-unsanitized. This ESLint rules plug-in will flag instances where unsanitized code from APIs or user input could cause issues.
  • moz-extension パスを直接インジェクトしない
    When injected links, includes, or images include paths to moz-extension://{hash} a page’s tracking script could use this information to fingerprint the user, as the hash (UUID) is unique to the extension installation and, therefore, the user.
    The best way to avoid this issue is to follow the general advice about not injecting content. However, if you believe injecting content is your only practical approach, ensure that moz-extension paths are embedded inside an iframe using a data URL or the srcdoc attribute.
  • サードパーティライブラリーが最新であることを確かめる
    Reputable third-party libraries will be updated when any issues are found. The use of outdated (and potentially insecure) third-party libraries is strongly discouraged and, when a significant risk is identified, AMO may act to block extensions using the out of date code.
    Therefore, always use the latest version of any third-party libraries when you create your extension. Then, be aware of updates to those libraries and be prepared to update your extension to ensure its using an up to date version of the library.
  • サードパーティライブラリーを編集しない
    Modifications to a third-party library are a significant indicator that a developer is trying to hide malicious code within code that is generally known and trusted. AMO will therefore try to detect changes to third-party libraries and may disable extensions when it finds changes.

ドキュメントのタグと貢献者

このページの貢献者: Uemmra3
最終更新者: Uemmra3,