JSONP:
- 首先,因为ajax无法跨域
- 其次,开发者发现, 标签的src属性是可以跨域的(没有跨域限制),进而使用此种方式进行跨域
- 服务端支持:传递一个callback参数给跨域服务端,然后跨域服务端返回数据时会将这个callback参数作为函数名来包裹住json数据即可。
JSON导致的XSS漏洞
<! DOCTYPE html >
< html lang="en" >
< head >
< meta charset="UTF-8" >
< title > jsonp下XSS注入 < /title>
< /head>
< body >
< script >
function myCallback(jsonObject) {
//函数内容
}
< script src="https://接口?callback=myCallback" >< /script>
< /body>
< /html>
以上是一个带参数的 JSONP 形式的跨域请求。注意,myCallback 为自定义的 callback 函数名。
个人理解:对于支持JSONP的接口,即:get请求+满足JSONP第三条,就可能产生像XSS漏洞等风险。
示例假如:网站X,使用以上代码形式,将src设置为我方接口,而 ?callback=【js代码】。此时,就会发生XSS漏洞,浏览器执行注入的js代码。
XSS解决方案
接口这样设计的目的也正是为了满足JSONP跨域调用的场景,此处的解决方案是:
HtmlUtils.htmlEscape(request.getParameter(CALLBACK));
通过把传入的callback
进行html字符转义,已解决XSS注入漏洞。