2017-03-25 14 views
0

私のウェブサイトは有料(無料ではありません) APIを提示しています。だから私はすべての着信ajax呼び出しを識別し、未知の要求を拒否する必要があります。ajaxリクエストを識別する方法は?

  • 要求は私の自身のウェブサイト
  • 要求はAPIの費用を支払っている人から来ているから来ている:他の言葉では、私だけにJSONの結果を返したい

    $paid_ips = ['138.14.4.3', '32.16.6.1']; 
    $ip = $_SERVER['REMOTE_ADDR']; 
    
    if ($ip == '::1' || in_array($ip, $paid_ips)) { 
        // allowed 
    } else { 
        // not allowed 
    } 
    

    ご存知のように、$ip == '::1'は私のウェブサイトの要求を決定します:

は、ここに私のコードです。今私は安全なことを知りたいですか?または、それを処理するためのより良いアプローチがありますか?

+0

セッションでハッシュ値を保存してここで使用すると、IPアドレスを常に比較する必要はなく、サーバーやその他の理由を変更しても機能します。 –

+0

パスワードとユーザー名の使用はどうですか?ほとんどの支払いゲートウェイはこのように使用していますが、getメソッドを使用してそれらを渡すことはありません。 –

+0

他の場所では "$ _SERVER [ 'REMOTE_ADDR']は実際のクライアントのIPアドレスを含んでいない可能性があります。 "、プロキシと偽のIPのためです。私はそれについての話題を見つけた:http://stackoverflow.com/questions/3003145/how-to-get-the-client-ip-address-in-php – Matiboux

答えて

1

あなたがやっていることは安全です:Webサーバーが正しく構成されている場合、権限のないユーザーは「偽の」IPでサービスにアクセスできません。

これを処理する方法はありますか? はい

許可された各APIコンシューマーに、一意の大きな認可キーを与えます。

次に、APIのコンシューマは、リクエストのヘッダー内の各リクエストとともにキーを送信するように要求されます。ような何か:

Authorization: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

APIの消費者は、要求を行うときにもう一つのヘッダの値を設定する必要があり、それは些細なのです。

また、APIコンシューマーのIPによる認証には多くの欠点があります。主なものは、各ユーザが静的IPアドレスを持っていなければならないということです。


編集:私はあなたのWebサービスは、JavaScriptクライアント側(ブラウザ)コードによって直接消費されたコメントから理解して。

は、この場合、JavaScriptコードは(トークンを送信する)Webサービスに要求を送信 あなたのAPIのコンシューマサーバ

APIの消費者のサーバーへのAJAX呼び出しを送信する必要があります。データを取得します。最後に、取得したデータをajax呼び出しへの応答としてクライアントに送信します。

このようにして、認証トークンはJavaScriptコードで公開されません。あなたのトークンではなく、またはクライアントのトークン

+0

よかった。私は、IPのチェックを取り除き、各リクエストごとにチェックされる*アクセストークン*に焦点を当てます。大丈夫だ。しかし、この場合、自分のウェブサイトをどのように認証できますか?すべてのAjaxリクエストで送信する必要があるウェブサイトのトークンを捧げる必要があります。この場合、トークンは誰でも見ることができるJSコードで記述する必要があります。したがって、eveybodyはAPIを無料で使用できます(トークンは自分のウェブサイトに所属しています)。なにか提案を? –

+1

@MartinAJ - 'if($ ip == ':: 1' || in_array($ authKey、$ allowedAuthKeys))'の2つの世界の両方を使うことができます。そんな感じ。 – Matiboux

+0

@Matibouxあなたが提案していることは合理的です、ありがとうございます。しかし、私はそれがパオロの平均だとはほとんど思っていません。 –

0

sigh。
JSスクリプトにトークンを格納するための安全な方法はありません。それは公表されています、それはひどいです。

APIを保護する唯一の方法は、ユーザー名/パスワード認証と認証キー(トークン)を混在させることです。
手順を説明しましょう。

  1. お客様のクライアントは、ウェブページにユーザー名とパスワードの両方を入力する必要があります。フォームを送信すると、ユーザー名とパスワードをサーバーに送信するJSスクリプトがトリガーされます。

  2. あなたのサーバ上のあなたのスクリプトは、ユーザ名とパスワードをデータベースなどのものと比較します。それらが格納されているものと一致する場合、スクリプトはランダムな認証キーを作成し、*データベースに格納し直してクライアントに返します。
    *保存された認証キーは十分に長く(24文字と+)、定義された遅延後に期限切れにする必要があります。

  3. クライアントはクッキーなど(「ログイン」を維持するため)に保存し、要求がサーバーに送信されるたびに認証キーを提供する必要があります。認証キーの有効性 - クライアントID - 毎回。私はセキュリティ上の問題のようなもののためのJSを憎む
    私は何か他のものが、認証のようなものを考えていない

..

しかし、この方法では、クライアントのユーザー名とパスワードが保存されていません、authキーの有効期限が切れます。

PS:ユーザーのパスワードをサーバーに保存する前にハッシュしてください。そうすれば、元のパスワードを知ることは技術的に不可能になります。あなたのデータを盗まれる可能性を忘れることはできません。

関連する問題