2

質問

コンテンツをユーザーにプッシュするサービスがあります。このコンテンツをユーザーに提供するために、顧客は自分のサイトにスクリプトを含めます。彼らのスクリプトは、それがどの顧客であるかを識別するために私のサーバーにトークンを送信しますが、ここに問題があります:誰かがユーザーのサイトからスクリプトをコピーすると、彼らはこのライブコンテンツを受け取ることができ、顧客は自分のサイトにいないユーザーに対して請求されます。それで、スクリプトが彼らのウェブサイトにのみ含まれることを確実にする方法はありますか?グーグルアナリティクスはこれをどのように達成しますか?

私には考えがありますが、これが完全に安全かどうかはわかりません。

  1. 顧客は、私のスクリプトを含めたいドメイン(サブドメインを含む)を教えてくれました。
  2. サーバーに保存する非常に小さなテキストファイルをユーザーに提供します。
  3. スクリプトが読み込まれると、window.location.hostをチェックし、ホスティングドメインのルートからテキストファイルをフェッチしようとします。
  4. ファイルが見つかり、その内容が顧客にファイルを提供したときに生成した内容と一致する場合、サービスをアクティブ化します。

これはうまくいくでしょうか?

window.locationを使用できない理由

私のスクリプトがwindow.locationを読み取り、それをURLに送信するとします。mydomain.com?token=ABC&locationhost=goodcustomer.com

現在、baduser.comの所有者はgooduser.comのアカウントを悪用したいので、gooduser.comのスクリプトを含めます。スクリプトはajaxリクエストをに送信するようになりましたmydomain.com?token=ABC&locationhost=badcustomer.com

badservice.comは、goodcustomer.comの所有者がサインアップしたときに入力したドメインではないため、これではサービスは開始されません。badcustomer.comの所有者は私のスクリプトを見て、URLを検証するためのリクエストを送信していることに気づき、自分のリクエストを送信するだけなので、これは簡単に回避できます。したがって、彼はにリクエストを送信しmydomain.com?token=ABC&locationhost=goodcustomer.comます。私のサーバーはこのリクエストを確認し、locationhostをトークンに関連付けられたドメインと比較し、goodcustomer.comのユーザー向けのコンテンツをbadcustomer.comのユーザーに提供し始めます。私のサーバーには、リクエストが自分のスクリプトによって送信されたのか、実際の顧客になりすまそうとしているユーザーによって送信されたのかを知る方法がありません。

4

2 に答える 2

1

エンドユーザーのブラウザで実行されるスクリプトだけでは、これに対する安全な解決策を作成することはできません。顧客のWebサイトを模倣したい人は、ブラウザに送信するすべてのスクリプトまたはファイルのコピーを作成することで、いつでもそれを行うことができます。あなたはあなたの顧客サーバーで何かをする必要があるでしょう。つまり、顧客はブラウザに送信されないある種の秘密を持っている必要があります。

これを行う1つの方法は、ワンタイムトークンを生成するサーバー側スクリプトを顧客に提供することです。スクリプトでこのサーバー側スクリプトを呼び出してトークンを取得し、このトークンをサーバーへのリクエストに含めます。サーバーは、データを生成する前に、トークンが正しいことを確認する必要があります。

ワンタイムトークンは、各顧客に20文字の長さのパスワードを送信することで作成できます。サーバー側スクリプトにパスワードを読み取らせ、日付と時刻を追加し、SHA-256を使用してこの値をハッシュします。パスワードがわからない場合、偽のトークンを作成するのは非常に困難です。サーバーサイドスクリプトにカウンターを追加するとさらに良いでしょう。リクエストごとに1ずつカウンタをインクリメントします。ただし、サイトのカウンターが顧客サイトのカウンターと同期していない場合、カウンターによって同期の問題が発生します。

于 2012-09-17T16:08:43.810 に答える
1

ユーザーがスクリプトをホストするドメインのデータベースを構築し、ユーザーがスクリプトをロードするwindow.locationと、サーバーに送信し、ウィンドウの場所がデータベース内の場所と一致する場合はサーバーがコンテンツを送信します。

于 2012-09-17T16:02:50.267 に答える