今天簡單介紹一下網頁常見的安全問題
XSS 是指攻擊者將惡意JavaScript放到網站中,在使用者的瀏覽器上執行,可能竊取敏感資訊、session、或進行釣魚行為
主要分為三種類型:反射型(Reflected)、儲存型(Stored)和基於DOM的(DOM-based),先來一一介紹他們是如何攻擊的
如何攻擊:
攻擊者會在URL中嵌入惡意的腳本,誘導使用者點入。當使用者一點擊,就會開始進行一次性攻擊
如何防禦:
如何攻擊:
攻擊者會將惡意的腳本存在網頁的資料庫或留言板、評論區中,在使用者瀏覽頁面時就會自動執行
如何防禦:
伺服器端必須對輸入資料過濾與驗證
輸出到網頁前一定要HTML編碼(escape output),這個意思是如果留言板有輸入一串訊息:
<script>alert("Attack")</script>
沒有轉換成純文字,就會把他直接當JS執行,就會跳出一個alert,這樣如果<script></script>
裡面放了惡意的程式碼,就會把這串留言的訊息轉換成JS執行,會跳出alert。而安全的做法就是要對輸入做HTML的escape的純文字轉換,就會把<
變成<
整個寫起來像這樣 <script>alert(”Attack”)</script>
使用安全的模板引擎(就會自動把訊息變成escape的純文字,如前端的Vue/React/EJS/Nunjucks…),避免直接把資料拼進HTML
如何攻擊:
攻擊者透過JavaScript操作 DOM(例如用 innerHTML
、eval()
等),攻擊者操控 URL 或其他 DOM 中的可控來源
如何防禦
innerHTML
、document.write
、eval()
等危險 APItextContent
、innerText
或安全的 DOM API攻擊者透過隱藏的表單或圖片請求,誘導使用者在已登入的狀態下,對目標網站發送惡意請求(例如轉帳、改密碼)
攻擊者把合法網站嵌在透明的 <iframe>
裡,誘導使用者以為點擊的是按鈕,實際上是在操作另一個網站(例如按下「轉帳」)
X-Frame-Options: DENY
或 SAMEORIGIN
Content-Security-Policy: frame-ancestors 'self'
img-src
)、字體(font-src
)、iframe(frame-src
)等預設情況下,CSP 會封鎖所有 <script>
內嵌程式碼
若真的需要,可以用 nonce
或 hash
來允許特定程式碼執行
nonce
(number used once,一次性隨機字串)
<script>
上加上這個字串,例如:<script nonce="abc123">console.log("安全的 inline script");</script>
CSP Header 要寫:
Content-Security-Policy: script-src 'self' 'nonce-abc123'
只有帶有 nonce="abc123"
的 <script>
會執行
hash
(程式碼雜湊值)
<script>console.log("hello world");</script>
對 console.log("hello world");
算 SHA256,得到:
Content-Security-Policy: script-src 'self' 'sha256-AbCdEfGhIjK...'
瀏覽器只允許這段程式碼跑,其他的 inline script 都會被封鎖
https://www.securityverse.tw/index.php/2023/03/30/elementor-632/
https://www.explainthis.io/zh-hant/swe/what-is-csrf
https://developer.mozilla.org/en-US/docs/Web/Security/Attacks/Clickjacking
https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/CSP