如何在 WordPress 中添加 HTTP 安全標頭
已發表: 2023-05-18WordPress 是世界上最受歡迎的內容管理系統 (CMS),運行著43% 以上的互聯網網站。然而,它的廣泛使用使其成為黑客的共同目標。
蠻力攻擊、文件上傳漏洞和跨站點腳本攻擊都會導致持續威脅。
幸運的是,有多種方法可以讓您的網站更安全、更不容易受到攻擊。這就是 HTTP 標頭髮揮作用的地方。
通過實施 HTTP 安全標頭,您可以限制瀏覽器和服務器可以在您的網站上執行的操作並添加額外的安全層。 這些標頭使攻擊者更難利用客戶端漏洞。
在本文中,我們將討論什麼是 HTTP 安全標頭以及如何在您的網站上有效地實施它們。
什麼是 HTTP 安全標頭?
HTTP Security Headers 是 Web 應用程序用來在 Web 瀏覽器中實現安全防禦的一組指令。 這些標頭在 Web 瀏覽器(客戶端)和服務器之間交換,以識別 HTTP 通信的安全參數。 這種信息交換告訴瀏覽器在與您的站點交互的整個過程中如何表現,並管理顯示錯誤和管理緩存等過程。
當然,這種額外的安全性和效率在很大程度上取決於瀏覽器。 較舊的 Web 瀏覽器不會具有相同級別的安全性或兼容性,並且可能無法正確、完整或什至根本無法處理 HTTP 安全標頭。 這可能意味著,儘管您盡一切努力幫助訪問者保持安全,但他們過時的瀏覽器仍然使他們容易受到攻擊。 作為網站開發人員,我們應該竭盡所能,但必須承認,從訪問者的角度來看,確保他們在計算機上使用最新的軟件是他們的責任。 只要他們使用現代、最新的網絡瀏覽器,我們對 HTTP 安全標頭的使用就會與他們的瀏覽器軟件一起使用,以確保他們的安全。
然而,我們主要擔心的是 HTTP 安全標頭可防止您的網站遭受常見攻擊,例如跨站點腳本和暴力攻擊。實現這些標頭的最有效方法是將它們設置為您的 WordPress 託管帳戶(服務器級別)並使用 DNS 級別的網站應用程序防火牆,例如 Cloudflare。
但您需要記住,雖然添加 HTTP 安全標頭有助於提高您網站的安全性,但這只是網站安全的一個方面,應與其他安全措施結合使用。 這包括保持您的應用程序和插件更新、加密您的敏感數據以及備份站點數據和配置文件。
在討論添加安全標頭的不同方法之前,讓我們詳細了解每個標頭並了解其重要性的原因。如果您已經熟悉安全標頭,則可以跳到下面的部分。
WordPress HTTP 安全標頭的類型
有幾個 HTTP 安全標頭可用於您的 WordPress 網站以增強保護。 讓我們來看看一些最重要的。
1. X-XSS 保護安全頭
此安全標頭用於配置跨站點腳本 (XSS),這是一種安全漏洞,允許未經身份驗證的第三方在瀏覽器中代表另一個網站執行代碼。
如果檢測到攻擊,它會阻止網站呈現,從而防止對您網站的許多 XSS 攻擊。 X-XSS 採用更安全的選擇,即不完全加載站點,而不是嘗試通過替換潛在有害元素來清除頁面。
標頭可以具有以下幾個值之一:
- X-XSS-Protection: 0 禁用 XSS 過濾(不推薦)
- X-XSS-Protection:1 啟用 XSS 過濾,這通常是大多數瀏覽器的默認設置。 如果檢測到 XSS 攻擊,瀏覽器將刪除頁面的不安全部分(清理)。
- X-XSS-保護:1; mode=block 啟用 XSS 過濾,但瀏覽器不會清理頁面,而是阻止頁面呈現(推薦)
- X-XSS-保護:1; report=<reporting-uri> 啟用 XSS 過濾。 如果檢測到跨站點腳本攻擊,瀏覽器將清理頁面並報告違規。
2. X-Frame 選項安全標頭
X-Frame-Options 安全標頭可用於防止不同的暴力攻擊和 DDOS 攻擊,但它最有效的用途是防止 WordPress 網站上的交叉劫持 iframe 和點擊劫持。此標頭允許您決定是否可以使用瀏覽器中的 iframe 元素嵌入您網站上的頁面。
X-Frame Option 通過阻止 iframe 填充您的網站來保護您的網站免遭點擊盜竊。 它有兩個不同的指令可供您選擇——DENY和SAMEORIGIN 。 它適用於所有流行的網絡瀏覽器,例如 Chrome、Safari、Firefox 和 Opera。
X 框架選項:拒絕
X 框架選項:SAMEORIGIN
當使用 DENY 指定時,如果任何瀏覽器在從其他站點加載時嘗試在框架內加載頁面,則 X-Frame-Options 標頭將導致失敗。 當從原始站點加載到 iframe 時,嘗試這樣做也會失敗。 另一方面,如果我們指定SAMEORIGIN ,我們仍然可以在框架中使用該頁面——只要將它包含在框架中的站點與為該頁面提供服務的站點相同。
此標頭對於包含敏感信息的網頁和嵌入支付網關和表單等信息的網頁尤為重要。
3. HTTP 嚴格傳輸安全 (HSTS) 標頭
HTTP Strict-Transport-Security 是一個安全響應標頭,從 Web 服務器發送到用戶的 Web 瀏覽器,以通知它只能使用 HTTP 訪問該站點,絕不能通過未加密的 HTTP 訪問該站點。
此標頭提供了一種機制來強制瀏覽器使用 HTTPS ,即使用戶在地址欄中鍵入“http://”或訪問 HTTP 鏈接也是如此。它還可以防止用戶忽略過期或無效的 SSL/TLS 證書和其他瀏覽器警告。 HSTS 值是根據訪問該網站的瀏覽器設置的。 它不是每台機器設置的。
HSTS 標頭提供了包含任何子域的選項——您可以使用“includeSubDomains”指令從根域採用相同級別的安全性。 這意味著任何使用域(或子域)的本地開發都將無法再通過 HTTP 訪問,因為瀏覽器將只允許 HTTPS 流量。
例如,如果您在 example.com 上有 HSTS 標頭和必要的“includeSubdomains ”指令,那麼一旦您訪問了 example.com,您將無法通過不安全的連接訪問 example.com 的子域。 因此,如果您選擇使用“includeSubdomains” ,請小心,它可能會對您的其他域產生影響。
一旦瀏覽器從站點接收到 HSTS 標頭,它將在指定的持續時間內記住 HSTS 策略,並自動將所有未來對該站點的請求升級到 HTTPS。 通過確保瀏覽器和服務器之間的所有通信都被加密,這有助於避免中間人攻擊、竊聽和其他形式的篡改。
此標頭的語法是:
# 沒有 includeSubDomains 指令 <IfModule mod_headers.c> 標頭集 Strict-Transport-Security:“max-age=63072000;” </IfModule> # 使用 includeSubDomains 指令 <IfModule mod_headers.c> 標頭集 Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" </IfModule>
max-age=<expire-time>指令指定瀏覽器應記住只能使用 HTTPS 訪問站點的時間(以秒為單位)。 例如,在上面的示例中, max-age設置為兩年。 如果您選擇從 Servbolt 使用 Servebolt CDN 或加速域,您將自動擁有 1 年的 HSTS 長度。
4. Referrer-Policy Header
此 HTTP 標頭控制請求中應包含多少通過引用標頭髮送的引用信息。 它限制了站點訪問者單擊鏈接時發送的信息量。 這有助於防止敏感信息洩露到其他網站,例如包含隱私信息的頁面的 URL。
它可以有多個值——下面是一個簡要說明:
- no-referrer:在任何情況下都不會發送 Referer 標頭。
- No-referrer-when-downgrade:當從 HTTPS 站點導航到 HTTP 站點時,不會發送 Referer 標頭。
- Origin: Referer 標頭將僅包含引用頁面的來源(方案、主機和端口)。
- Origin-when-cross-origin:當在同一來源的頁面之間導航時,Referer 標頭將包含引用頁面的完整 URL,而當導航到不同來源時僅包含來源。
- 嚴格來源: Referer 標頭將僅包含引用頁面的來源,不會為跨域請求發送。
- Strict-origin-when-cross-origin: Referer 標頭將包含引用頁面的來源,並且不會為跨域請求發送,但同站點來源除外。 我們建議使用此設置,因為它保留了標頭的實用性,同時降低了洩露數據的風險。
- Unsafe-url: Referer 頭在執行任何請求時都會發送來源、路徑和查詢字符串,而不管安全性。
要深入討論引薦來源策略標頭,請閱讀 Google web.dev 上關於引薦來源策略最佳實踐的文章。
5. X-Content-Type-Options 標頭
X-Content-Type-Options 標頭由服務器在 HTTP 響應中發送,以向瀏覽器指示有關 MIME 類型的信息。 此標頭的目的是防止瀏覽器將文件解釋為與標頭中指定的不同的 MIME 類型。
此標頭可以具有單個值“nosniff”。 語法如下:
X 內容類型選項:nosniff
它對 MIME 混淆攻擊非常有效——使用此安全標頭可以防止瀏覽器以可能導致安全漏洞的意外方式解釋文件。 例如,如果攻擊者上傳一個擴展名為 .jpg 的文件,但由於它實際上是一個腳本而不包含任何內容,將X-Content-Type-Options標頭設置為“nosniff”將不允許瀏覽器執行該腳本,從而保護用戶免受潛在的破壞。
6.內容安全策略(CSP) 標頭
Content-Security-Policy 是一個安全標頭,用於指定內容的來源,並提供一種允許在網站或 Web 應用程序中加載和執行內容的機制。 通過指定一組策略,此標頭可以限製網頁上允許的內容類型並減輕各種類型的安全威脅。 它是針對跨站點腳本 (XSS) 和數據注入攻擊的附加安全層,這些攻擊用於數據盜竊、網站篡改和惡意軟件分發等犯罪活動。
除了控制可以加載的資源類型之外,Content-Security-Policy 標頭還提供了一種方法來指示瀏覽器如何處理任何違反標頭中指定的策略的行為。 例如,策略可能指定如果資源違反策略,瀏覽器應發布警告或阻止加載資源。
服務器需要配置為返回 Content-Security-Policy 標頭以使策略起作用。 您可以使用 CSP HTTP 標頭來指定您的策略,如下所示:
內容安全政策:政策
該策略是一個字符串,其中包含描述您的內容安全策略的策略指令。 例如,您可以將以下行添加到您的 .htaccess 文件中以實現 CSP。
<IfModule mod_headers.c> 標頭集 Content-Security-Policy "default-src https: 'unsafe-eval' 'unsafe-inline' 'self'; object-src 'self'; font-src https: data: 'self' http: fonts.googleapis. com themes.googleusercontent.com; connect-src https: wss: 'self'; img-src https: data: 'self' http: *.gravatar.com; worker-src blob: https: 'self' '不安全內聯''不安全評估';媒體源 https:blob:'自我';樣式源 https:'不安全評估''不安全內聯''自我'http:fonts.googleapis.com“ </IfModule>
如果您在 WordPress 網站上實施 CSP,您應該注意WordPress 需要“不安全內聯”和“不安全評估”才能正常工作。 上面的配置對於大多數 WordPress 網站來說是一個很好的起點。 但是,在不清楚每個部分的含義的情況下使用上述配置存在風險。 以下是每個指令的細目:
- default-src – 該指令為所有類型的資源設置默認策略,除非它們被其他指令覆蓋。在這種情況下,它允許從同一源(“self”)、HTTPS 源和使用“unsafe-eval”或“unsafe-inline”的腳本加載資源。
- object-src – 該指令限制可以嵌入到頁面中的對像類型,例如 Flash 或 Java 小程序。在這裡,它只允許從同一來源('self')加載對象。
- font-src – 該指令限制可以從中加載字體的來源。在這裡,它允許從 HTTPS 源、數據 URI 方案和來自同一來源(“self”)或來自 Google 字體和 Google 用戶內容的 HTTP 源加載字體。
- connect-src – 此指令限制可用於網絡請求的源,例如 AJAX 請求或 WebSockets。在這裡,它只允許通過 HTTPS 或 WebSockets 和來自相同來源('self')的連接。
- img-src – 該指令限制可以加載圖像的來源。在這裡,它允許從 HTTPS 源、數據 URI 方案、同源('self')或來自 Gravatar 的 HTTP 源加載圖像。
- worker-src – 該指令限制了可以加載 web worker 的源。在這裡,它只允許從 blob URI 方案、HTTPS 源和使用“不安全評估”或“不安全內聯”的腳本加載工作人員。
- media-src – 該指令限制可以加載媒體資源的來源,例如音頻或視頻。在這裡,它只允許從 HTTPS 源、blob URI 方案和同一來源('self')加載媒體。
- style-src – 該指令限制可以加載樣式表的來源。在這裡,它允許從 HTTPS 源和使用“unsafe-eval”或“unsafe-inline”的腳本,以及來自相同來源(“self”)和來自 Google 字體的 HTTP 源加載樣式。
在 WordPress 實例中使用 CSP 標頭時,請務必注意,不正確地應用 CSP 標頭會破壞 WordPress 管理儀表板,因為某些插件和服務可能依賴於第三方 JavaScript。
要解決此問題,您需要手動將每個安全規則添加到標頭文件中。 另一種但不太安全的方法是在您的管理儀表板中禁用 CSP 標頭。 例如,這是我們在servebolt.com上所做的:
標頭集 X-Frame-Options SAMEORIGIN 標頭設置 Referrer-Policy strict-origin-when-cross-origin 標頭集 X-XSS-Protection "1; mode=block" <如果“%{REQUEST_URI} !~ /wp-admin/”> # 如果不是管理屏幕,只添加標題 標頭始終設置 Content-Security-Policy "default-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' 'unsafe-eval' *.intercomcdn.com cdn.firstpromoter.com servebolt.containers .piwik.pro *.intercom.io cdn.getreplybox.com platform.twitter.com v0.wordpress.com cdn.jsdelivr.net servebolt.piwik.pro ; media-src 'self' *.intercomcdn.com data: ; img -src 'self' 'unsafe-inline' *.intercom.io *.intercomcdn.com *.intercomassets.com 數據:raskesider.raskesider.no *.servebolt.com secure.gravatar.com servebolt.piwik.pro ;連接- src 'self' ws: nexus-websocket-a.intercom.io *.piwik.pro servebolt.piwik.pro *.intercom.io ; font-src 'self' *.intercomcdn.com data: ; frame-src 'self ' app.getreplybox.com platform.twitter.com player.vimeo.com wordpress.org www.youtube.com caniuse.bitsofco.de video.wordpress.com *.intercom.io; frame-ancestors 'self' *.servebolt. com;清單 src 'self' ;" </如果>
在您的網站上實施 CSP 時,您應該注意,如果您不使用 HTTPS,它可能會破壞您的開發環境。 如果您不確定如何為您的站點生成策略,您應該使用圖形工具,例如ValidBot – CSP Wizard或Report URI: CSP generator 。
7.權限策略標題
權限策略為開發人員提供了明確聲明可以在網站上實現和不可以實現哪些功能的機制。它管理網站所需的權限集。 此標頭用於限製網站的功能,以防止某些安全和隱私風險,例如濫用 Javascript API、跟踪用戶和執行受感染的代碼。
權限策略允許服務器設置是否可以在特定文檔中使用某個功能。 它使用白名單——一個採用特定預定義值的來源列表。 Permission-Policy 標頭的值由逗號分隔的指令名稱列表及其描述網站所需的各種權限的值組成。
Permissions-Policy 標頭的一般語法是:
權限策略:<指令>=<白名單>
例如,如果我們需要阻止所有對地理定位的訪問,我們會這樣做:
權限策略:geolocation=()
此處,符號 () 表示空白名單。 為了允許訪問源的子集,我們會這樣做:
<IfModule mod_headers.c> 標頭始終設置 Permissions-Policy "geolocation=(self 'https://abc.example.com' 'https://pqr.example.com'), midi=(), sync-xhr=(), accelerometer=( ), 陀螺儀=(), 磁力計=(), 攝像頭=(), 麥克風=(), 全屏=(self)" </IfModule>
讓我們再舉一個例子。 以下標頭值限製網站僅在與主文檔來自同一來源的情況下執行腳本:
權限策略:腳本源“自我”
Permissions-Policy 標頭可用於替換或補充傳統的 Content-Security-Policy 標頭,後者提供類似的功能,但語法不同且在權限方面的覆蓋範圍較小。此標頭目前是一項實驗性技術,僅在 Google Chrome 和其他基於 Chromium 的瀏覽器中受支持。它提供了一種更強大、更靈活的權限控制機制,預計未來它的採用會增加。 如果您想親自嘗試一下,可以使用Permission Policy Header Generator輕鬆生成權限策略。
使用 .htaccess 文件添加 HTTP 安全標頭
我們推薦的添加 HTTP 安全標頭的方法是直接編輯.htaccess文件。這是 Apache Web 服務器最常用的服務器配置文件。 通過編輯此文件,您可以確保在服務器級別配置 WordPress 中的 HTTP 安全標頭。
您需要訪問您網站的.htaccess文件才能使用此方法。 可以使用 FTP 客戶端在 Apache 服務器上訪問它。在進行任何更改之前,強烈建議您備份當前的.htaccess文件。
首先,只需使用 FTP 客戶端或主機控制面板中的文件管理器工具登錄到您的站點。 在您網站的根文件夾中,找到.htaccess文件並右鍵單擊“編輯”選項。 這將使用文本編輯器打開文件。 要將 HTTPS 安全標頭添加到您的站點,您可以在.htaccess文件的底部添加相關代碼。
以下示例代碼可用作起點。它使用推薦設置設置最常用的 HTTP 安全標頭。
<IfModule mod_headers.c> 標頭集 Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" env=HTTPS 標頭集 X-XSS-Protection "1; mode=block" 標頭集 X-Content-Type-Options "nosniff" 標頭集 X-Frame-Options DENY 標頭設置推薦人政策“降級時無推薦人” 標頭集 Content-Security-Policy "default-src https: 'unsafe-eval' 'unsafe-inline' 'self'; object-src 'self'; font-src https: data: 'self' http: fonts.googleapis. com themes.googleusercontent.com; connect-src https: wss: 'self'; img-src https: data: 'self' http: *.gravatar.com; worker-src blob: https: 'self' '不安全內聯''不安全評估';媒體源 https:blob:'自我';樣式源 https:'不安全評估''不安全內聯''自我'http:fonts.googleapis.com“ 標頭始終設置 Permissions-Policy "geolocation=(self 'https://abc.example.com' 'https://pqr.example.com'), midi=(), sync-xhr=(), accelerometer=( ), 陀螺儀=(), 磁力計=(), 攝像頭=(), 麥克風=(), 全屏=(self)" </IfModule>
將上述配置添加到 .htaccess 文件後,相關標頭將應用於所有 Web 請求。
您可以通過打開 Chrome DevTools 中的“網絡”選項卡並檢查請求的響應標頭來驗證是否正在使用標頭。
添加代碼後,保存您的更改並重新訪問您的網站以確保它們按預期工作。 編輯 .htaccess 文件時也必須小心,因為不正確的代碼標頭或拼寫錯誤可能會觸發錯誤,例如 500 Internal Server Error 。
使用內容分發網絡 (CDN) 在 WordPress 中添加 HTTP 安全標頭
內容分發網絡 (CDN) 是一組地理分佈的服務器,它們從距離用戶最近的網絡位置提供緩存的 Internet 內容,以提高 Web 性能。 Cloudflare等流行的 CDN還使您能夠將 HTTP 標頭添加到您的網站。
讓我們以 Cloudflare 為例,看看我們如何使用 CDN 添加 HTTP 標頭。 Cloudflare 提供基本的免費網站防火牆和 CDN 服務,但更高級的安全功能被鎖定在付費專區後面。
在您的 WordPress 網站上設置 Cloudflare 非常簡單。 您可以在 Cloudflare 的網站上手動註冊,然後按照屏幕上的步驟啟用它。 在您的網站上激活 Cloudflare 後,前往 Cloudflare 帳戶儀表板中的 SSL/TLS 頁面。
然後,您需要切換到“邊緣證書”選項卡並找到 HTTP 嚴格傳輸安全 (HSTS) 部分,然後單擊“啟用 HSTS”選項。 打開“啟用 HSTS”按鈕後,將彈出一個窗口,其中包含幫助您在站點上啟用此功能的說明。 單擊“下一步”按鈕繼續該過程,您將看到添加 HTTP 安全標頭的選項。
從這裡,您可以在您的站點上啟用 HSTS,還可以選擇將 HSTS 應用於使用 HTTPS 的子域。 使用此方法將使用 HTTP 安全標頭為您的網站提供基本保護,但缺點是 Cloudflare 目前不允許您添加 X-Frame-Options。
值得注意的是,對於 servebolt.com 和 Cloudflare 內的任何其他域,默認情況下啟用 HSTS。
使用 WordPress 插件添加 HTTP 安全標頭
添加和配置 HTTP 標頭的第三種方法是使用插件。 雖然這是將 HTTP 安全標頭添加到您的 WordPress 網站的最簡單方法之一,但它通常不如手動配置標頭有效。
您可能已經在別處讀到許多安全插件都包含添加安全標頭的選項。 但是,我們建議不要使用安全插件。 閱讀我們關於 WordPress 安全插件的文章,了解使用這些插件的原因和關注點。
本節將讓您啟用或禁用各種標頭並為它們設置不同的參數。 您可以啟用的確切標頭將根據您選擇的插件而有所不同,但是 X-XSS-Protection、X-Content-Type-Options、X-Frame-Options 和 Strict-Transport-Security 等常見標頭包含在大多數插件。
如何檢查您網站上的 HTTP 安全標頭
在您的 WordPress 網站上添加 HTTP 安全標頭後,您需要確保它們配置正確並按預期工作。 您可以使用 Internet 上提供的眾多免費工具之一來執行測試。 我們建議使用 Security Headers或SSL Labs ,它們都為您提供了一種簡單的方法來測試您的配置並驗證所有安全標頭是否正常工作。
這些工具將評估您網站的安全標頭並為您提供詳細報告。 它們還會告訴您您的網站正在發送哪些 HTTP 安全標頭,哪些沒有發送。 然後,您的網站將獲得從 A+ 到 F 的等級,以及該等級是如何確定的解釋。
例如,在測試Vogue的網站時,我們發現它缺少許多重要的 HTTP 標頭,因此它只獲得了 C 級。
而且,正如您在測試我們自己的網站時所期望的那樣——它獲得了 A+ 等級。
結論
毫無疑問,實施 HTTP 標頭是確保網站安全的重要一步。 成功將 HTTP 標頭添加到您的網站後,您還應該考慮以下幾個額外步驟:
- 測試漏洞:重要的是測試您的站點是否存在常見的安全漏洞,例如跨站點腳本 (CSS) 和跨站點請求偽造 (CSRF)。為此,您可以使用OWASP ZAP和Burp Suite等工具。
- 監視更改:您需要定期監視標頭是否有任何意外更改,因為這通常表明有人試圖利用漏洞。
- 更新標頭:隨著新威脅的出現,了解最新的安全實踐並相應地更新標頭非常重要。
對經驗上更快的託管託管感興趣?
試試我們的 WordPress 託管方法——入門是免費的,好處包括:
- 可擴展性:在真實用戶工作負載測試中,Servebolt 的平均響應時間為 65 毫秒,比第二名快 4.9 倍。
- 最快的全球加載時間: 1.26 秒的平均頁面加載時間使我們在全球 WebPageTest 結果列表中名列前茅。
- 最快的計算速度: Servebolt服務器提供前所未有的數據庫速度,每秒處理的查詢數是平均水平的2.44倍,運行PHP的速度是第二名的2.6倍!
- 完美的安全性和正常運行時間:所有監視器的正常運行時間均為 100%,並且我們的 SSL 實施獲得了 A+ 評級,您可以放心,您的網站是在線且安全的。
簡而言之,通過讓我們從您的盤子中解放出來——您可以更輕鬆地提高網站的安全性、速度和性能。 註冊 Servebolt來測試我們。