XSS 防禦筆記 PHP & Laravel 2022-09-13 11:34:18

最近在接觸網頁資安防禦的領域
多少聽過XSS (Cross-Site Scripting)
以前只知道是利用連結帶入語法或參數來渲染目標網頁
這次想要深入研究內容和防禦方法
參考的資料是芥龍於第11屆鐵人賽的文章
我只取比較想記錄的內容和一些補充

XSS原理
echo'Hello, '.$_GET['name'];
此時若使用 /?name=<script>alert('XSS')</script> 就可以直接跳出一個 alert。
XSS 真正的危險在於:它可以取得這個網站的 cookie 等資訊--這通常是拿來存在使用者憑證的地方
當然,XSS 的危害不止於盜竊用戶憑證,例如透過今年的 CVE-2019-5786 在 Chrome 上執行後直接在對方電腦執行程式。


錯誤的防禦方式
1.輸出時移除"script"
echo str_replace('script', '', $_GET['name']);
破解法 : /?name=<sscriptcript>alert('XSS')</sscriptcript>

2.用 strip_tags()
echo strip_tags($_GET['name']);
它不會檢查輸入的內容是否為 HTML,既亦可能產生無法解析的 HTML
對於某些 allowed_tags(strip_tags 的第二個參數)可能仍然會存在 XSS 問題

echo strip_tags('<img src="a.jpg" onload="alert(1)"/>', '<img>');
上述內容中,<img> 是可使用的 tag,所以內容依然會被輸出,而 onload 事件中可以執行 Javascript,故仍然可以觸發 XSS。

防禦方式
就理論上來說,htmlspecialchars() 與 htmlentities() 都是正確答案。
但我這邊只講htmlspecialchars() 要看另外一個介紹請看原文章
htmlspecialchars() 是僅替換需要進行 HTML 編碼的字元(<、>、&、" 及 ')
Laravel 的 {{ }} 就是用 htmlspecialchars() 如果不想取代html的tag就使用 {!! !!}
值得注意的是,在使用這個函式時務必要加上合適的參數。

第二個參數表示使用的規則(替換單、雙引號或無效字元的處理等)
第三個參數表示使用的編碼(通常以 UTF-8 為主)

文章只引用到這邊,如果需要看更詳細的內容再請至原文章看
https://ithelp.ithome.com.tw/articles/10214398