ボットや競合他社などの不正なトラフィックによる無効コンバージョンをブロックするための設定方法をご紹介します。
フロントエンド(クライアントサイド)での実装
全ページにトラッキング用JSタグを挿入します。
テンプレート
<script>
var sptrk=function(){var o="https://sp-trk.com/",t="__spd",e=(new Date).getTime();window[t]||(window[t]={init:!1});var c=window[t];c.d||(c.d=[]);var s=c.d;function v(t){var i=document.createElement("script");i.async=!0,i.src=t,document.head.appendChild(i)}c.init||v(o+"u");var u=/^([a-z0-9]{8})-([a-z0-9]{2})$/;return function(){var t=arguments;if(s.push(t),"config"==t[0]&&!c.init&&!c.a){c.init=!0;var i=t[1],n=i.match(u),a=n[1],r=n[2];if(!a||!r)throw"invalid id: "+i;var d=Math.random().toString(36).substring(2,15);v(o+"t/"+a+"?"+("a="+e+"&o="+d))}}}();
sptrk('config', '<tracker>-01');
</script>上記のスクリプトでは、
<tracker>
をダッシュボードで作成したトラッカーIDに置き換えてください。もし、ユーザーIDやセッションIDと連携したい場合は、下記のフォーマットをお使いください。
sptrk('config', '<tracker>-01', {xuid: '<user id>', xsid: '<session id>'});
コンバージョン前のフォームページで、次のようにJSを追加します。
<script>
function processForm(e) {
if (e.preventDefault) e.preventDefault();
sptrk('validate', '<type>', null, function(result) {
// add the token (result.t) to form as hidden field
var form = $("#form-id");
var input = $("#_sptrk_token") || $("<input>");
input.attr({
type: "hidden",
id: "_sptrk_token",
name: "_sptrk_token",
value: result.t
});
form.append(input);
// submit the form
form.submit();
});
}
$("#submit-button-id").click(processForm);
</script>上記のスクリプトでは、
'<type>'
をフォームを表すアクション名に置き換えてください。一般的な例としては、'sign-up'
,'login'
,'password-reset'
、マーケティングフォームでは'newsletter-form'
や'download-form'
などがあります。
サーバーサイドでのトークン検証
クライアントサイド(javascript)のブロッキングを実装している場合でも、さらに追加で不正コンバージョンをブロックために、サーバーサイドでのチェックを追加で行うことを推奨しています。サーバーサイドでトークンの有効性を確認するには、以下の手順で行います。
送信されたフォームのパラメータからトークンを取得します。上記の例では、POSTのボディにある
__sptrk_token
パラメータがこれにあたります。トークンをAPIに送信し、検証を受ける(下記参照)。
トークン検証チェックに失敗した送信をブロックするか、別途ログに記録する。
検証用APIにトークンを送信する
URL: https://sp-trk.com/api/verify/<tracker>
Method: POST
Content-Type:
application/x-www-form-urlencoded
リクエストの本文には、以下のパラメータを記述してください。
Parameters | Description |
api_key | トラッカー用に生成されたAPIキー |
token | 送信されたフォームのパラメータから取得したトークン |
type | JavaScriptの設定で使用されているものと同じタイプ/アクション名を使用します |
ip | フォーム送信に使用されたIP (v4 or v6) アドレス (任意) |
ua | フォーム送信のHTTPヘッダーに使用されたユーザーエージェント(任意) |
以下は、APIへのcURLリクエストの例です(<api_key>
、<token>
、<tracker>
の各パラメータを置き換えてください)
curl -X POST -d 'api_key=<api_key>' -d 'token=<token>' -d 'type=<type>' -d 'ip=<ip>' -d 'ua=<user_agent>' https://sp-trk.com/api/verify/<tracker>
ip
パラメータは任意となります。これを使用する場合、フォーマットは下記のような形になります。
IPv4 例: 1.1.1.1
IPv6 例: 2001:0db8:85a3:0000:0000:8a2e:0370:7334
同様に、'user_agent'
パラメータもオプション(任意)となります。これを使用する場合は、HTTPヘッダで受け取った値をそのまま渡してください。ユーザーエージェントの例としては下記のような文字列となります。
Mozilla/5.0 (iPhone; CPU iPhone OS 15_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.4 Mobile/15E148 Safari/604.1
API レスポンス
呼び出しに成功した場合、APIはhttpステータス:200 OK
を返します。
さらに、レスポンスコンテンツの本文には、以下のようなJSONオブジェクトが含まれます。
score (float): スコア
0.0
は、問題が見つからなかったことを示します。トークンは有効であり、フォームの送信は正常であるはずです。逆に、スコアが1.0
であれば、問題が検出されたことを示します。この場合、理由はreason
のパラメータに記述されます。request_id (string): リクエストIDは、検証リクエストに関連付けられた一意のIDとなります。互換性のために文字列としてエンコードされていますが、安全に int64 にキャストすることができます。
timestamp (任意、文字列): トークンが生成された日時 (iso8601形式)。トークンが無効で読み取れなかった場合、これは省略されることがあります。
reason (オプション、文字列): 検証が失敗した場合、その理由を記載します。以下のいずれかになります。
"ivt": 送信が1つ以上の無効なトラフィック分類を引き起こした場合(下記参照)。例としては、Botがフォームを送信した場合です。
"expired": トークンの生成から時間が経過している場合。トークンの使用と有効期間の制限については、以下を参照してください。
"duplicate": このトークンはすでに検証されています。トークンの検証は一度しか行えません。トークンの使用と有効期間の制限については、以下を参照してください。
"invalid_signature": このトークンは改ざんされています。
"no_token": トークンが空となっている。
ivt_subcategories(任意、文字列の配列):無効なアクセスが検出されたために検証が失敗した場合、このフィールドにはその理由が格納されます。以下のいずれか、または複数を指定することができます。
"bot": このユーザーに対してBotからのアクセスが検出されました。
"spoofed_device":User-Agentが、ユーザーが使用しているOS/ブラウザ/デバイスと一致しない場合。例えば、User-Agentが最新のiOSで動作するiPhone情報にも関わらず、実際にはLinuxの仮想マシン環境で動作しているような場合です。
"geo_masking":VPN、プロキシ、TORなどのノードで、元のIPを隠し、ユーザーの位置を偽装する可能性があるものです。
"suspicious_ip": ユーザーのIPが最近他のサイバー犯罪で使用されており、多くの場合、マルウェアに感染したデバイスであることを示しています。
"datacenter": ユーザーのIPがデータセンターのIPである場合。
"invalid_ua": 明らかにブラウザを代表していないUser-Agentからの送信。例えば、PythonやJavaのようなプログラムから送信されたウェブリクエストがこれにあたります。
"repeat":ブラウザが、時間ウィンドウごとにユーザーが設定した最大投稿数を超えた場合(例:過去6時間に5件以上の投稿)。
以下は、バリデーションが成功した例です。
{
"request_id": "123",
"score": 0.0,
"timestamp": "2022-01-01T00:00:00Z"
}
そして、ボットが検出されたため、検証に失敗したトークンの例。
{
"request_id": "456",
"score": 1.0,
"timestamp": "2022-01-01T00:00:00Z",
"ivt_subcategories": ["bot", "datacenter"],
"reason": "ivt"
}
トークンの使用制限と最大ライフタイム
SpiderAFで生成されたトークンは1回のみ使用可能です。これは特定の攻撃を防ぐためのものです。同じトークンを2回目に提出すると、ステータスコードがduplicate
と返されます。
また、これらのトークンの有効期限は生成後最大2分です。その後、トークンは無効とみなされ、ステータスコードexpired
が返されます。