27

最近JSONPを知ったので、いくつかのドットを接続するのに問題があります。これが私の理解です:

  • 同一生成元ポリシーにより、コンテンツ(JSONを含む)のクロスドメインXmlHttpRequestsは禁止されています。これにより、XSRFから保護されます。
  • JSONPを返すsrcを持つスクリプトタグを持つことが許可されています-Javascript関数の呼び出し内に埋め込まれたJSON(「Foo」など)
  • JSONPデータが返されるときに呼び出されるページに「foo」の実装を含めることができます。また、関数が渡されるJSONデータを使用して処理を行うことができます。

クロスドメインデータをJSONP経由で受信したが、JSON経由で受信した場合は受信できないのはなぜですか?

JSONはXSRFを許可する傾向がありますが、JSONPは許可しないという仮定はありますか?もしそうなら、JSONPがXSRFを有効にするデータを提供しない事実上のデータ形式である以外に理由はありますか?なぜJSONPであり、代わりにXMLの任意のルートタグではないのですか?

よろしくお願いします。うまくいかなかったので、また脳を動かしてください。

4

2 に答える 2

10

この質問は、ブラウザーがJSONPを安全であると見なす理由についてであり、安全であるかどうかについてではないことを理解しています(そうではありません)。この質問に段階的に対処します。

通常の古いAJAX

通常のAJAXリクエストを実行するために、ブラウザはXHRオブジェクトを作成し、それをURLにポイントして、データをプルします。XHRオブジェクトは、同じドメインからのデータのみを信頼します。これは厳しい制限です。現在のブラウザではそれを回避することはできません(編集-CORSを使用できるようになりました)。

解決策-XHRを使用しないでください

XHRは同じドメインポリシーの対象であるため、XHRを使用してクロスドメインAJAXを実行することはできません。幸いなことに、リモートサーバーにアクセスする方法は他にもあります。たとえば、ページに画像タグを追加できます。スクリプトタグを追加して、リモートサーバーを指すsrc属性を指定することもできます。たとえば、CDNからJQueryをプルして、機能することを期待できます。

JSONPの仕組み。

JSONPリクエストを行うと、コードはスクリプトタグをページに動的に追加します。スクリプトタグには、CDNからスクリプトを挿入する場合と同じように、リモートJSONPAPIURLを指すソース属性があります。

サーバーから返されるJSONPスクリプトは、関数呼び出しでラップされます。スクリプトをダウンロードすると、関数が自動的に実行されます。

これが、スクリプトをラップするコールバック関数の名前をJSONPに通知する必要がある理由です。スクリプトがダウンロードされると、その関数が呼び出されます。

セキュリティ上の懸念

ここにはかなり大きなセキュリティ上の懸念があります。ダウンロードしているスクリプトがページを制御し、ユーザーを危険にさらす可能性があります。JSONPはユーザーにとって安全ではなく、Webブラウザーによってブロックされていないだけです。JSONPは、実際には私たちが利用しているブラウザのエクスプロイトです。注意して使用してください。

賢明に使用すると、JSONPはかなり素晴らしいです。

于 2014-05-29T07:05:14.577 に答える
7

JSONPが安全であるという認識がどのように生まれたのかわかりませんが、

そのため、JSON-Pは、クロスドメインAjaxに対する安全ではなくハッキーなアプローチであると多くの人に見られており、それには正当な理由があります。作成者は、ユーザーに危害を加えないように、制御するか暗黙的に信頼するリモートWebサービスに対してのみそのような呼び出しを行うように注意する必要があります。

この提案の最も重要な部分は、ブラウザーベンダーが、JSON-Pコンテンツを受信するスクリプトタグに対してこのルールを適用し始め、不適合なJSON-Pコンテンツに対してエラーをスローする(または少なくとも処理を停止する)必要があることです。

http://json-p.org/からの両方の引用。

JSONP /セキュリティに関するいくつかの有用な情報を含む他のリンク:

これらはすべて2つのことを示しています-基本的には「安全」とは見なされませんが、「より安全」にする方法についてのアイデアがあります...ほとんどのアイデアは標準化とブラウザなどに組み込まれる特定のチェックロジックに依存しています。

于 2011-08-18T17:25:44.243 に答える