• HTTP 資料傳輸的資訊安全與 Http Header的設定

    這篇文章主要針對 HTTP 這個通訊協定的資訊安全做基本的介紹。

    HTTP 是所有網路服務與網站的通訊基礎。

    因此,要打造安全的網站,必須先對 HTTP有基本的了解。

    我們主要針對 Http Request Get/POST 的資料傳輸來說明HTTP可能的資訊安全風險。

    另外,我們也介紹三個常見必且與資訊安全相關的 Http Header 。

     

    Http Get Request

    這是一個 Http Get Request 的實例。 HTTP GET 透過網址的方式將參數透過網址傳遞。

    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

    這個例子中,說明瀏覽器透過 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 來傳遞。

    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

     

    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 有關的資訊安全風險,可參考

    https://www.owasp.org/index.php/List_of_useful_HTTP_headers

    Posted by Tony @ 11:13 am

  • Leave a Reply

    Your email address will not be published.