はじめに
Automation API を使用すると、Web サイトにロードされた Kameleoon アプリケーションファイルの整合性を検証できます。このチェックを実行することで、アプリケーションファイルが改ざんされておらず、サイト上で安全に利用できることを確認できます。
整合性検証プロセスでは、アプリケーションファイルの内容に基づいてハッシュコードを生成し、それを Web サイトに統合されているファイルのハッシュコードと比較します。すべての場合において、両方のハッシュコードは一致するはずです。
このドキュメントでは、このヘルスチェックを実装し、アプリケーションファイルが改ざんから安全に保たれていることを確認する方法を案内します。
当社の API が生成するのは hashCode のみであることに注意してください。生成されたハッシュをどのように使用して Kameleoon アプリケーションファイルを保護するかは、ユーザーの判断に委ねられます。
整合性チェックの実装例
オリジナルの Kameleoon アプリケーションファイルのハッシュコードを取得するには、当社の Automation API を呼び出す必要があります。まず、OAuth 2.0 を使用して Automation API にアクセスし、関連する ドキュメント を参照する必要があります。
以下の例に示すように、ハッシュコードを取得する API エンドポイント にリクエストを送信した後、これを自分で計算したハッシュコードと比較して、ファイルが何らかの方法で改ざんされていないことを確認できます。
const axios = require("axios");
const crypto = require("crypto");
const API_SSX_URL = "https://api.kameleoon.com";
const SITE_CODE = "SITE_CODE";
const HASH_TYPE = "SHA256";
const CLIENT_ID = "CLIENT_ID";
const CLIENT_SECRET = "CLIENT_SECRET";
async function obtainAuthToken() {
const response = await axios({
url: `${API_SSX_URL}/oauth/token`,
method: "POST",
headers: {
"Content-type": "application/x-www-form-urlencoded"
},
data: `grant_type=client_credentials&client_id=${CLIENT_ID}&client_secret=${CLIENT_SECRET}`
});
return response.data.access_token;
}
async function obtainHash() {
const token = await obtainAuthToken();
const hashCodeResponse = await axios({
url: `${API_SSX_URL}/sites/${SITE_CODE}/hash`,
method: "PATCH",
headers: {
Authorization: "Bearer " + token,
"Content-type": "application/json"
},
data: `{"hashType": "${HASH_TYPE}"}`
});
return hashCodeResponse.data.hashCode; // { hashCode: 'hashCode', hashType: "SHA256" }
}
<Important>
`kameleoon.js` は非推奨となり、すべての Kameleoon 実装スニペットで `engine.js` に置き換えられました。`kameleoon.js` は **2026 年 6 月 1 日** 以降サポートされなくなります。この日付以降、`kameleoon.js` をまだ参照している Web サイト上のキャンペーンは機能しなくなります。実装スニペットを適宜更新することを強くお勧めします。
</Important>
// ハッシュコードを比較する関数
async function checkHash() {
const scriptResponse = await axios({
url: `https://${SITE_CODE}.kameleoon.io/engine.js?t=${new Date().getTime()}`,
method: "GET"
});
const hashCodeFromAPI = await obtainHash();
const hashCode = crypto.createHash(HASH_TYPE).update(scriptResponse.data).digest("hex");
return hashCodeFromAPI === hashCode;
}
checkHash();
<?php
$API_SSX_URL = 'https://api.kameleoon.com';
$SITE_CODE = 'SITE_CODE';
$HASH_TYPE = 'SHA256';
$CLIENT_ID = 'CLIENT_ID';
$CLIENT_SECRET = 'CLIENT_SECRET';
$tokenRequest = curl_init($API_SSX_URL . "/oauth/token");
curl_setopt($tokenRequest, CURLOPT_POST, 1);
curl_setopt($tokenRequest, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($tokenRequest, CURLOPT_POSTFIELDS, "grant_type=client_credentials&client_id=" . $CLIENT_ID . "&client_secret=" . $CLIENT_SECRET);
$tokenOutput = curl_exec($tokenRequest);
curl_close($tokenRequest);
$token = json_decode($tokenOutput)->access_token;
$hashRequest = curl_init($API_SSX_URL . "/sites/" . $SITE_CODE . "/hash");
curl_setopt($hashRequest, CURLOPT_CUSTOMREQUEST, 'PATCH');
curl_setopt($hashRequest, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($hashRequest, CURLOPT_POSTFIELDS, json_encode(array(
'hashType' => $HASH_TYPE
)));
curl_setopt($hashRequest, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json',
'Authorization: Bearer ' . $token
));
$hashOutput = curl_exec($hashRequest);
curl_close($hashRequest);
$hash = json_decode($hashRequest)->hashCode;
// ハッシュコードを比較する何らかのメソッド
checkHash($hash);
当社では、お客様ごとに当社の CDN にホストされている Kameleoon アプリケーションファイルを継続的に検証することはありません。代わりに、お客様の特定の要件に基づいて、アプリケーションファイルの検証方法と、ハッシュコードが一致しない場合に取るべき措置を決定できるようにしています。一般的に、不一致が検出された場合に Web サイトからアプリケーションファイルのリンクを速やかに削除するのが安全なやり方です。
Kameleoon スクリプトのドメインはプロジェクトによって異なる場合があります。プロジェクトが作成された時期によって、kameleoon.eu または kameleoon.io のいずれかでホストされている可能性があります。Kameleoon App 内のプロジェクトに表示されているドメインを必ず使用してください。