Webサイトやモバイルアプリでは、脅威や悪意のある攻撃からデータを保護するためのセキュリティ対策を行う必要があります。その対策のひとつとして、コンテンツセキュリティポリシー(CSP)がHTMLのスクリプト内に記述されている場合があります。これは、Webサイトやアプリを表示するブラウザーが、サーバーから送信されたスクリプトが信頼できる参照元から送信されたものであることを検証するためのものです。この場合、通常のコードを使用してどこでもサポートのアドオンをWebサイトやアプリに埋め込むことはできません。どこでもサポートのアドオンを埋め込むには、nonce値(一度だけ使われるランダムな値)を生成し、どこでもサポートのコード内のスクリプトの属性内にnonce値が指定されるようにどこでもサポートのコードを編集する必要があります。
nonce値とは
コンテンツセキュリティポリシー(CSP)におけるnonce値とは、一度だけ使用可能で推測するのが難しいランダムなデータの値です。nonce値は128ビットで表すことができます。つまり、約340澗(1澗=1兆×1兆×1兆)という膨大な数字で表すことが可能です。推測するのが難しいランダムな値を生成できます。また、nonce値はページが読み込まれるたびに新しく生成されます。コンテンツセキュリティポリシー(CSP)によるセキュリティ対策を回避した不正な攻撃からWebサイトやアプリを保護するのに役立ちます。
nonce値を利用したセキュリティ対策の仕組み
コンテンツセキュリティポリシー(CSP)を使用するにあたって、HTMLのインラインスクリプトの各ブロックにnonce値を追加します。出力するWebサーバー側のnonce値(コンテンツセキュリティポリシー(CSP)のヘッダーのnonce値)とブラウザー側のnonce値(scriptタグのnonce属性)が一致する場合にのみ、Webサーバーによってスクリプトが実行されます。これにより、信頼できるサーバーとブラウザー間でのデータのやりとりのみが許可されます。クロスサイトスクリプティング(XSS)やデータインジェクション攻撃などの不正な攻撃を検出し、回避するのに役立つ仕組みです。
nonce値の生成方法
Webサーバー側でnonce値を生成します。base64と呼ばれる64種類の文字で変換された、推測するのが難しいランダムな値が生成されます。nonce値は、ページが読み込まれるたびに新しく生成される必要があります。以下はコードの例です:
Node.jsスクリプト:
const var = require( 'crypto' );
var.randomBytes(16).toString( 'base64' );
// '6JDFIvPbrWANKpSJ8vlv6b=='
JavaScript:
String nonce = new String(DigestUtils.md5Hex(String.valueOf(new SecureRandom().nextLong())));
Pythonスクリプト:
def GetCspNonce():
"""ランダムなnonce値を出力します。"""
NONCE_LENGTH = 16
return base64.b64encode(os.urandom(NONCE_LENGTH))
以上でnonce値の生成は完了です。次の手順は、以下のとおりです:
- コンテンツセキュリティポリシー(CSP)のヘッダーの「script-src」において、nonce値を指定します。
- 同じnonce値をどこでもサポートのコード内の「script」属性に指定します。