XSS (Cross-site Scripting)
簡單來說,XSS 即是在別人的網站,執行 JaxaScript 程式碼。在 HTML 裡使用<script>
的標籤,可以讓網頁有更好的互動跟動態效果;但如果有人透過特定網站寫入任何 JavaScript 程式碼,就有機會讓有心人士竄改網頁、導入釣魚網站竊取使用者敏感資料的疑慮。
XSS 攻擊類型,共分成三個類型
1.儲存型 XSS
駭客透過網頁上的可輸入資料的欄位寫入惡意程式碼,讓瀏覽器連同惡意程式碼也一起執行;若是惡意程式碼經由使用者輸入之後,存入資料庫裡,後續網站使用者也會看到被惡意程式碼修改過的內容。這樣的攻擊常見於將用戶資料存放資料庫的網站,例如社群網站、或是有提供商品評論、用戶留言的服務的網站,都有機會遭受到儲存型 XSS 的攻擊。
2.反射型 XSS
駭客在網址列上,把惡意程式藏在 URL 裡面,透過 URL 能傳遞參數的機制,透過網址搜尋、狀態顯示、跳轉等功能的操作,誘導使用者點開網址,藉此達到反射型 XSS 的攻擊。反射型與儲存型 XSS 最大的不同是:反射型 XSS 的惡意代碼會出現在 URL 裡面,儲存型 XSS 的惡意代碼,會透過使用者的操作,將含有惡意的程式碼資料存入資料庫。
3.DOM 型 XSS
DOM 型 XSS 主要會發生在當瀏覽器接收到駭客寫入惡意程式碼,接收執行之後,再由前端的程式碼去執行被植入惡意程式碼的行為。DOM 型 XSS 由於是在瀏覽器端發生,與前端的程式碼維護相關。若是網頁前端中的程式碼內,有使用到 .html()
或是 .innerHTML()
等的語法,要特別小心駭客會插入不可信任的程式碼或是連結。 為了避免類似的攻擊 .innerText
的寫法會比較安全。
XSS 的防範:透過 PHP 跳脫字元的內建函式:htmlspecialchars()
透過跳脫字元函示,把內容轉譯成純文字,而不是程式碼。建議在資料輸出之前進行編碼;存進資料庫,還是以明文儲存,避免之後資料在跨平台使用時(例如:ios、android 等平台系統),原始資料不至於讓人無法解讀。
特別提醒自己,不要心存僥倖心態,escape 要做好做滿,把任何要輸出資料的地方(例如使用者暱稱),都編碼過後再輸出,確實建立好資安防線。
- utils.php
<?php
function escape($str) {
return htmlspecialchars($str, ENT_QUOTES);
}
?>
- index.php
<p class="card__content"><?php echo escape($row['content']); ?></p>
額外補充,另外一個需要注意 XSS 攻擊的地方
// 雖然已針對 $link 做過編碼,但若是能夠掌握 $link 輸出的話,就可以控制內容
<a href="<?php echo htmlspecialchars($link) ?>">my blog</a>
<a href="javascript:alert(1)">my blog</a>
- 防範方法
// 禁止使用 JS 代碼、以及非法 scheme 等語法
allowSchemes = ["http", "https"];
valid = isValid( $link, allowSchemes);
if (valid) {
<a href="<?php echo htmlspecialchars($link) ?>">
my blog
</a>
} else {
<a href="/404">
my blog
</a>
}