XSS介紹
維基百科: 跨站指令碼(英語:Cross-site scripting,通常簡稱為:XSS)是一種網站應用程式的安全漏洞攻擊,是程式碼注入的一種。它允許惡意使用者將程式碼注入到網頁上,其他使用者在觀看網頁時就會受到影響。
比如,一個網站的評論區,使用者可以輸入<script>
標籤,如圖:
點選submit傳送內容,如果前端後端都沒有做任何處理的話,這段評論在提交以後就會原封不動地展示在html上。而這個時候,script裡的程式碼執行了,導致所有訪問這個頁面的使用者的cookie都傳送到了黑客指定的API。
解決思路
前端
提交過程
前端對於這種情況好像在傳送到後端的過程中無能為力,即使在流程中加上前端轉譯,黑客也可以通過直接在控制檯執行js的方式來提交評論。
渲染過程
前端倒是在渲染的時候可以做相應的處理,比如可以用以下方法處理:
processedContent(comment) {
return comment
.replace(/&/g, "&")
.replace(/</g, "<")
.replace(/>/g, ">")
.replace(/"/g, """)
.replace(/'/g, "'")
}
複製程式碼
這樣就能處理掉非法符號了(程式碼僅列舉了部分符號)。
& < >
這些字元叫做字元實體因為比如< >
這樣的字元遊覽器會認為是標籤,所以,如果想正常顯示< >
,那麼就得轉成字元實體,而遊覽器預設也認識這些字元,在展示的時候,還是展示成字元實體對應的符號。
對於渲染階段,像react,vue這樣的庫,又或者是juicer,ejs這樣的前端模板,都會預設處理非法符號為字元實體。
字元實體詳解可以看這裡>>
後端
提交過程
後端在收到前端的提交以後,直接存起來就好。
渲染過程
這裡的渲染指的是後端模板渲染,渲染模板可能是smarty,可能是laravel的blade,可能是node做中間層用的ejs,亦可能是vue或react的SSR。這些後端模板都自己內部會做轉義。 轉義的實現方法也無非是通過正則匹配,然後進行替換。
例外
在遇到富文字編輯器的時候,處理方法就不同了。因為,在前端展示的時候,我們自然是有什麼標籤就展示什麼標籤,而不是轉為字元實體,不然得到的不都是文字了嘛。 這種情況的話,就需要後端進行非法字元過濾了,把比如script這種標籤給過濾掉,或者轉義掉。當然,其實富文字還有很多過濾條件,比如,非本站的網頁地址過濾,非法字元過濾等。
總結
總之,無論是後端模板還是前端模板,其實都是前端的範疇。 上面也說了,現在的前端庫、前端模板、後端模板,都已經內部做了轉譯了,開發者愉快的使用就好了。 所以,其實除了遇到富文字編輯器的情況(工作量在後端),我們幾乎不用做任何額外的工作。但是,還是理解內部機制比較好。