如何有效實施內容安全政策(CSP)來保護你的網站免受攻擊

CSP

今天來聊聊一個可能你有點兒熟悉的技術名詞,那就是CSP。

CSP全名是「內容安全政策」(Content Security Policy),它其實就像是一個網站的保鏢,幫助防止像是跨站腳本(XSS)這樣的網絡攻擊,還有其他一些可能讓網站出問題的狀況。CSP讓網站的管理者可以設定一些規則,比如說哪些內容是可以的,哪些是不行的,這樣就可以控制網站能夠加載哪些資源。

想象一下,CSP就像是一個門衛,根據你給的規則,決定哪些外部的內容(比如JavaScript程式、CSS樣式表、圖片等)可以被加載到你的網頁上。舉個例子,你可以設定一條規則,只允許從你信任的伺服器上加載程式,這樣就能防止壞人把有害的程式碼放到你的網站上,從而保護訪客的安全。

使用CSP的好處是可以給你的網站多加一層保護,幫助避免一些網絡攻擊。但是,設定CSP可能需要點技術知識,而且要小心維護和更新這些規則,以確保它不會阻擋網站上的正常功能。

原理講完了,來帶給大家一些小範例

要設定內容安全政策(CSP),你需要在網站的HTTP響應頭部中加入一個特別的Content-Security-Policy頭部。這個頭部定義了一系列的指令,這些指令指明了哪些類型的內容(例如腳本、圖片、CSS等)可以從哪些來源加載。以下是一些基本的CSP設定範例:

基本CSP範例

  1. 只允許從同一來源加載所有內容

    Content-Security-Policy: default-src 'self';
    

    這個政策將只允許從同一來源(也就是提供HTML的同一服務器)加載所有內容。

  2. 分開指定不同類型的資源

    Content-Security-Policy: default-src 'self'; script-src 'https://scripts.example.com'; img-src 'https://images.example.com'; style-src 'https://styles.example.com';

    這裡,只有來自指定URL的腳本、圖片和CSS可以被加載。

  3. 允許從特定來源加載腳本,同時禁止內嵌腳本和eval()

    Content-Security-Policy: script-src 'self' https://api.example.com;
    

    這個政策允許從原始服務器和https://api.example.com加載腳本,但不允許內嵌腳本和eval()。

    1. 允許從任何來源加載圖像

  4. Content-Security-Policy: img-src *;

    這表示圖像可以從任何來源加載。

    實施CSP的提示

    • 使用報告模式:你可以將政策設置為Content-Security-Policy-Report-Only,這樣就可以先試運行CSP,看看哪些內容會被阻擋,而不會真的封鎖這些內容。

      1. Content-Security-Policy-Report-Only: default-src 'self'; report-uri /csp-violation-report-endpoint;
        • 這裡的report-uri指令會指定一個端點,用於收集CSP違規報告。

        • 添加非指令的來源:你可以使用像'nonce-...'(用於單次使用的標記)和'sha256-...'(用於特定腳本的散列)這樣的來源,以增加靈活性和安全性。

實施注意事項

  • 在實施CSP時,可能需要一些時間來調整政策,以確保它不會破壞網站功能。

  • 考慮使用CSP生成器或評估工具來幫助創建和檢查你的政策。

  • 定期審核和更新你的CSP,尤其是在添加新的第三方腳本或更改網站結構時。

CSP是一個強大的工具,但要注意,錯誤的配置可能會導致網站功能出現問題。因此,建議在開發和測試環境中進行充分的測試,然後才在生產環境中部署。

照例提供一些我覺得還不錯的文章分享給大家

Content-Security-Policy – HTTP Headers 的資安議題 (2)

Cross site scripting 評估工具-CSP Evaluator

CSP (Content-Security-Policy) Header Test

發佈留言