網路安全 Web 應用程式
Web 應用程式幾乎是我們所做的一切的組成部分,無論是訪問網際網路還是遠端控制您的割草機。在本入門課程中,我們將介紹 Web 應用程式安全的基礎知識。
HTTP 協議
HTTP 是一個承載協議,它允許我們的瀏覽器和應用程式接收 HTML(“超文字標記語言”)、CSS(“層疊樣式表”)、影像和影片等內容。
URL、查詢引數和協議
要訪問 Web 應用程式,我們需要使用 URL(“統一資源定位符”),例如:https://www.google.com/search?q=w3schools+cyber+security&ie=UTF-8
google.com 的 URL 包含一個域名、一個正在訪問的指令碼和查詢引數。
我們正在訪問的指令碼稱為 /search。/ 表示它位於提供檔案的伺服器的頂級目錄中。? 表示指令碼的輸入引數,& 分隔不同的輸入引數。在我們的 URL 中,輸入引數是
- q,值為 w3schools cyber security
- ie,值為 UTF-8
這些輸入的含義由 Web 伺服器的應用程式決定。
有時您只會看到 / 或 /?,表示已設定指令碼以響應此地址。通常,此指令碼是像 index 檔案這樣的東西,它會捕獲所有請求,除非指定了特定指令碼。
協議定義了要使用的協議。在我們的例子中,它是 URL 的第一部分:https。當 URL 中未定義協議時,它允許應用程式自行決定使用哪個協議。協議可以包括一整套協議,例如
- HTTP
- HTTPS
- FTP
- SSH
- SMB
HTTP 標頭
HTTP 協議使用許多標頭,有些是應用程式自定義的,有些則被技術廣泛接受和定義。
請求 http://google.com 的示例
GET /search?q=w3schools+cyber+security&ie=UTF-8 HTTP/1.1
Host: google.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36
Accept: image/avif,image/webp,image/apng,image/*,*/*;q=0.8
Referer: https://w3schools.com/
Accept-Encoding: gzip, deflate
Cookie: cookie1=value1;cookie2=value2
請求標頭指定了客戶端希望在目標 Web 伺服器上執行的操作。它還包含有關是否接受壓縮、訪問客戶端的型別以及伺服器告訴客戶端呈現的任何 cookie 的資訊。HTTP 請求標頭在此處進行了解釋
Header | Explanation |
---|---|
GET /search... HTTP/1.1 | GET 是我們用於訪問應用程式的動詞。在 HTTP 動詞部分有詳細解釋。我們還看到了路徑、查詢引數和 HTTP 版本 |
Host: google.com | 此標頭指示我們要使用的目標服務。伺服器可以擁有多個服務,如 VHOSTS 部分所述。 |
User-Agent | 客戶端應用程式(大多數情況下是瀏覽器)可以識別自己,包括版本、引擎和作業系統 |
Accept | 定義客戶端可以接受的內容 |
Referer: https://w3schools.com/ | 如果客戶端從其他網站點選了連結,則會使用 Referer 標頭來說明客戶端來自何處 |
Accept-Encoding: gzip, deflate | 內容可以被壓縮或編碼嗎?這定義了我們可以接受什麼 |
Cookie | Cookie 是伺服器在前幾次請求中傳送的值,客戶端在每個後續請求中都會將其傳送回來。在 State 部分有詳細解釋 |
透過此請求,伺服器將使用標頭和內容進行響應。下面的示例標頭
HTTP/1.1 200 OK
Content-Type: text/html
Set-Cookie: <cookie value>
<website content>
響應標頭和內容決定了我們將在瀏覽器中看到的內容。HTTP 響應標頭解釋如下
Header | Explanation |
---|---|
HTTP/1.1 200 OK | HTTP 響應程式碼。在 HTTP 響應程式碼部分有詳細解釋 |
Content-Type: text/html | 指定返回內容的型別,例如 HTML、JSON 或 XML |
Set-Cookie | 客戶端應記住並在下一個請求中返回的任何特殊值 |
HTTP 動詞
訪問 Web 應用程式時,客戶端會收到如何將資料傳送到 Web 應用程式的指示。應用程式可以接受許多動詞。
!動詞 | 用於 |
---|---|
GET | 通常用於透過查詢引數檢索值 |
POST | 用於透過傳送到 Web 伺服器的請求正文中的值將資料傳送到指令碼。通常涉及建立、上傳或傳送大量資料 |
PUT | 通常用於將資料上傳或寫入 Web 伺服器 |
DELETE | 指示應刪除的資源 |
PATCH | 可用於使用新值更新資源 |
這些根據 Web 應用程式的要求使用。Restful (REST) Web 服務特別擅長使用完整的 HTTP 動詞陣列來定義後端應執行的操作。
HTTP 響應程式碼
Web 伺服器上的應用程式可以根據伺服器端發生的情況返回不同的程式碼。以下是 Web 伺服器將向客戶端發出的常見響應程式碼,安全專業人員應瞭解這些程式碼
程式碼 | Explanation |
---|---|
200 | 應用程式正常返回 |
301 | 伺服器要求客戶端永久記住重定向到客戶端應訪問的新位置 |
302 | 臨時重定向。客戶端無需儲存此回覆 |
400 | 客戶端發出了無效請求 |
403 | 客戶端無權訪問此資源。需要授權 |
404 | 客戶端嘗試訪問不存在的資源 |
500 | 伺服器在嘗試滿足請求時出錯 |
REST
REST 服務,有時稱為 RESTful 服務,利用 HTTP 動詞和 HTTP 響應程式碼的全部功能來促進 Web 應用程式的使用。RESTful 服務通常使用 URL 的一部分作為查詢引數來確定 Web 應用程式上發生的事情。REST 通常由 API(“應用程式程式設計介面”)使用。
REST URL 將根據 URL 的不同元素呼叫功能。
示例 REST URL:http://example.com/users/search/w3schools
此 URL 將在 URL 的一部分而不是查詢引數中呼叫功能。我們可以將 URL 解析為
引數 | 註釋 |
---|---|
users | 訪問 users 功能部分 |
search | 訪問搜尋功能 |
w3schools | 要搜尋的使用者 |
會話和狀態
HTTP 中沒有內建的方法可以讓伺服器識別返回的訪問者。要讓 Web 伺服器識別使用者,必須在每個請求中與客戶端之間傳遞一個秘密值。這通常透過標頭中的 Cookie 來完成,但其他方式也很常見,例如透過 GET 和 POST 引數或其他標頭。不建議透過 GET 引數傳遞狀態,因為這些引數通常會在伺服器或代理等中介軟體中記錄。
以下是一些常見的 Cookie 示例,允許 Web 伺服器上的應用程式控制會話和狀態
- PHPSESSID
- JSESSIONID
- ASP.NET_SessionID
這些值代表伺服器上的特定狀態,通常稱為會話。此狀態表示例如
- 您已登入為哪個使用者
- 許可權和授權
重要的是,傳送給客戶端的會話值不能輕易被猜到或被他人識別。如果可以,攻擊者就可以冒充 Web 應用程式上的其他使用者。
狀態也可以儲存在客戶端。這涉及到伺服器將所有狀態傳送給客戶端,並依賴客戶端將所有專案發回。此類實現依賴於加密來檢查客戶端聲稱的狀態的完整性。下面列出了使用此實現的示例
- JWT(“JSON Web Tokens”)
- ASP.Net ViewState
您正在使用 Cookie 來學習本課程!您可以透過開啟瀏覽器的開發者工具來檢查這些 Cookie。這是透過在瀏覽器中按 F12
來完成的,這將開啟開發者工具視窗。在此視窗中,您應該能夠找到儲存 Cookie 的正確位置。
在 Google Chrome 中,Cookie 在上面的 Application 標籤中進行了標識。
虛擬主機
一個 Web 伺服器可以透過虛擬主機(通常縮寫為 Vhosts)處理許多應用程式。為了方便訪問其他虛擬主機,Web 伺服器通常會讀取客戶端請求的 Host 標頭,並根據此值將請求傳送到正確的應用程式。
URL 編碼
為了使應用程式能夠安全地在伺服器和客戶端之間傳輸內容,必須對某些字元進行編碼,以確保它們不會影響協議。為了保持通訊的完整性,使用了 URL 編碼。
URL 編碼使用 % 和兩個十六進位制數字替換不安全字元。例如
- 百分號替換為 %25
- 空格替換為 %20
- 引號替換為 %22
一個進行文字分析和執行 URL 解碼等操作的優秀工具是 CyberChef。您可以在此處嘗試在瀏覽器中開啟它:https://gchq.github.io/CyberChef/
JavaScript
為了支援動態內容,瀏覽器使用指令碼語言 JavaScript。這使得開發人員能夠編寫在客戶端執行的解決方案,從而實現更具互動性和“活潑”的 Web 內容。
JavaScript 也涉及許多針對 Web 應用程式和客戶端應用程式(如瀏覽器)的攻擊。
使用 TLS 進行加密
HTTP 協議不支援傳輸中資料的加密,因此在 HTTP 外部添加了包裝器以支援加密。這透過 HTTP 後面的 S 來表示,即 HTTPS。
以前使用 SSL(“安全套接字層”),但此後已被棄用。通常使用 TLS(“傳輸層安全”)來強制執行加密。