1. 程式人生 > >防止Web攻擊,做好HTTP安全標頭

防止Web攻擊,做好HTTP安全標頭

前言  

    下圖是幾年前一位女性在訪談會上提問Linus(Linux作業系統之父) 為什麼英偉達顯示卡在Linux系統中相容性這麼差?

    Linus說他們曾經去和英偉達談過關於顯示卡在Linux上相容的問題,但是英偉達卻只對Android的顯示卡相容很主動。

    最後Linus豎起中指說了一句,"so,nivdia f**k you!"。

  銷售“Security Scorecard”的公司正在崛起,並已開始成為企業銷售的一個因素。但還是有很多人因為他們的評級不佳而改變了購買策略。

 

  “Security Scorecard”是為網站提供監控網路安全風險,為企業提供安全基準測試和風險評級的企業。

 

  Security Scorecard 可以評估的安全風險包括 web 應用安全、DNS 健康性、IP 信譽度、網路安全、補丁修補情況、社交工程、斷點安全、密碼洩露、黑客關注程度、Cubit Score(容易攻擊程度)等。每一類安全風險都按照 A 到 F 進行評級,其中 A 為最安全、F 為最危險。這種兼顧整體與區域性的自動化安全評估受到了不少客戶的青睞,據稱目前已經擁有超過 100 家客戶。

 

  這些評級公司如何計算公司安全分數?

 

  統計發現他們使用了HTTP安全標頭和IP信譽的組合。 

    

 

    IP信譽基於黑名單和垃圾郵件列表以及公共IP所有權資料。只要您的公司不傳送垃圾郵件並且可以快速檢測並阻止惡意軟體感染,這些通常應該是乾淨的。

 

    HTTP安全頭的計算方式與Mozilla Observatory的工作方式類似。因此,對於大多數公司而言,他們的得分主要取決於面向公眾的網站上設定的安全標頭。 設定正確的標頭可以提高網站安全性,還可以幫助你贏得存在安全意識的客戶的交易。

 

    在本文中,我將介紹常用的評估標頭,為每個標頭推薦安全值,並提供示例標頭設定。在本文的最後,我將概述包括常見應用程式和Web伺服器的示例設定。

 

重要的安全標頭

  • Content-Security-Policy

  CSP用於通過指定允許載入哪些資源來防止跨站點指令碼。在此列表中的所有專案中,這可能是最合適的建立和維護以及最容易發生風險的時間。

  在使用CSP時,請務必仔細測試它, 阻止站點以有效方式使用的內容源破壞站點功能。

  建立它的一個很好的工具是Mozilla laboratory CSP browser extension瀏覽器擴充套件。

    https://addons.mozilla.org/en-US/firefox/addon/laboratory-by-mozilla/

  在瀏覽器中安裝它,徹底瀏覽要為其建立CSP的站點,然後在您的站點上使用生成的CSP。

  理想情況下,還可以重構JavaScript,因此不會保留內聯指令碼,你可以刪除“unsafe inline”指令。CSP可能很複雜且令人困惑,因此如果你想要更深入,可以訪問官方網站。一個好的CSP可能如下(這可能需要在真實站點上進行大量修改)。在你的網站包含的每個部分中新增域名。

1 # Default to only allow content from the current site
2 # Allow images from current site and imgur.com
3 # Don't allow objects such as Flash and Java
4 # Only allow scripts from the current site
5 # Only allow styles from the current site
6 # Only allow frames from the current site
7 # Restrict URL's in the <base> tag to current site
8 # Allow forms to submit only to the current site
9 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';
  • Strict-Transport-Security

  此標頭告訴瀏覽器該網站應僅通過HTTPS訪問 - 始終在你的網站啟用HTTPS。如果你使用子域,你可以在任何子域上強制執行此操作。

1 Strict-Transport-Security: max-age=3600; includeSubDomains
  • X-Content-Type-Options

  此標頭確保瀏覽器遵守應用程式設定的MIME型別。這有助於防止某些型別的跨站點指令碼繞過。

  它還可以減少意外的應用程式行為,因為瀏覽器可能會錯誤地"猜測"某種內容,例如當開發人員將頁面標記為"HTML",但瀏覽器認為它看起來像JavaScript並會嘗試將其呈現為JavaScript。    

  此標頭將確保瀏覽器始終遵守伺服器設定的MIME型別。

X-Content-Type-Options: nosniff
  • Cache-Control

   這個相比其它的有點棘手,因為你可能希望針對不同的內容型別使用不同的快取策略。

   任何包含敏感資料的頁面(例如使用者頁面或客戶結帳頁面)都應設定為no-cache。其中一個原因是阻止共享計算機上的某人按下後退按鈕或瀏覽歷史記錄並能夠檢視個人資訊。但是,很少更改的頁面(如靜態資源(影象,CSS檔案和JS檔案))很適合快取。這可以在逐頁的基礎上完成,也可以在伺服器配置上使用正則表示式完成。

# Don’t cache by defaultHeader 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>
  • Expires

  這將設定快取應該使用到請求到期的時間。如果設定了Cache-Control max-age標頭,則會被忽略,因此我們只設置它以防止掃描程式在不考慮快取控制的情況下對其進行測試。出於安全考慮,我們的瀏覽器不應該快取任何內容,因此我們將其設定為歷史日期。

