你有沒有想過,網址列裡那串東西,網頁其實是會「讀」它的?

很多網站會把網址裡的參數,直接顯示在頁面上。舉個最常見的例子,一個搜尋頁。

你搜「貓」,網址會變成這樣:

example.com/search?q=貓

然後頁面上出現「你搜尋了:貓」。看起來超正常對吧。

但問題來了。如果我搜的不是「貓」,而是一段 HTML 呢?

example.com/search?q=<h1>哈囉</h1>

如果這個網站沒處理好,頁面上的「哈囉」就會變成一個超大的標題。因為網頁把我丟進去的東西,當成 HTML 渲染出來了。

那如果我丟的不是 <h1>,而是一段 JavaScript 呢?

example.com/search?q=<script>偷東西的程式碼</script>

這段 script,就會在「打開這個網址的人」的瀏覽器裡乖乖執行。這就是 XSS,跨站腳本攻擊。

為什麼這超可怕

因為那段程式碼,是用「受害者的身分」在跑的。它可以:

  1. 偷走他的登入狀態,直接變成他本人
  2. 幫他發文、改密碼、亂買東西
  3. 弄一個假的登入框,騙走他的帳號密碼

而你要做的,可能只是傳一個連結給他,等他點下去。

不是只有網址

輸入框也一樣。留言、暱稱、個人簡介,任何「你打字、網站顯示出來」的地方,只要網站沒處理好,都可能變成入口。差別只在於:

  • 藏在網址裡的,要騙人點連結(一次性)
  • 存進資料庫的(像留言),之後每個看到的人都會中(殺傷力更大)

一句話記住它

XSS 的本質,講穿了就一句:

網站把「使用者給的資料」,當成「程式碼」執行了。

你以為你只是在填搜尋框、留個言,但只要網站沒把你的輸入當成單純的文字,而是當成可以執行的 code,洞就開了。

想知道怎麼防?

這篇先讓你「看懂」它怎麼發生。如果你有在寫網站、想知道怎麼把這個洞補起來,看進階那篇:XSS 是什麼?一篇搞懂,以及怎麼防

這篇你只要先記得一件事:你丟給網頁的東西,它可能會照單執行。