HTTP 資料傳輸的資訊安全與 Http Header的設定
這篇文章主要針對 HTTP 這個通訊協定的資訊安全做基本的介紹。
HTTP 是所有網路服務與網站的通訊基礎。
因此,要打造安全的網站,必須先對 HTTP有基本的了解。
我們主要針對 Http Request Get/POST 的資料傳輸來說明HTTP可能的資訊安全風險。
另外,我們也介紹三個常見必且與資訊安全相關的 Http Header 。
Http Get Request
這是一個 Http Get Request 的實例。 HTTP GET 透過網址的方式將參數透過網址傳遞。
[pastacode lang=”markup” message=”” highlight=”” provider=”manual”]
GET / HTTP/1.1
Host: shopping.pchome.com.tw
Connection: keep-alive
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.134 Safari/537.36
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-TW,zh;q=0.8,en-US;q=0.6,en;q=0.4
Cookie: ECC=d999cb84f6f83e3f055702081178b0f2;_ga=GA1.3.1654285566.1418019640
If-Modified-Since: Sun, 19 Jul 2015 02:29:29 GMT
[/pastacode]
這個例子中,說明瀏覽器透過 HTTP/1.1通訊協定,GET “shopping.pchome.com.tw”
另外,User-Agent 說明瀏覽器為 Chrome/4.
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.134 Safari/537.36
使用的語言為繁體中文與 Locale
Accept-Language: zh-TW,zh;q=0.8,en-US;q=0.6,en;q=0.4
這些參數值預設為瀏覽器提供傳送,對於網站端而言是否能夠全部信任這些參數呢? 當然不是!!
因為這些所以的參數都是可以修改後傳送到網站伺服器的。
如果有網站利用 Http Get 參數傳送帳號密碼,這樣的設計就會產生資訊安全漏洞。
https://www.example.com/?pass=password&user=Tony
因為這樣的帳號資訊有可能會透過下列幾種方式被取得:
- 1. 網路資料傳述:這個URL 傳輸在網路上是很容易被其他人知道帳號,
- 2. 瀏覽器歷史紀錄:瀏覽器通常會用瀏覽歷史紀錄,透過瀏覽器的歷史紀錄也會知道該使用者的帳號密碼。
- 3. 透過Referer,間接將該參數傳遞傳送出去
- Referer: http://www.reDirect-website.com/?pass=password&user=Tony
Http POST Request
HTTP Post 將參數利用 message Body 的方式打包在整個Http Request 訊息傳遞的封包中。
透過 http Post參數傳遞相對於 Http Get 來說,Http Post 相對比較安全。因此,敏感性資料的傳遞不可以使用 http Get 來傳遞。
[pastacode lang=”markup” message=”” highlight=”” provider=”manual”]
POST https://www.example.com/signin HTTP/1.1
User-Agent: Mozilla/5.0 (Intel Windows)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;
Accept-Language: en-US,en;q=0.5
Referer: https://www.example.com/
Cookie: JSESSIONID=123ASDFAGASDFASDFASDF08F68;
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 159
Host: www.example.com
action=username=myName&password=myPassword
[/pastacode]
Http Response
對於網站來說,回傳給用戶端或是瀏覽器最多的資訊就是 HTML網頁。
除了網頁資訊之外還有必要的 Http Header ,這邊介紹幾個特別與常見跟資訊安全有關的 Http Header
Cache-Control
網頁快取的no-cache, no-store, Expires: -1等
快取的設定可以有效的幫助瀏覽網頁速度的使用者體驗,並且也可以有效減少網站的效能負擔。
一般像是圖形檔、或是不經常修改的 JavaScript 我們都會設定快取。
但是,如果有些是敏感性資訊的網頁內容,例如登入帳號密碼、銀行存款餘額資訊等,這些網頁資訊就不適合做快取的設定。
HSTS (Strict-Transport-Security)
這個設定主要通知瀏覽器之後的瀏覽行為強迫都要使用 HttpS。
Https 可以讓資料瀏覽器與網站間的資料傳輸加密,減少 Man in the Middle 的資訊安全漏洞風險。
Strict-Transport-Security: max-age=153000
X-Frame-Options
X-Frame 這個設定是什麼呢? 這個設定主要是要解決 Clickjacking的問題!
什麼是 Clickjacking呢?
舉下列這個圖當例子。駭客可能利用一個網站頁面
Twitter要求點選使用者條款,讓使用者看到一個 Twitter的網頁
但是背後真實網站誘導使用者點選的卻是賭博網站 Play!
為了避免這樣的問題,就可以設定 X-Frame:
X-Frame-Options: deny
X-XSS-Protection
Http Header 是有可能被挾帶 JavaScript
GET / HTTP/1.1
Host: shopping.pchome.com.tw
Connection: <javaScript>alert</JavaScript>
Cache-Control: max-age=0
因此,多半的瀏覽器都會將這樣的 JavaScript 過濾,
Http Header 也可以設定 XSS的保護:
X-XSS-Protection: 1; mode=block
其他與 http Header 有關的資訊安全風險,可參考