Expires: 0
  • X-Frame-Options

  此標頭指示是否允許在iFrame中顯示該站點。如果惡意網站將你的網站置於iFrame中,則惡意網站可以通過執行一些JavaScript來執行點選攻擊,該JavaScript會捕獲iFrame上的滑鼠點選,然後代表使用者與該網站進行互動(不一定點選它們的位置)認為他們點選了!)。 

 

 

  除非你專門使用框架,否則應始終將其設定為拒絕,在這種情況下,應將其設定為同源。如果您在設計中將Frames與其他網站一起使用,你也可以在此處列出其他域名。還應注意,此標頭已被CSP frame-ancestors指令取代。我仍然建議現在設定這個,但將來它可能會逐步淘汰。

1 X-Frame-Options: deny
  • Access-Control-Allow-Origin

  這個標頭告訴瀏覽器哪些其他網站的前端JavaScript程式碼可能會對相關頁面發出請求。除非你需要設定此項,否則預設設定通常是正確的。例如,如果SiteA提供了一些想要向siteB發出請求的JavaScript,那麼siteB必須使用標頭提供響應,並指定允許SiteA發出此請求。如果需要設定多個源,請參閱MDN上的詳細資訊頁面。這可能有點令人困惑,所以我繪製了一個圖表來說明這個頭如何運作:

 

1 Access-Control-Allow-Origin: http://www.one.site.com
  • Set-Cookie

  確保你的cookie僅通過HTTPS(加密)傳送,並且無法通過JavaScript訪問。如果你的站點也支援HTTPS,則只能傳送HTTPS cookie。你應該始終設定以下標誌:

  • Secure

  • HttpOnly

  Cookie定義示例:

1 Set-Cookie: <cookie-name>=<cookie-value>; Domain=<domain-value>; Secure; HttpOnly
  • X-XSS-Protection

  此標頭指示瀏覽器停止檢測到的跨站點指令碼攻擊的執行。設定風險通常較低,但在投入生產之前仍應進行測試。

1  X-XSS-Protection: 1; mode=block
  • Web伺服器示例配置通常

  伺服器配置應該在站點訪問時新增標頭。Cookie在這裡是例外,因為它們通常在應用程式本身中定義。在向網站新增任何標頭之前,我建議先檢查手動新增的標頭和已設定的標頭。一些框架和伺服器會自動為你設定其中一些,需要你自己實現你需要或想要更改的那些。

  • Apache配置

  一個簡單的Apache中.htaccess設定:

 1 <IfModule mod_headers.c>
 2     ## CSP
 3     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';
 4 
 5     ## General Security Headers
 6     Header set X-XSS-Protection: 1; mode=block
 7     Header set Access-Control-Allow-Origin: http://www.one.site.com
 8     Header set X-Frame-Options: deny
 9     Header set X-Content-Type-Options: nosniff
10     Header set Strict-Transport-Security: max-age=3600; includeSubDomains
11 
12     ## Caching rules
13     # Don’t cache by default
14     Header set Cache-Control no-cache
15     Header set Expires: 0
16 
17     # Cache static assets for 1 day
18     <filesMatch ".(ico|css|js|gif|jpeg|jpg|png|svg|woff|ttf|eot)$">
19         Header set Cache-Control "max-age=86400, public"
20     </filesMatch>
21 
22 </IfModule>
  • Nagix配置

 1 ## CSP
 2 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';
 3 
 4 ## General Security Headers
 5 add_header X-XSS-Protection: 1; mode=block;
 6 add_header Access-Control-Allow-Origin: http://www.one.site.com;
 7 add_header X-Frame-Options: deny;
 8 add_header X-Content-Type-Options: nosniff;
 9 add_header Strict-Transport-Security: max-age=3600; includeSubDomains;
10 
11 ## Caching rules
12 # Don’t cache by default
13 add_header Cache-Control no-cache;
14 add_header Expires: 0;
15 
16 # Cache static assets for 1 day
17 location ~* \.(?:ico|css|js|gif|jpe?g|png|svg|woff|ttf|eot)$ {
18     try_files $uri @rewriteapp;
19     add_header Cache-Control "max-age=86400, public";
20 }
  • Application標頭設定

  如果你無權訪問Web伺服器,或者具有複雜的標頭設定需求,則可能需要在應用程式本身中進行設定。這通常可以通過整個站點的框架中介軟體來完成,並且可以基於每個響應進行一次性頭設定。為簡潔起見,我在示例中只包含了一個標頭。以相同的方式新增通過此方法所需的所有內容。

  • 節點和表達

  新增全域性裝載路徑:

1 app.use(function(req, res, next) {
2     res.header('X-XSS-Protection', 1; mode=block);    
3     next();
4 });
  • 結論

  設定標頭相對快速而簡單。對於資料保護,跨站點指令碼和點選防護,你的站點安全性會相當明顯的增加。你還可以確保你不會因為依賴此資訊的公司安全評級而失去未來的商業交易,這種做法似乎在增加。

   我錯過了你認為應該包括的標頭嗎?

&n