JSONP是数据格式JSON的一种“使用模式”,可以让网页从别的网域要数据,利用script元素开放策略,网页可以从其他来源动态产生的JSON数据,而这种使用模式就是所谓的 JSONP。
JSONP 是数据格式 JSON 的一种“使用模式”,可以让网页从别的网域要数据。另一个解决这个问题的新方法是跨来源资源共享。利用 script 元素的这个开放策略,网页可以得到从其他来源动态产生的 JSON 数据,而这种使用模式就是所谓的 JSONP。用 JSONP 抓到的数据并不是 JSON,而是任意的 JavaScript,用 JavaScript 解释器运行而不是用 JSON 解析器解析。
为了要引导一个 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 并不够决定要求是合法的,这很容易受到跨站请求伪造攻击。