JavaScript フロントエンドと PHP で構築されたバックエンドで構成される Web アプリケーションがあります。たとえば、フロントエンドがバックエンドの URL に対していくつかの AJAX 要求をapi.examplesite.com?q=some_query行い、結果が JSON 形式で返されます。
この URL を知っている人は誰でも、直接呼び出して同じ結果を得ることができます。
この URL をサード パーティからアクセスできないようにするベスト プラクティスは何ですか?
JavaScript フロントエンドと PHP で構築されたバックエンドで構成される Web アプリケーションがあります。たとえば、フロントエンドがバックエンドの URL に対していくつかの AJAX 要求をapi.examplesite.com?q=some_query行い、結果が JSON 形式で返されます。
この URL を知っている人は誰でも、直接呼び出して同じ結果を得ることができます。
この URL をサード パーティからアクセスできないようにするベスト プラクティスは何ですか?
AJAX 呼び出しに使用できる URL はすべて、パブリック Web で使用できます。それを「プライベート」に保つには、ユーザー セッションまたはトークンに関連付けることができます。これは、メイン ページで開始し、AJAX 呼び出し間で保持されます。
また、「some_query」が実際の SQL ステートメントである場合、これは AJAX 呼び出しの非常に悪い習慣と見なされます。SQL は、任意のクライアントではなく、サーバー側でのみ直接利用できるようにする必要があります。
実際、これを行う方法はありません。アプリケーションはクライアント側であるため、サーバーから応答を取得する必要があります。とにかくクライアントによって傍受される可能性があることを意味します。
暗号化を使用して、データを傍受した人がデータを読み取れないようにすることができます。対称暗号を使用し、クライアント側アプリでいくつかのキーをハードコードすることができます (キーが侵害された場合、すべてのクライアントからのすべてのトラフィックを復号化できるため、これは良くありません) または SSL/TLS を使用して通信することができます。サーバー (機密情報を転送する場合は、これが最適なソリューションだと思います)。
クライアントは、それを使用するために URL を要求できる必要があります。ただし、リクエストが ajax で行われたかどうかを確認し、それに応じて情報を返すことができます。
if (isset($_SERVER['HTTP_X_REQUESTED_WITH'])
AND strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest') {
// I'm AJAX!
}
セキュリティのために、クエリを実行する前に、数値型を強制するか、文字列を引用符で囲むことができます。
例えば
$number = (int) $number;
$string = htmlspecialchars($string);
そうです、答えは: 到達不能にする方法はありません。