銷售“安全記分卡”的公司呈上升趨勢,並已開始成為企業銷售的一個因素。我從一些客戶那裡聽說,他們擔心從那些評級不高的供應商那裡採購,至少有一個客戶改變了最初基於評級的採購决定。
我調查了這些評級公司是如何計算公司安全評分的,結果發現他們使用了HTTP安全頭使用和IP信譽的組合。
IP信譽是基於黑名單和垃圾郵件名單以及公共IP所有權數據。這些通常應該是乾淨的,只要你的公司不垃圾郵件,並能迅速發現和封锁惡意軟件感染。HTTP安全頭使用量的計算方法與Mozilla天文臺的工作原理類似。
囙此,對大多數公司來說,他們的得分很大程度上取決於在面向公眾的網站上設定的安全標題。
設定正確的標題可以很快完成(通常沒有重要的測試),可以提高網站的安全性,現在可以幫助您贏得與安全意識客戶的交易。
我對這種測試方法的價值和這些公司要求的過高定價方案持懷疑態度。我不相信它和真正的產品安全有那麼好的關係。然而,這無疑新增了花時間設定標題並使其正確的重要性。
在本文中,我將遍歷常用的計算頭,為每個頭推薦安全值,並給出一個示例頭設定。在本文的最後,我將包括一些常見應用程序和web服務器的示例設定。
內容安全性原則
CSP通過指定允許加載哪些資源來防止跨網站腳本。在這個清單中的所有項目中,這可能是正確創建和維護最耗時、最容易出現風險的項目。在CSP的開發過程中,請小心對其進行徹底的測試——以有效的管道封锁網站使用的內容源將破壞網站功能。
創建初稿的一個很好的工具是Mozilla laboratory CSP瀏覽器擴展。在瀏覽器中安裝此程式,徹底瀏覽要為其創建CSP的網站,然後在網站上使用生成的CSP。理想情况下,還要重構JavaScript,這樣就不會留下內聯腳本,這樣就可以删除“unsafe inline”指令。
CSP可能是複雜和混亂的,所以如果你想深入瞭解,請訪問官方網站。
一個好的開始CSP可能是這樣的(這可能需要在一個真實的網站上做很多修改)。在網站包含的每個部分中添加域。
# Default to only allow content from the current site
# Allow images from current site and imgur.com
# Don't allow objects such as Flash and Java
# Only allow scripts from the current site
# Only allow styles from the current site
# Only allow frames from the current site
# Restrict URL's in the <base> tag to current site
# Allow forms to submit only to the current site
Content-Security-Policy: default-src 'self'; img-src 'self' https://i.imgur.com; object-src 'none'; script-src 'self'; style-src 'self'; frame-ancestors 'self'; base-uri 'self'; form-action 'self';
嚴格的運輸安全
此頭告訴瀏覽器只能通過HTTPS訪問網站-當您的網站啟用了HTTPS時始終啟用。如果您使用子域,我還建議在任何使用過的子域上強制執行此操作。
Strict-Transport-Security: max-age=3600; includeSubDomains
X內容類型選項
此頭確保瀏覽器尊重應用程序設定的MIME類型。這有助於防止某些類型的跨網站腳本繞過。
它還减少了意外的應用程序行為,在這種情況下,瀏覽器可能會錯誤地“猜測”某種內容,例如當開發人員將頁面標記為“HTML”但瀏覽器認為它看起來像JavaScript並試圖將其呈現為JavaScript時。此頭將確保瀏覽器始終遵循服務器設定的MIME類型。
X-Content-Type-Options: nosniff
緩存控制
這一個要比其他的複雜一些,因為您可能需要針對不同內容類型的不同緩存策略。
任何包含敏感數據的頁面(如用戶頁面或客戶簽出頁面)都應設定為“無緩存”。原因之一是共亯電腦上的某個人無法按後退按鈕或瀏覽歷史記錄並查看個人資訊。
但是,很少更改的頁面(如靜態資產(影像、CSS檔案和JS檔案))很適合緩存。這可以逐頁完成,也可以在伺服器配置中使用regex。
# Don’t cache by default
Header set Cache-Control no-cache
# Cache static assets for 1 day
<filesMatch ".(css|jpg|jpeg|png|gif|js|ico)$">
Header set Cache-Control "max-age=86400, public"
</filesMatch>
到期
這將設定緩存應使當前請求過期的時間。如果設定了Cache-Control-max-age頭,則會忽略它,囙此我們只在naive scanner測試時設定它,而不考慮Cache-Control。
為了安全起見,我們假設瀏覽器不應該緩存任何內容,所以我們將其設定為始終計算為過去的日期。
Expires: 0
X框選項
此標題訓示是否應允許網站在iFrame中顯示。
如果惡意網站將您的網站置於iFrame中,惡意網站可以通過運行一些JavaScript來執行點擊劫持攻擊,這些JavaScript將捕獲iFrame上的滑鼠點擊,然後代表用戶與網站互動(不一定是在用戶認為自己點擊的地方點擊!)。
除非特別使用幀,否則應始終將其設定為拒絕,在這種情況下,應將其設定為相同的原點。如果您是使用框架與另一個網站的設計,您可以白名單的另一個領域,以及在這裡。
還應注意,此頭已被CSP frame祖先指令取代。我仍然建議現在設定這個來安撫工具,但在將來它可能會被淘汰。
X-Frame-Options: deny
存取控制允許源
告訴瀏覽器哪些其他網站的前端JavaScript程式碼可能會對相關頁面提出請求。除非需要設定,否則默認設置通常是正確的。
例如,如果SiteA提供了一些JavaScript,希望向siteB發出請求,那麼siteB必須提供帶有指定允許SiteA發出此請求的頭的響應。如果需要設定多個原點,請參閱MDN上的詳細資訊頁。
這可能有點讓人困惑,所以我畫了一個圖表來說明這個頭是如何工作的:
Access-Control-Allow-Origin: http://www.one.site.com
設定Cookie
確保您的cookies僅通過HTTPS(加密)發送,並且不能通過JavaScript訪問它們。如果您的網站也支持HTTPS,則只能發送HTTPS cookies,它應該支持HTTPS。您應該始終設定以下標誌:
- 安全
- 僅限http
Cookie定義示例:
Set-Cookie: <cookie-name>=<cookie-value>; Domain=<domain-value>; Secure; HttpOnly
有關更多資訊,請參閱有關cookies的優秀Mozilla檔案。
X-XSS-保護
此頭訓示瀏覽器停止執行檢測到的跨網站腳本攻擊。一般來說,設定的風險很低,但在投入生產前仍應進行測試。
X-XSS-Protection: 1; mode=block
Web服務器示例配寘
通常,最好在伺服器配置中在網站範圍內添加頭。cookie是這裡的例外,因為它們通常在應用程序本身中定義。
在將任何標題添加到網站之前,我建議首先檢查天文臺或手動查看標題,以查看哪些標題已設定。一些框架和服務器會自動為您設定其中的一些,囙此只實現您需要或想要更改的框架和服務器。
Apache配寘
htaccess中的Apache設定示例:
<IfModule mod_headers.c>
## CSP
Header set Content-Security-Policy: default-src 'self'; img-src 'self' https://i.imgur.com; object-src 'none'; script-src 'self'; style-src 'self'; frame-ancestors 'self'; base-uri 'self'; form-action 'self';
## General Security Headers
Header set X-XSS-Protection: 1; mode=block
Header set Access-Control-Allow-Origin: http://www.one.site.com
Header set X-Frame-Options: deny
Header set X-Content-Type-Options: nosniff
Header set Strict-Transport-Security: max-age=3600; includeSubDomains
## Caching rules
# Don’t cache by default
Header set Cache-Control no-cache
Header set Expires: 0
# Cache static assets for 1 day
<filesMatch ".(ico|css|js|gif|jpeg|jpg|png|svg|woff|ttf|eot)$">
Header set Cache-Control "max-age=86400, public"
</filesMatch>
</IfModule>
配寘
## CSP
add_header Content-Security-Policy: default-src 'self'; img-src 'self' https://i.imgur.com; object-src 'none'; script-src 'self'; style-src 'self'; frame-ancestors 'self'; base-uri 'self'; form-action 'self';
## General Security Headers
add_header X-XSS-Protection: 1; mode=block;
add_header Access-Control-Allow-Origin: http://www.one.site.com;
add_header X-Frame-Options: deny;
add_header X-Content-Type-Options: nosniff;
add_header Strict-Transport-Security: max-age=3600; includeSubDomains;
## Caching rules
# Don’t cache by default
add_header Cache-Control no-cache;
add_header Expires: 0;
# Cache static assets for 1 day
location ~* \.(?:ico|css|js|gif|jpe?g|png|svg|woff|ttf|eot)$ {
try_files $uri @rewriteapp;
add_header Cache-Control "max-age=86400, public";
}
如果您沒有訪問web服務器的許可權,或者有複雜的頭設定需求,則可能需要在應用程序本身中設定這些。這通常可以通過整個網站的框架中介軟體來完成,並且可以根據每個響應設定一次性的頭。
為了簡潔起見,我只在示例中包含了一個標題。用同樣的方法添加所有需要的內容。
節點和快遞:
添加全域裝載路徑:
app.use(function(req, res, next) {
res.header('X-XSS-Protection', 1; mode=block);
next();
});
Java和Spring:
我對Spring沒有太多的經驗,但是Baeldung對Spring的頭球設定有很好的指導。
菲律賓比索:
我不熟悉各種PHP框架。尋找能够處理請求的中介軟體。對於一個單一的反應,它是非常簡單的。
header("X-XSS-Protection: 1; mode=block");
巨蟒/Django
Django包含可配置的安全中介軟體,可以為您處理所有這些設定。先啟用它們。
對於特定的頁面,可以將響應視為字典。Django有一種特殊的方法來處理緩存,如果試圖以這種管道設定緩存頭,則應該對其進行調查。
response = HttpResponse()
response["X-XSS-Protection"] = "1; mode=block"
結論
設定標題相對來說是快速和簡單的。在數據保護、跨網站腳本編寫和按一下劫持方面,您的網站安全性將有相當大的提高。
您還可以確保您不會因為依賴於此資訊的公司安全評級而失去未來的業務交易。這種做法似乎越來越多,我希望它在未來幾年繼續在企業銷售中發揮作用。
我錯過了你認為應該包括的頭球嗎?告訴我!