サーバー上の特定のデータにアクセスするために、iPhone アプリから呼び出す PHP URL API を実装しました。アプリだけが API を呼び出せるようにする方法がわかりません。これまでの私の信じられないほど単純な解決策は、URL にキーを渡すことでしたが、誰かが望むと簡単にキャッチされ、不要なユーザーに使用される可能性があります。私は何をすべきか?ご提案いただきありがとうございます。
3 に答える
秘密鍵を使用するのは正しい道ですが、その鍵を使用して、鍵の代わりに URL で渡すハッシュを作成します。サーバーは同じキーを持ち、同じハッシュを再作成できます。一致しない場合は無効です。
$key = 'my secret key';
$data_item1 = 'something';
$data_item2 = 'something else';
$random_key = mt_rand(100000,10000000);
$check = sha1($key . $data_item1 . $data_item2 . $random_key);
$submit_data = array(
'data_item1' => $data_item1,
'data_item2' => $data_item2,
'check' => $check,
'checkid' => $random_key
);
サーバーにはアプリと同じ $key があります。次に、データ要素を送信して同じ sha1 を実行し、sha1 の結果を比較できます。sha1 ハッシュを作成するために送信するすべてのデータ項目を使用する必要はありません。重要な部分は、ハッシュを生成するために送信からいくつかの「キー」データを除外することです。これは、一種のチェックサムとして機能するため、データが転送中に変更または改ざんされていないことも確認します。
ランダム データは、すべてのリクエストが異なるハッシュを持つようにするためのもので、パターンを検出するのが難しくなります。この方法は、カジュアルなハッキングを阻止するのに十分なはずです。
ユーザー名とパスワードを要求するのはどうですか?
シンプルな (ただし完全ではない) アプローチはBasic access authenticationです。
HTTPS 経由で通信を行います。アプリケーションにサーバーとの事前チェックを行わせます。サーバーが特定の方法 (特定のステータス コードや応答文字列など) で応答する場合、アプリはそれが正当であることを認識します。その後、アプリは PHP API に情報を投稿し、おそらくユーザー名とパスワードを使用して認証を行うことができます (または、本当に複雑にしたい場合は、事前チェックでサーバーにパスコードを返させ、それを使用してサービスを認証します)。
HTTPS 経由で通信することにより、すべてが確実に暗号化されます。予備チェックを行うことで、誰かが偽の SSL 証明書を作成して偽のサーバーに配置し、認証の詳細を取得することを確実に防ぐことができます。その後、アプリは応答を安全に終了します。このシステムはより複雑であるため、これはより安全なはずです。
ところで、機密性の高いユーザー名とパスワードをコードに入れることには注意してください。誰かが実行可能ファイルを逆コンパイルすると、それらを見ることができる可能性があります。サーバーでの事前チェックの後にパスコードを取得するなど、より動的なことを選択します。