跳至內容

JSONP

出自Taiwan Tongues 台語維基
於 2025年8月23日 (六) 00:38 由 TaiwanTonguesApiRobot留言 | 貢獻 所做的修訂 (從 JSON 檔案批量匯入)

(差異) ←上個修訂 | 已批准修訂 (差異) | 最新修訂 (差異) | 下個修訂→ (差異)

JSONPJSON with Padding)是資料的格式 JSON 的一種「使用模式」,會當予網頁對別的網頁取得資料。一个解決這个問題的新方法是跨來源資源共享。

因為同源策略,一般來講位佇 server 一 . example . com 的網頁無法度佮 server 二 . example . com 的侍服器溝通,而且 HTML 的 ` < script > ` 元素是一个例外。利用 ` < script > ` 元素的這个開放策略,網頁會當得著對其他的來源動態產生的 JSON 資料,抑若這種使用模式就是所謂的 JSONP。用 JSONP 掠著的資料並毋是 JSON,是任意的 JavaScript,用 JavaScript 直譯器執行毋是用 JSON 解析器解析。

原理

為著欲理解這个模式的原理,先共想像有一个回傳 JSON 檔案的 URL,而且 JavaScript 程式會當用 XMLHttpRequest 佮這个 URL 愛資料呢。準講咱的 URL 是 http : / / server 二 . example . com / RetrieveUser ? UserId=xxx。假使小明的 UserId 是一千八百二十三,而且做瀏覽器透過 URL 傳小明的 UserId,就是掠 http : / / server 二 . example . com / RetrieveUser ? UserId=一千八百二十三,得著:

這乎 JSON 資料可能是根據傳過去 URL 參數動態產生的。

這个時陣,共 ` < script > ` 元素的 src 屬性設做一个回傳 JSON 的 URL 是會當想像的,這嘛是代表對 HTML 頁面透過 script 元素掠 JSON 是可能的。

毋過,一份 JSON 檔案並毋是一个 JavaScript 程式。為著予瀏覽器會當佇 ` < script > ` 元素執行,對 src 內底 URL 回傳的著愛是好執行的 JavaScript。佇咧 JSONP 的使用模式內底,該 URL 回傳的是由函式呼叫包起來的動態生成 JSON,這就是 JSONP 的「填充(padding)」 抑是講「前停(prefix)」 的由來。

慣例上瀏覽器提供回調函式的名稱當做送到侍服器的請求中號名查詢參數的一部份,比如講:

侍服器會來傳予瀏覽器頭前將 JSON 資料補充到回呼函式(parseResponse)中。瀏覽器得著的回應已經毋是單純的資料敘述是一个指令碼,按呢瀏覽器就會當呼叫該函式進行處理。佇本例中,瀏覽器得著的是:

填充

雖然這填充(前停)「 通常」是瀏覽器執行背景中定義的某一个回調函式,伊嘛是會當變數有價值、if 講抑是其他的 JavaScript 敘述。JSONP 要求(也就是使用 JSONP 模式的請求)的回應毋是 JSON 嘛無啥物人當做 JSON 解析—— 回傳內容會當是任意的運算式,甚至無需要有任何的 JSON,毋過慣例填充部份猶是會吸引發函式呼叫的一段 JavaScript 片段,這个函式呼叫做作用佇咧 JSON 格式的資料上的。

另外一種講法—典型的 JSONP 就是共既有的 JSON API 用函式呼叫包起來以達到跨域存取的解法。

Script 元素「注入」

為著欲啟動一个 JSONP 搧叫(抑是講,使用這个模式), 你需要有一个 script 元素。所以,瀏覽器著愛為著逐个 JSONP 要求加(抑是重用)一个新的、有需要 src 值的 ` < script > ` 元素到 HTML DOM 內底—抑是講「注入」這个元素。瀏覽器執行該元素,掠取 src 內底的 URL,猶閣執行回傳的 JavaScript。

嘛因為按呢,JSONP 予人號做是一種「予使用者利用 script 元素注入的方式踅開同源策略」的方法。

安全的問題

使用遠端網站的 script 標籤會予遠端網站通注入任何的內容至網站內底。若遠端的網站有 JavaScript 注入去空隙,原來的網站嘛會受著影響。

這馬有一个當咧進行計畫咧定義所謂的 JSON-P 嚴格安全子集,使瀏覽器會當對 MIME 類別是「application / json-p」請求做強制處理。若是回應袂使予人解破做嚴格的 JSON-P,瀏覽器會使擲出一个錯誤抑是忽略規个回應。

跨站請求偽造

粗略的 JSONP 部署真容易受著跨站請求偽造(CSRF / XSRF)的攻擊。因為乎 HTML ` < script > ` 標籤佇瀏覽器內底無遵守同源策略,惡意網頁會當要求並取得屬於其他的網站的 JSON 資料。做使用者正登入彼个其他網站的時陣,頂懸的狀況予這个惡意網站會當佇歹意網站的環境之下操作該 JSON 資料,可能是洩漏使用者的密碼抑是其他敏感資料。

干焦佇咧該 JSON 資料有含袂當洩漏予第三方的隱密資料,而且侍服器干焦靠瀏覽器的同源策略阻擋無正常要求的時陣這才會是問題。若侍服器家己決定欲求的專有性,並只要求正常的情況下輸出資料無問題。干焦靠 Cookie 並無夠決定要求是合法的,這真容易受著跨站請求偽造的攻擊。

歷史

二空空五年熱天,喬治 ・ 詹姆提(George Jempty)建議佇咧 JSON 頭前選擇性的加上變數人數。鮑榮 ・ 他波利托(Bob Ippolito)佇二空空五年十二月提出 JSONP 上原始的提案,其中添充部份已經是回調函式,這馬已經有足濟 Web 二嬸零應用程式使用這份提案,像講 Dojo Toolkit 應用程式、Google Web Toolkit 應用的程式佮 Web 服務。

參考文獻

外部連結

  • JSONP 頭頁 . [二千空一十一孵六孵二十七] .(原始內容存檔佇兩千空一十六五三分四)(英語).