2018年12月2日日曜日

Chrome拡張でContent-Security-Policyを取得できなくなったかも

HTTPヘッダーのContent-Security-Policy (CSP) でsandboxを設定するはたまに行われる。 これをChrome拡張で編集すると色々とページの動作を変えられて、嬉しい事がある。 指定可能なオプションはこことか見やすい

ただ以前はCSPをChrome拡張で取得できたのだけど、たぶんChrome 70からCSPがヘッダー情報として取得できなくなっていた (編集はできる)。 Chrome拡張はたまに細かい動作が変わったりして「???」となる事があるんだけど、今回もその類かも知れない。

以下は動かなくなったものだけど、これは動かないよというのも大切な事なのでメモを残しておく。 以下のサンプルくらいなら、コンテキストメニューを弄るなど、サイト側に影響を与えない別の方法で機能を提供すれば良いとも思う。
chrome.webRequest.onHeadersReceived.addListener(
  function(info) {
    var headers = info.responseHeaders;
    for (var i=headers.length-1; i>=0; --i) {
      var header = headers[i].name.toLowerCase();
      if (header == 'x-content-security-policy' || header == 'content-security-policy') {
        var values = headers[i].value.split(/ *; */);
        for (var j=0; j<values.length; j++) {
          if (values[j].startsWith('sandbox')) {
            values[j] += ' allow-modals';
            headers[i].value = values.join(';');
            break;
          }
        }
        break;
      }
    }
    return {responseHeaders: headers};
  }, {
    urls: ["<all_urls>"]
  },
  ["blocking", "responseHeaders"]
);

上記のようにwebRequestを弄るようなものはmanifest.jsonに以下の記述を加えないと動かない。 さすがにその間違いはしてない。
"permissions": ["webRequest", "webRequestBlocking", "<all_urls>"],
"background": {
  "scripts": ["background.js"]
},

今は駄目でも、気付いたら動くようになってるかも知れない。そういう事もよくある。 ただ直近数日で色々な機能が豪快に挙動が変わったみたいだ。

0 件のコメント: