2012-03-13 14 views
0

私のPHPアプリケーションの1つにAPIを提供したいと思います。 APIの不正アクセスを防止するにはどうすればよいですか? 登録するすべての顧客にAPIキーを提供しようとしましたが、別のドメインで使用すると失敗する可能性があります。 署名検証またはAPIキー検証の背景にある考え方は何ですか?私署名またはAPI PHPを使用したキー検証

+0

[PHPで書かれたAPIへの認証をどうやって処理するのですか?](http://stackoverflow.com/questions/7830970/how-do-i-handle-authorization-to-an-api-written- in-php) – deceze

答えて

7

APIキーは、彼らが表示されている場合は、クエリの速度を制御するために使用することができ、事前に

おかげで、いくつかのアドバイスをお願いします。つまり、IPごとに1回のキーで1分あたりN回以上のリクエストを許可しないということです。彼らは本当に安全保障の手段ではなく、アイデンティティの手段です。

ここで、このキーが所属するユーザーがこのキーを実際に使用していることを確認するにはどうすればよいですか?

これを行う1つの方法はリクエスト署名です。一連のパラメータ(a = x & b = y ...)を指定してリクエストを渡すと、クライアントのみが署名を作成し、サーバーが作成または検証できます。これは、パラメータと値を取得し、それらのMD5またはSHA1の合計を作成し、秘密変数またはソルトを文字列に追加することによって行われます。この変数は決して電信で送信されず、管理コンソールでhttpsだけを介してユーザーに表示されます。ただし、ハッシングの前に必ずアルファベット順にパラメータをソートしてください!

私のパラメータがある場合はそう、:foo=bar&bar=baz、私は、パラメータの辞書を並べ替える秘密$SECRET='asd32efe32ef2df23'を追加して作成します:$sig = md5('bar=baz&foo=bar'.$SECRET);は、ちょうど要求に&sig={$sig}を追加することができます。相手側はパラメータ(sigを除く)で同じことを行い、それを検証します。

セッションごと、またはしばらくの間、秘密を変更することをお勧めします。これは、パスワードまたはSSL証明書を使用してHTTPS経由で行うことができます。

編集:通常、セキュリティを強化するために追加するものは、ワイヤを介して暗号化されずに送信されるインクリメント要求IDであり、ハッシュプロセスで使用されます。これにより、2つの同一の要求が同じシグネチャを持つことを防ぎ、再生攻撃(攻撃者がコマンドを再送信する)を防止します。これを行うと、アウトオブオーダーのリクエスト(つまり、クライアントがオーダーで送信したが、ネットワークの速度が原因で、サーバー上で100,102,101として表示される)のために、サーバーに一定の猶予を与える必要があります。

+0

署名は本質的にAPIキーと全く同じであり、まったく同じ機能(同一性の確認)を提供します。唯一の違いは、署名されたリクエストでは、APIキー自体がワイヤを介して送信されることはないため、第三者に漏れる可能性は最小限に抑えられます。ユーザーが持っている秘密の不透明なトークンであり、彼を一意に識別するトークンであるという事実は変わりません。 – deceze

+0

私はすべてのAPI呼び出しを通常は暗号化しないので、誰でも利用できるオープントークンであるとAPIキーを考慮します。 APIはあなたのユーザー名と似ており、パスワードを渡すことはできないので、署名に基づいて秘密を渡します。 –

関連する問題