說說 JSONP 和 XSS

JSONP
先說 JSONP。通過 JavaScript 調(diào)用,被調(diào)用域名和當(dāng)前頁面域名不一致,就需要用到 JSONP。不過我不太推薦這么跨域調(diào)用。
如果真的要解決跨域問題,我覺得有幾個(gè)不錯(cuò)的方法,一個(gè)是兩組服務(wù)器配上相同的域名。還有就是自己的服務(wù)器 nginx 上做一個(gè)轉(zhuǎn)發(fā)。
XSS
跨站腳本(英語:Cross-site scripting,通常簡稱為:XSS)是一種網(wǎng)站應(yīng)用程序的安全漏洞攻擊,是代碼注入的一種。它允許惡意用戶將代碼注入到網(wǎng)頁上,其他用戶在觀看網(wǎng)頁時(shí)就會(huì)受到影響。這類攻擊通常包含了HTML以及用戶端腳本語言。

上面是維基百科的解釋。實(shí)際一點(diǎn)的例子可以看看我文本的頭圖。頁面被注入了一張圖片。惡意的注入可以注入一段腳本。
問題原因
瀏覽器為了保證跨域訪問的安全性,會(huì)默認(rèn)發(fā)一個(gè) callback 參數(shù)到后臺(tái),接口拿到這個(gè)參數(shù)之后,需要將返回的 JSON 數(shù)據(jù)外面包上 callback 參數(shù)。
具體的返回格式:
CALLBACK(JSON)

如果 ajax 請求是 JSONP 請求,返回的內(nèi)容瀏覽器還會(huì)自動(dòng)檢測,如果不是按這個(gè)格式返回或者 callback 的內(nèi)容不對,這次請求就算失敗了。
這里有一個(gè)機(jī)制,那就是請求的 callback 會(huì)被放入返回的內(nèi)容當(dāng)中,這也是可能出問題的地方。
支持 JSONP 的鏈接如果直接放到瀏覽器里面訪問,瀏覽器就不會(huì)做 callback 校驗(yàn)了。
Content-Type: application/json
瀏覽器渲染就是靠 Content-Type 來做的。如果返回內(nèi)容標(biāo)記是 json,哪怕 body 里面都是 html 的標(biāo)簽,瀏覽器也不會(huì)渲染。所以,如果接口返回的不是 html,千萬不要寫成 html。
Content-Type: text/html
如果返回的內(nèi)容是頁面,html類型。那么 callback 注入的 html 元素都可以直接放到頁面上了。那么,html 頁面必然不能支持 callback。
解決方法
就是前面說到的,Content-Type 不要亂用,嚴(yán)格按照標(biāo)準(zhǔn)協(xié)議來做。目前的框架默認(rèn)肯定會(huì)檢測一下內(nèi)容類型,如果不是很必要,不要手動(dòng)設(shè)置。因?yàn)橛锌赡芏噢D(zhuǎn)發(fā)幾次 Content-Type 就被改了。
callback 做長度限制,這個(gè)比較 low。
檢測 callback 里面的字符。一般 callback 里面都是字母和數(shù)字,別的符號(hào)都不能有。
callback 做一個(gè)編碼,如果用 Go 語言做的話,如下。對所有 callback 都處理。
callback = template.JSEscapeString(callback)

完整代碼可以參考這里。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容