2009-09-08 1 views
9

私は最近、AJAXの呼び出しでアクセスされているファイルも、それを無効にするには、PHPでAJAXをサポートするスクリプトを大量にコード化し始めましたか?AJAXのみのアクセス

答えて

21

これを確実に防ぐことはできません。鍵は実際にセキュリティ問題としてこのファイルに直接アクセスしている人を考慮することではありません。これが可能であることを計画してください。あなたはもっと安全な場所にいます。

一部の人々は、この(または類似)のようなコードをお勧めかもしれません:

if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) 
    && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') { 
    // more code here 
} 

しかし、問題の事実は、HTTPヘッダーが非常に簡単に詐称して、コードを固定する手段はありませんすることができるということです。忙しいサイトでの私のテストでは、私はこれらのヘッダーが実際には信頼できるものではないことに気付きました。

+0

Spot on。あるいは、パラメータ(たとえば '?ajax')を渡すこともできますが、これはさらに簡単にスプーフィングすることができます。 –

0

アクセスを直接許可しない方法はありません。クエリはいつでもあなたが思い付くあらゆる基準に合うように作成することができます。アプリケーション内

/* AJAX check */ 
if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') { 
    //Do something here 
} 
-1

使用するセッション:XmlHttpRequestのは、それはのようなものを用いて検出することができるヘッダーを追加し、サーバーを照会するために使用されている場合

編集:

  1. 私はそのためにUUIDを使用して、セッション中にあなたのサイトを登録します。

  2. セッションで使用する同じ値のCookieを設定します。

  3. この値も含むパラメータでAJAXリクエストを送信します。

  4. セッション、cookie、およびパラメータの値を比較します。

+0

私の答えは何が間違っていますか? – Joerg

+0

私はあなたに投票しませんでしたが、これはまだ信頼できる方法です。実装が非常に便利かもしれませんが、偽装することもできます。 – Boldewyn

6

他の人々は、これは不可能であり、その回答で示唆したように。これは、コンピュータセキュリティの柱の原則の1つで、クライアントを信頼することはできません。これがクライアントからのすべての入力を検証する理由です。

代わりに他のクライアントがサービスにアクセスするのをブロックする代わりに、守備的なWebサービスを書く時間を費やします。つまり、悪意のあるユーザーがビジネスロジックを介して注射やその他の攻撃を行うことができないようにしてください。例:すべての電子メールが有効で、人々が負のドルのためのアイテムを購入していないことを確認してください。

ああ、ウェブサービスが公開されているという事実は良いです!ユーザーに公開APIを提供していますが、非常にきれいです!たぶんあなたのコミュニティをロックアウトしようとする代わりに、あなたはそれを受け入れます - あなたのサービスとのインターフェース方法に関するドキュメンテーションを与え、より多くのクライアントを作ります。 iPhone SDKを購入してObjective Cの学習に時間を費やす代わりに、あなたのユーザーの一人がそうするかもしれません。

+1

可能ですが、信頼性がありません。それ以外のすべての有効なポイント –

0

おそらく、ajaxリクエストとともにいくつかの安全な鍵を渡すような、いくつかのXSS防衛技術を使うべきでしょう。そして、ロードされたページと共に非同期クエリを行うjavascriptにキーを与えるだけです。この場合

<script type="text/javascript"> 
    window.csrf_key = '<?php $user->getCsrf(); ?>'; 
</script> 

あなたはアクションを呼び出すと健全性チェックを行うために記事を使用し、あなたは安全な鍵を続ける場合にのみ、人々は直接ファイルに要求を渡す心配する必要はありません。

関連する問題