解决安全性问题,主要涉及两点:
(1) 前后端约定jsonp请求的js的回调函数名
(2) 服务器端指定返回的数据格式为json
(3) 进行referrer验证 ($_SERVER['HTTP_REFERER'] 中的 host,是否在白名单内)
以下是事例代码:
1. 前端js发起ajax跨域jsonp请求:
$.ajax({ type: "GET", url: "http://xxx.com/getData", dataType: "jsonp", jsonp: "callbackParam", //自定义callback参数名称,可将默认的参数名称callback自定义成myCallback等其他名称 jsonpCallback:"getData", //自定义callback的js函数名 success: function(data) { ... } });
2. 服务器端返回数据:
public function getData(){ //指定返回的数据格式,以便于可执行js函数 header("Content-type: application/javascript"); $callback = $this->_param('callbackParam'); //约定只接受某个js回调函数名 if($callback != 'getData') { $callback = 'getData'; } $data = array(...); echo $callback.'('.json_encode($data).')'; exit; }