JSONP(JSON with Padding)是一種非官方的跨域通訊協議。它利用 <script> 標籤不受同源策略限制的特性,透過動態插入腳本標籤向伺服器發起請求,伺服器則返回一段包裹在回呼函數中的 JavaScript 代碼,從而實現跨域數據傳輸。雖然現代開發多改用 CORS,但 JSONP 仍是理解跨域機制的重要基石。
瀏覽器的同源策略禁止網頁使用 XMLHttpRequest 向不同源的伺服器發送請求。然而 <script>、<img>、<link> 等標籤的 src/href 屬性不受此限制。JSONP 巧妙地利用這一點:客戶端定義一個回呼函數,伺服器返回 callbackName({...json data...}) 形式的腳本,瀏覽器執行該腳本時便會自動調用回呼,將數據傳遞給業務邏輯。
<script src="/json/people/cleverpig/jsonp/refreshPeopleInfo"></script>,請求伺服器資料。refreshPeopleInfo({"name":"...","age":...,"talking":"..."})。refreshPeopleInfo 函數,更新頁面顯示。
eval() 濫用:早期庫常用 eval() 解析 JSON,若輸入未嚴格驗證,極易導致代碼注入。var my_JSON_object = !(/[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test(
text.replace(/"(\\.|[^"\\])*"/g, ''))) &&
eval('(' + text + ')');
JSON.parse():現代瀏覽器原生支援,避免 eval() 風險。Content-Type: application/javascript; charset=utf-8,並配合 X-Content-Type-Options: nosniff。JSONP 以極簡方式解決了早期跨域難題,但其本質是「信任伺服器執行任意腳本」,安全隱患難以根除。現代前端開發應以 CORS 為主,JSONP 僅作為舊系統維護或極少數不支援 CORS 環境的備選方案,並嚴格落實上述防護措施。