web-dev-qa-db-ja.com

クロスドメインAjaxリクエストを許可する

私のプロジェクトでは、他人が私のスクリプトにajaxリクエストを送信できるようにする必要があります。そのため、外部リクエストは他のWebサイトやドメインから、またはブラウザの拡張機能から送信される場合があります。
スクリプトの先頭に次の2行を追加して、スクリプトを実行できるようにしました。

header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST');  

今、私の質問はこれです:ここで私が逃したセキュリティ上の考慮事項はありますか?この簡単な解決策は深刻な問題を引き起こしますか?
もしそうなら、より良い解決策は何ですか?

回答ありがとうございます。

39
Aliweb

前述のように、誰でもいつでもページにリクエストを送信できます。そのため、ユーザーの入力を検証し、一般消費に利用可能な情報のみを明らかにすることがセキュリティ上の大きな懸念事項です。しかし、それはすべてのスクリプトに適用されます。

(ユーザー入力の検証後)に集中する必要がある2つの主な問題は次のとおりです。

  1. あなたが持つかもしれない問題は、ユーザーがスクリプトに情報を受け取ることです。ブラウザーに応じて(同じブラウザーのフレーバー間でも)、情報の取得を妨げるさまざまなセキュリティルールがあります。これに対する一般的な解決策は、情報を「JSONP」として返すことです。これは、クライアントが実行できる関数呼び出しとして戻り値をラップすることです。以下に簡単な例を示します( http://www.geekality.net/2010/06/27/php-how-to-easily-provide-json-and-jsonp/ から取得)。さらにロックダウンするには、すべてのクエリがJSONPであると主張し、コールバック関数を送信しない人を拒否します。

<?php

header('content-type: application/json; charset=utf-8');
$data = array(1, 2, 3, 4, 5, 6, 7, 8, 9);
echo $_GET['callback'] . '('.json_encode($data).')';

?>
  1. 定期的に電話をかけてサービスを乱用している人。これに対する解決策は、IPアドレスをトラップし、IPアドレスからの呼び出しが多すぎる場合は拒否することです。絶対確実ではありませんが、それは始まりです。

留意すべきその他の要因:

  • スクリプトによって設定されたクッキーやその他のヘッダーはおそらく無視されます
  • セッションにも同じことが当てはまります
19
Robbie

Zerkmsが言ったように、彼らがあなたのphpページに「行く」だけなら、彼らはそれがエコーアウトするものを何でも見ることができるでしょう。 可能な場合(そうでない場合)、それはまた、ローカルホスト上でさえ不要な人々が独自のフォームを作成し、AJAX経由でそれらを送信することを許可します彼らが望んでいる..それがあなたに大丈夫で、情報が曖昧/無害であるならば...そして、私はそれが「安全」だろうと思います。

1
Zak
private function set_headers() {
    header("HTTP/1.1 ".$this->_code." ".$this->get_status_message());
    header("Content-Type:".$this->_content_type);           
    header("Access-Control-Allow-Origin: *");
}
0
paras