防止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文件))很適合緩存。這可以在逐頁的基礎上完成,也可以在服務器配置上使用正則表達式完成。

 

1 # Don’t cache by default
2 Header set Cache-Control no-cache
3 
4 # Cache static assets for 1 day
5 <filesMatch ".(css|jpg|jpeg|png|gif|js|ico)$">
6     Header set Cache-Control "max-age=86400, public"
7 </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 });
  • 結論

  設置標頭相對快速而簡單。對於數據保護,跨站點腳本和點擊防護,你的站點安全性會相當明顯的增加。你還可以確保你不會因為依賴此信息的公司安全評級而失去未來的商業交易,這種做法似乎在增加。

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM