monoの開発ブログ

Content Security Policyがユーザの利便性に与える影響

Content Security Policyって、開発者がめんどくさいだけで、Webサイトを訪れるユーザが不便を被ることは特にないだろうと考えていました。そんなわけで、以下のように自分のいくつかのサイトで試しに導入してみたところ、ちょっと困ったので紹介します。

例えば、こちらのページでは、JavaScriptの実行を制限していて、外部のJavaScriptはGoogle Analyticsのものを除いて一切実行できないようになっています。ユーザがこのページ上でJavaScriptを実行しようとしなければ、問題ないですし、そもそもそんな状況想定していませんでした。

しかし、適用後数日たって、結構頻繁にページ上でJavaScriptを実行しようとしていたことに気付きました。それは、ブックマークレットによるものです。

といっても、ブックマークレットが一切使えないわけではありません。むしろ、Content Security Policyの勧告には、ブックマークレットの実行を妨げるべきではないと書かれており、実際に多くのブックマークレットは実行可能です。ここで指しているのは、DOMツリーにscriptタグを追加してJavaScriptを読み込もうとするタイプのものです。身近なところでは、Twitterが提供する閲覧中のページを共有するためのブックマークレットなんかが使っています。

追加されたscriptタグのsrc属性には、Content Security Policyの設定で許可していないURLが指定されているので、ロードできません。ユーザがどんなブックマークレットを利用するかは開発者には当然わからないので、予め許可しておくこともできません。

これ、どうしたらいいんでしょうか。Twitterの場合は、外部のscriptタグなんてなくても実現できそうなレベルの機能なので、まだなんとかなりそうではあるのですが、ブックマークレットの文字数制限を超えるような処理はどうにもならない気がします。そこまでいったら拡張機能書けって話かもしれないですけどねー。