安全性Header

在後端程式中,一般都會針對CORS做設定,也可能會去除違法字元,避免SQL Injection或Log Forging等問題,也可直接在Nginx、Apache、IIS上,針對安全性的Header做設定。

 

基本安全性設定


目前各家瀏覽器有支援許多與資安相關的HTTP Header,開發人員在伺服器設定加入安全性headers,瀏覽器收到 response 時就會執行相對應的防禦機制。主要可設定的細節可參考HTTP Security

防禦 XSS (Cross Site Scripting):
多為經過輸入輸出的過程,產生的惡意攻擊。例如在Input輸入時,塞入惡意的JavaScript,或是在IG的留言中,傳入一些SQL、或惡意程式碼,下次開啟該留言時,就會被讀取並執行。XSS如何攻擊可參考LIN大的說明,有圖有真相,清楚易懂。

 

防禦 Clickjacking:
將目標網站嵌入惡意網站中,透過CSS將按鈕或連結等,將原網頁蓋住,讓使用者以為自己的操作是在原本網站上操作。胡立大提供了一些示範,可參考

 

強制使用者使用 HTTPS 進行連線:
透過CA取得的憑證,使用公鑰匙加密,避免資料在網路傳遞的過程中被截取。透過設定或routing限制使用者只能使用HTTPS。

 

避免瀏覽器誤判文件形態
IIS可設定MINE TYPE,限制可傳輸的檔案型別,為避免MIME TYPE不明或有誤的檔案,可關閉瀏覽器sniffing。
 

 

防禦+10的小妙招


防禦XSS
透過設定Content-Security-Policy(CSP),可做到初步的XSS防禦。
CSP是寫給瀏覽器看的,用來限制網頁中對外部的請求來源,像css,js,webfont,img,video,iframe等等),還有一部份是禁止HTML行內的JS或CSS運作,當有不符合安全政策的情況,瀏覽器就會提報錯誤, 並終止該行為執行。

如果完全不懂,IIS設定至少可以設定為
content-security-policy: default-src 'self';

使用上述設定至少可做到預設的防禦,self為請求來源,可分為通用來源或網址來源,通用來源包含

  1. None: 禁止任何來源
  2. Self: 可使用同源的資源
  3. unsafe-inline: 可使用inline的JS或CSS

 

分號代表不同設定,一些常見的設定欄位如下,詳細可設定的欄位如(參考),或使用其他工具產生(參考)。

  1. img-src:允許的圖片網址來源
  2. style-src:允許的CSS樣式來源
  3. frame-ancestors :允許頁面可被哪些網址嵌入,可防Clickjacking,跟 X-Frame-Options 有相同的功能,但有瀏覽器可用性的小差別,現在IE已不存在,應該可取代X-Frame-Options。

 

防禦 Clickjacking
簡單來說,就是不要讓其他網頁透過Frame嵌入自己的網頁,透過加入設定,可限制只有同源,甚至不可被嵌入。
content-security-policy: frame-ancestors: 'self';

content-security-policy: frame-ancestors: 'none';
 

較舊的作法是設定X-Frame-Options。

X-Frame-Options sameorigin;

 

設定HSTS 
設定Strict-Transport-Security,強制使用者使用HTTPS連線,最好還能加上URL Rewrtie,將HTTP連線轉為HTTPS。從伺服器端送出一個 Strict-Transport-Security 標頭給瀏覽器,就可以告訴瀏覽器在未來的某段時間內一律使用 SSL 連接該網站,,也可設定包含所有子域名網站,可參考

Strict-Transport-Security max-age=31536000; includeSubDomains;
 

  1. max-age 以秒計算的時間,範例為一年內強制使用HTTPS存取。
  2. includeSubDomains 瀏覽器強制使用 HTTPS 的狀態套用至該域名的所有子域。

 

設定X-Content-Type-Option:nosniff
針對MIME TYPE不明或有誤的檔案,瀏覽器預設會做sniffing,透過設定X-Content-Type-Option,可關閉sniffing,但目前Safari似乎不支援。(參考6參考7)

 

 

IIS設定範例
點Default Web Site => HTTP回應標頭 => 開啟功能 =>新增

 

 

 

 

 

Apache或Nginx也可以做到CSP的設定,例如

Nginx設定範例
找到nginx.conf => 在Server{}中加入設定,例如


 

Apache設定範例
找到.htaccess => 如上述設定


 

參考:

  1. https://developer.mozilla.org/en-US/docs/Web/HTTP
  2. https://medium.com/hannah-lin/%E5%BE%9E%E6%94%BB%E6%93%8A%E8%87%AA%E5%B7%B1%E7%B6%B2%E7%AB%99%E5%AD%B8-xss-cross-site-scripting-%E5%8E%9F%E7%90%86%E7%AF%87-fec3d1864e42
  3. https://blog.huli.tw/2021/09/26/what-is-clickjacking/
  4. https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy
  5. https://lawrencechuang760223.medium.com/%E5%A6%82%E4%BD%95%E5%9C%A8iis7-5%E4%B8%8B%E8%A8%AD%E5%AE%9Ahttp-strict-transport-security-54edf9256ce9
  6. https://blog.camel2243.com/2016/11/23/security-https-header-x-content-type-options%EF%BC%8C%E9%81%BF%E5%85%8D%E7%80%8F%E8%A6%BD%E5%99%A8%E5%9F%B7%E8%A1%8C%E4%B8%8D%E7%AC%A6-content-type-%E7%9A%84%E6%93%8D%E4%BD%9C/
  7. https://blog.camel2243.com/2016/11/23/security-https-header-x-content-type-options%EF%BC%8C%E9%81%BF%E5%85%8D%E7%80%8F%E8%A6%BD%E5%99%A8%E5%9F%B7%E8%A1%8C%E4%B8%8D%E7%AC%A6-content-type-%E7%9A%84%E6%93%8D%E4%BD%9C/
  8. https://report-uri.com/home/generate