SilentShield 2.6は、あるショップのチェックアウトでの登録が失敗する原因となった不備を解消します。通常の submit ではなくボタンクリックとAJAXで送信されるフォームが、当社に報告されていませんでした。この記事では、何が起きたのか、何が変わるのか、何をする必要があるのかを説明します。全リストは変更履歴に掲載しています。
何が問題だったのか
ウィジェットは入力とマウスの動きを計測し、訪問者がフォームを送信したときに結果を報告します。その際、ブラウザの submit イベントを監視していました。ところが、ショップによってはこのイベントがまったく発生しません。たとえばOpenCart 3のチェックアウトは、登録ステップをAJAXで読み込み、単純なボタンと jQuery.ajax で送信します。
その結果、お客様のサーバーが /v1/verify で問い合わせた訪問者について、当社が受け取っていたのは最初のページイベントだけでした。入力データとマウスデータがないため、判定は「疑わしい」となり、実際の人の登録が失敗しました。フォームは保護されていましたが、保護は訪問者を見ることができなかったのです。
何が変わるのか
バージョン2.6では、ウィジェットがこの種の送信も認識します。ウィジェットは behavior_nonce を含むリクエストを監視します。そのリクエストが submit イベントなしでページから送信され、フォームがまだ検証されていない場合、ウィジェットはリクエストを少しの間保留し、収集した入力データとマウスデータとともに送信を報告して、判定が出てからリクエストを送ります。15秒以内に応答がない場合は、そのままリクエストを送信し、これまでどおりお客様のサーバーが判断します。
それ以外は従来どおりです。通常の submit を使うフォーム、nonce のないリクエスト、単純なページ送信には手を加えません。
どのようにテストしたのか
ローカルのテスト環境で、本物のjQueryを使ってOpenCartのチェックアウトを再現し、模擬したお客様のサーバーから /v1/verify を呼び出しました。スイッチをオフにした状態では、クリックとAJAXで送信されるフォームは拒否されました(HTTP 403、「疑わしい」、理由は NO_TYPING_PAUSES と NO_MOUSE_MOVEMENT)。スイッチをオンにすると、同じ訪問者が受け入れられました(HTTP 200、「人間」)。通常の submit を使うフォーム、単純なページ送信、nonce のないリクエストは、スイッチのオンとオフで動作が変わりませんでした。
ご注意いただきたいこと
- 対象は
XMLHttpRequestによるリクエストで、jQuery.ajaxも含まれます。fetch()で送信されるフォームは、独自の処理を持つWooCommerceのブロックチェックアウトを除き、まだ対象外です。 - サーバー側の検証は変わりません。引き続き nonce を付けて
/v1/verifyを呼び出してください。