4

APIを構築していますが、どのドメインが呼び出しを使用しているかを追跡/把握する方法について質問があります。

API呼び出しはPHPに組み込まれており、認証は必要ありません。ユーザーは、サーバーでのAJAX呼び出しでAPIを使用する可能性があります。

したがって、たとえば、APIPHPファイルを提供している私のドメインはdev.yourmapper.comと呼ばれます。ドメインwww.metromapper.orgの誰かが、Googleマップを作成するページを作成し、Ajaxを使用してファイルを呼び出し、マップにデータをオーバーレイします。

実際の例は次のとおりです。http://www.metromapper.org/example/apitest.htm

(中央のマップマーカーをクリックすると、yourmapper.comスクリプトで使用可能なすべてのPHPサーバー変数のポップアップが表示されます。)

リンクをクリックすると、HTTP_REFERERは「stackoverflow.com」になる可能性が高いことに注意してください(リンクを切り取って貼り付ける場合は空になります)。リファラーはmetromapper.orgになると思います。これは、そのドメインがロード後にyourmapper.comスクリプトを呼び出すためですが、明らかにそうではありません。

結論:Javascriptを使用してyourmapper.comスクリプトを呼び出しているドメインを特定するためにどのような方法を使用できますか?必要に応じて、PHP以外の言語を使用できます。ありがとう。

4

2 に答える 2

4

「そのドメインは、ロード後に yourmapper.com スクリプトを呼び出すため、リファラーは metromapper.org になると思います」

それは実際には正しくありません。まず、HTTP_REFERER はほとんどの (すべてではない) ブラウザーによって渡される任意のパラメーターであり、簡単にスプーフィングされる可能性があるため、HTTP_REFERER に依存するべきではありません。必要に応じて、CURL を使用して、リファラーが whitehouse.gov であるかのように見せる Web サイト リクエストを送信できます。そこにはセキュリティ対策が講じられていません。

そうは言っても。ブラウザーは、そのパラメーターを、ユーザーが現在読み込まれているページに誘導したページに設定します。スクリプトではありません。したがって、表示されている結果が表示される理由は、ユーザーが stackoverflow.com のリンクによって metromapper.org に参照されたためです。

最後に、ジューシーな部分に行きましょう。JS を使用してブラウザーでコードを記述しています。それでいいですし、まったく問題ありません。ただし、JS はオープン ソースであることを覚えておく必要があります。したがって、人々は、できるという理由だけで、コードをいじって API をいじることができます (またそうするでしょう)。そうは言っても。おそらく最善の策は、JS API でリクエストとともにサイトの URL を渡すことです。これは、スクリプトを使用しているサイトを「追跡」する最良の方法です。サーバー側をチェックして、URL が渡されたことを確認できます。これにより、人々が API を変更して、URL をサーバーに送信するビットを削除するのを防ぐことができます。ただし、他の誰かの URL やランダムな未登録の URL をパラメーターとして使用するように変更することを防ぐことはできません。

サーバー上で実行される PHP API を構築できることは確かです。JS API は PHP API に接続し、PHP API は zend-guard エンコード (またはその他のソース保護コード システム) ですが、ファイルをデコードしてソースに戻って混乱させる人がまだいます。確かに、それができる人ははるかに少なく、平均的なユーザーは API をそのまま使用するだけです。また、エンコードされた PHP ファイルを実行できないサーバーで API を実行できないという問題もあります。

最終的には、必要なセキュリティと認証のレベルを決定する必要がありますが、API はクライアント ブラウザーの JavaScript で実行されているため、難読化以外に利用できるものはほとんどありません。

最良の選択肢は、単純に JS コードで現在のページの URL を取得し、それを API リクエストで送信することだと思います。そこから、サーバーは URL を処理して、ルート ドメインや保存したいその他の情報を取得できます。

他のユーザーの Web サイト URL に対する「なりすまし」リクエストを防止したい場合は、ユーザーのサーバーの特定の場所にインストールされる PHP API を実装できます。例http://www.domain.com/my-app-name.php

すべての JS API 呼び出しは、そのスクリプトを通過する必要があります。ユーザーが API をダウンロードするときは、Web サイトの URL とその他の情報を入力する必要があります。システムは「キー」を生成し、ダウンロードできるようにパッケージ化する前にスクリプトに挿入します。そのキーはドメインに対して有効であり、API との間のすべての送信を、blowfish または別の双方向暗号化アルゴリズムを使用してエンコードするために使用されます。このようにして、API が PHP API ファイルからリクエストを受け取ると、リクエストが行われたページの URL を取得し、あなたとそのサイトの管理者だけが持つキーでエンコードされます。したがって、リクエストは次のように送信されます。metromapper.org/api?site=[url_encoded_pa​​ge_address]&req=[encrypted_request]

サーバーはページの URL を使用して、データの復号化に使用するキーを決定します。次に、データを復号化します。データが破損しているか、期待どおりに復号化されない場合、それは無効な要求であり、何も返さずに終了する必要があります。

暗号化をJSに書き込むのではなく、暗号化にPHPファイルを使用することをお勧めする理由は、暗号化/復号化の負荷でクライアント(各サイト訪問者)に負担をかけたくないためであり、PHPはそれをはるかに高速に処理します.これらのタスクを処理するために作成されたライブラリがあるため、JS よりも。

いずれにせよ、API に対してさまざまなサイトへのリクエストを追跡および検証できるようになるための正しい軌道に乗るはずです。

于 2011-08-15T21:28:49.960 に答える
2

ドメイン名に基づいてハッシュを生成し、API のユーザーが各リクエストでドメイン名とハッシュを送信できるようにすることができます。API は PHP を使用しているため、ヘッダーのどこかに「Access-Control-Allow-Origin」を設定します。PHP でこれを行う場合は、少しいじることができます。以下のスクリプトは、呼び出し側 (API を使用するドメイン) で php を必要としない実装の簡単な例です。

呼び出し側 (php は不要):

<script type="text/javascript">
  function callA() {
    var xhttp = new XMLHttpRequest();
    xhttp.open("GET", "//ajaxdomain.com/call.php?"+
                      "dom=www.callerdomain.com&"+
                      "key=41f8201df6cf1322cc192025cc6c5013",
               true);
    xhttp.onreadystatechange = function() {
      if(xhttp.readyState == 4 && xhttp.status == 200) {
        handleResponse(xhttp.responseText);
      }
    }
    xhttp.send();
  }
</script>

Ajax サーバー側 (PHP):

<?php
  if($_GET['key']==md5($_GET['dom']."Salt")) {
    header("Access-Control-Allow-Origin: http://".$_GET['dom']);
  }
?>

この方法では、呼び出しが悪意のあるドメインからのものである場合にもヘッダーが配置されますが、残りは Cross Origin Exception のためにバウンスするため、結果は得られません。

コードスペースのために、この例では md5 ハッシュを使用しましたが、必要に応じてより複雑なハッシュを使用することもできます。(いつものように) 使用したソルトは秘密にしておく必要があることに注意してください。

次の(サブ)ドメインで実際の例をオンラインにしました。ページは同じです。

cors1.seriousshare.com - 「CORS 1」ボタンでのみ機能します。
cors2.seriousshare.com - 「CORS 2」ボタンでのみ機能します。

于 2015-12-02T17:40:22.100 に答える