6

PHP を使用して、API 呼び出しクロスドメインを次の基準で安全に認証するにはどうすればよいですか?

  1. 特定の domain.com/page から呼び出す必要があります (他のドメインは不可)
  2. 特定のキーが必要です

背景: 回答する前によくお読みください...

私の Web アプリケーションは、以下のような呼び出しを介してクライアントの Web サイトに JavaScript ウィジェットを表示します。つまり、スクリプトが提供されるクロスドメイン認証について話しているのですが、本物のクライアントに対してのみ、特定の URL に対してのみです!

現時点では、クライアントの Web サイトにウィジェットを 1 行の JavaScript で含めることができます。

例 client-website.com/page/with/my-widget

<head>
...
<script src="//ws.my-webappserver.com/little-widget/?key=api_key"></script>
...
</head>

実際には、これはjavascriptを直接呼び出すのではなく、認証を行う目的で実際のjavascriptの前にあるリモートサーバー上のPHPスクリプトを呼び出します。

上記の呼び出しの背後にある PHP スクリプトは、最初にこれを行います。

  1. API キー ($_REQUEST["key"]) がデータベース内のユーザーのレコードと一致することを確認します。
  2. リファラーの URL ($_SERVER['HTTP_REFERER']) をデータベースのレコードと照合します***。

これは単純化されていますが、本質的にサーバーは次のようになります

if ($_SERVER['HTTP_REFERER'] !== "http://client-website.com/page/with/my-widget")
  && $_REQUEST["Key"] == "the_long_api_key") {
    header("Content-type: application/x-javascript");
    echo file_get_contents($thewidgetJS_in_secret_location_on_server);
} else {
  //pretend to be a 404 page not found or some funky thing like that
}

***ウィジェットは特定のウェブサイト/ページでのみ実行できます

さて、問題は次のとおりです。

  1. キーはクライアント側にあるため、誰でもソースを表示してキーを取得できます
  2. たとえば、リファラーは(cURLによって)スプーフィングされる可能性があります

そして、ちょっとした障害: クライアントがサーバー側の言語を実行している可能性があるため、サーバー上の php スクリプト内にキーを貼り付けるようにクライアントに指示することはできません!

では、Web サービスを安全にして、特定のドメイン/ページからのみアクセスできるようにするにはどうすればよいでしょうか?

どんな助けでも本当に感謝します!

ps: ウィジェットはある種のドロップ ボックスにアップロードするため、ここではセキュリティが重要です。

4

1 に答える 1