一、PHP寫jsonp
如果你的網站或者應用需要調用第三方接口并且獲取返回的數據,可能會遇到瀏覽器同源策略的限制。這時候jsonp(JSON with Padding)就派上用場了,它通過在URL末尾傳遞一個callback函數名,讓服務端返回JavaScript代碼,從而讓瀏覽器可以讀取到數據。PHP作為一種流行的Server Side Scripting語言,可以通過簡單的代碼實現jsonp。
例如,我們要請求新浪微博API中的熱門微博數據,由于新浪微博API不允許直接跨域訪問,我們可以這樣進行處理:
$callback = isset($_GET['callback']) ? $_GET['callback'] : 'callback';
$api_url = 'https://api.weibo.com/2/statuses/hot.json?count=5&source=140226478';
$content = file_get_contents($api_url);
echo $callback.'('. $content .')';
這里我們首先判斷參數中是否含有callback函數名,如果有則使用該函數名,否則默認使用callback作為函數名。然后使用file_get_contents()函數獲取新浪微博API返回的數據,最后通過echo返回jsonp格式的內容。
二、實現jsonp回調函數
在上述例子中,我們可以看到使用了callback函數名作為參數傳遞。當瀏覽器接收到服務器端返回的數據時,會去尋找名為callback的函數并執行,從而實現回調的目的。
例如:
function jsonp_cb(data) {
console.log(data);
}
<script src="jsonp.php?callback=jsonp_cb"></script>
我們定義了一個名為jsonp_cb的JavaScript函數,并將其作為callback參數傳遞給服務端的jsonp.php文件。服務端返回了JSON格式的數據,并調用了jsonp_cb函數,從而在瀏覽器控制臺輸出了獲取到的數據。這種方式在前端開發中非常常見。
三、PHP避免XSS攻擊
jsonp格式是一種前后端分離的技術,服務端只負責返回數據,而不負責渲染HTML。因此,我們需要注意防范XSS攻擊。在進行數據處理時,我們可以使用htmlentities()或htmlspecialchars()等函數對數據進行轉義處理,從而避免惡意用戶插入攻擊代碼破壞頁面。
$callback = isset($_GET['callback']) ? $_GET['callback'] : 'callback';
$api_url = 'https://api.weibo.com/2/statuses/hot.json?count=5&source=140226478';
$content = file_get_contents($api_url);
$content = htmlentities($content, ENT_QUOTES, 'UTF-8');
echo $callback.'('. $content .')';
使用htmlentities()函數對$content中的數據進行了HTML實體化轉換,防止了特殊字符被解釋成HTML代碼。
四、小結
PHP作為一種流行的Server Side Scripting語言,可以用來編寫jsonp接口。在實現jsonp接口時,我們需要注意避免XSS攻擊,將特殊字符進行轉義處理。同時,在使用jsonp技術時,要注意跨站腳本攻擊的風險,防止惡意代碼的插入。通過本文的介紹,相信大家對PHP寫jsonp有了更深入的了解。