從開發到部署:確保Web應用程式的全面安全
1. 引言
隨著互聯網技術的迅速發展,Web應用程式已成為現代社會中不可或缺的一部分,涵蓋了從電子商務、社交媒體到企業內部管理等各種功能。然而,這些應用程式也成為了網絡攻擊者的主要目標。根據統計,全球每年因網絡攻擊所造成的損失數以億計,這不僅威脅到企業的正常運營,還可能造成個人隱私的洩露和財產的損失。因此,確保Web應用程式的安全已經成為每一位開發者和管理者的首要任務。
介紹Web應用程式安全的重要性
Web應用程式的安全性不僅關乎到企業的商譽和用戶的信任,更涉及到法律和合規性的要求。無論是SQL注入、跨站腳本攻擊(XSS)、還是其他各種形式的網絡攻擊,都可能導致數據洩露、服務中斷甚至是財務損失。
為了應對這些挑戰,開發者必須在應用程式的開發、部署和運行過程中採取一系列的安全措施,從而防止潛在的安全威脅。
簡述文章的目標和涵蓋範圍
本文提供一套全面的Web應用程式安全指南,涵蓋從開發到部署的各個階段。我們將深入探討在開發過程中需要考慮的安全編碼實踐、如何防止常見的攻擊如XSS和SQL注入,以及如何設計安全的認證和授權機制。此外,我們還將介紹靜態和動態應用程式安全測試(SAST和DAST),以及如何使用漏洞掃描工具來確保應用程式的安全。特別的是,我們會深入探討OWASP Top 10,這是目前最為權威的Web應用程式安全風險指南,並提供具體的防護措施。最後,我們將探討部署階段的安全策略、維護階段的安全管理以及應對安全事件的有效方法。
透過這一系列的學習,希望讀者能夠建立起全面的Web應用程式安全意識,並具備實踐中的安全技能,以確保所開發和運營的應用程式免受各種網絡威脅的侵害。
2. 開發階段的安全考量
在開發階段的安全考量中,應始終將安全性作為設計和編碼的核心原則,從一開始就內嵌在系統中。開發人員應實施和遵循安全編碼標準與最佳實踐,如正確處理用戶輸入、進行數據加密和驗證。通過持續的安全測試和程式碼審查,及早發現並修補潛在的漏洞,確保軟體在運行時的安全性。
a. 安全編碼實踐
- 安全意識:時刻考慮並防範潛在的安全威脅,確保每一行程式碼都遵循安全原則。
- 建議做到不信任任何輸入的資訊:通常服務或應用程式在沒有進一步驗證的情況下,不應該接受任何輸入,這避免了使用可能過時、格式錯誤或惡意資料的風險。
為了防止此項漏洞,開發人員應符合以下原則:- 永遠不要信任使用者輸入
- 提供使用者輸入時應限制使用者的選項
- 在執行送出請求前於用戶端進行初步驗證
- 在伺服器端接收使用者輸入表單時,使用「完全匹配、白名單、黑名單」進行驗證
- 拒絕無效輸入、或是清除及轉譯成有效輸入
- 應驗證來自所有類型來源的輸入,包括使用者、檔案、資料庫、網路、外部服務等
數據轉義不足:資料轉義旨在將某些字元轉譯成保留其含義的表達方式,且確保應用程式上下文將其解析為純文字資料而非指令。例如:
字元(char) 輸出(output) & &< <> >” "’ '/ /為了防止此項漏洞,開發人員應符合以下原則
- 對所有來自外部來源的資料進行編碼和轉義
- 確定哪些解譯器將使用資料,以及哪些字元應該編碼
- 不論是輸入還是輸出都應正確轉義
- 防範 SQL 注入:使用預備語句、參數化查詢和 ORM 工具來確保所有 SQL 查詢的安全。
改善措施:- 使用預備語句(Prepared Statements):預備語句(也稱為參數化查詢)可以確保 SQL 查詢中的每個參數都被正確地解釋為數據,而不是 SQL 語句的一部分。
- 使用 ORM(對象關係映射)工具:ORM 工具可以自動生成 SQL 查詢,並提供參數化查詢功能,從而減少手工編寫 SQL 語句的機會,降低 SQL 注入風險。
- 輸入驗證和清理:確保應用程序中的所有用戶輸入都經過嚴格的驗證和清理,以過濾掉潛在的惡意代碼。
- 最小權限原則:為數據庫用戶分配最小必要的權限,限制應用程序能夠執行的操作範圍,即使攻擊者成功進行 SQL 注入,他們的操作也會受到限制。
- 定期安全測試:進行定期的安全測試和代碼審計,識別和修復潛在的安全漏洞。
- 跨站腳本攻擊 (XSS) 的防護:對所有用戶輸入進行嚴格的輸入驗證和輸出編碼,防止惡意腳本注入。
1 2 3 4 5 6 7 8
... app.UseAuthorization(); // CSP 中間 app.Use(async (context, next) => { context.Response.Headers.Add("Content-Security-Policy", "default-src 'self'; script-src 'self' https://trustedscripts.example.com; object-src 'none'; style-src 'self' https://trustedstyles.example.com; img-src 'self' data:;"); await next(); });
CSP規則 說明 default-src 'self'僅允許從相同來源加載所有資源。 script-src僅允許從指定來源加載腳本。 object-src僅允許從指定來源加載插件內容(如 Flash)。 style-src僅允許從指定來源加載樣式表。 img-src僅允許從指定來源加載圖像。 connect-src僅允許從指定來源加載資源(如 AJAX 請求)。 font-src僅允許從指定來源加載字體。 media-src僅允許從指定來源加載音頻和視頻。 frame-src僅允許從指定來源加載框架內容。 sandbox启用指定的安全功能,例如 ‘allow-forms’, ‘allow-scripts’。 report-uri指定報告 URI,瀏覽器將 CSP 違反報告發送到此 URI。 block-all-mixed-content阻止加載所有混合內容(HTTP 和 HTTPS 混合)。 upgrade-insecure-requests自動將所有 HTTP 請求升級為 HTTPS。 - 跨站請求偽造 (CSRF) 的防護:使用 CSRF 令牌來驗證每個請求的合法性,防止未經授權的操作。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// HomeController
using Microsoft.AspNetCore.Mvc;
public class HomeController : Controller
{
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult SomeAction(SomeModel model)
{
if (ModelState.IsValid)
{
// 處理表單提交
}
return View(model);
}
}
// Startup
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
services.AddAntiforgery(options =>
{
// 在某些情況下,你可能希望使用自定義標頭來傳遞 CSRF 令牌。在這種情況下,需要在 Startup.cs 中設置自定義標頭名稱,並在 JavaScript 中包含該標頭:
options.HeaderName = "X-CSRF-TOKEN";
});
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// Index.html
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script>
$(document).ready(function () {
var token = $('input[name="__RequestVerificationToken"]').val();
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': token
}
});
$("#myForm").submit(function (event) {
event.preventDefault();
$.post({
url: '/Home/SomeAction',
data: $(this).serialize(),
success: function (response) {
// 處理成功響應
}
});
});
});
</script>
<form id="myForm" asp-action="SomeAction" method="post">
@Html.AntiForgeryToken()
<!-- 其他表單字段 -->
<button type="submit">提交</button>
</form>
b. 認證與授權
- 安全的密碼儲存:使用強加密算法(如 bcrypt)對密碼進行哈希處理,並加鹽儲存,以防止數據洩露時的密碼破解。
- 使用多因素認證 (MFA):在登入系統時,除了輸入密碼外,還需要提供另一種驗證方式(如短信驗證碼或指紋掃描)以增加安全性。
- 基於角色的存取控制 (RBAC):根據用戶的角色分配相應的權限,確保每個用戶只能訪問其職責範圍內的資源和操作。
不恰當的身份驗證
當應用程式不當驗證使用者身份時,就會產生此類型漏洞。這可能導致資源或功能曝露給意外的參與者,從而可能為攻擊者提供敏感資訊。
例如:將工作階段的 Cookie 資訊透過 base64decode 解密成 Json 透過替換其中的 role 使其變成管理員角色。
為了防止此項漏洞,開發人員應符合以下原則
- 建議注意身份驗證檢核是否足夠且正確,以避免遺漏
- 不要在 URL 中曝露中作階段 ID
- 實施多因子身份驗證
- 不要將使用者 ID,或可預測的序列值作為工作階段 ID,而要使用安全的伺服器端工作階段管理器,且該管理器產生具有高熵的隨機工作階段 ID
c. 敏感資料保護
- 資料保護:如果設計良好,應用程式應當實施安全控制項,以確保敏感資訊的保護和完整性。
- 數據加密:所有敏感數據在存儲和傳輸時都應使用強加密技術保護,以防止未經授權的訪問。
- 確保API的安全性:API應採用認證、授權和數據驗證機制來保護數據,防止未經授權的存取和攻擊。
深入到 Cookie 和工作階段:Cookie 通常包含工作階段資訊,因此攻擊者可以獲取這些資訊。通常導致 Cookie 工作階段漏洞的可能原因是,由於遺漏或不當配置 cookie flags 導致。例如:「Secure、HttpOnly、Domain」。HTTP 是一種無狀態協定,因此 Cookie 透過儲存與使用者動作相關的值來追蹤使用者的狀態。
如何保護Cookie
Headers 說明 Secure 避免在不安全的通道上傳輸 HttpOnly 禁止 JavaScript 讀取 Cookie 的值 Domain 設定 Cookie 可以使用的網域 Path 設定 Cookie 可用的子資料夾和頁面 Expires 確定何時應刪除 Cookie 為了防止此項漏洞,開發人員應符合以下原則
- 一律將工作階段資訊儲存在 cookie 中。而不將工作階段資訊作為參數傳遞(URL)。
- 設定 Secure、HttpOnly
- 將 Domain、Path 設定盡可能窄
- 將 Expires 設定為0,但永久性 cookie 除外
綜上所述,為了防止此項漏洞,開發人員應符合以下原則
- 僅在必要時才儲存私人資訊
- 永遠不要在程式碼中使用硬編碼(Hard Code)秘密資訊
- 不要使用純文字格式來儲存資料庫憑證或加密金鑰
- 安全儲存所有敏感資訊
- 透過安全通訊通道發送流量請求
- 告知使用者已經實施的隱私權原則
範例:一個良好的電子商務應用程式,在用戶進行信用卡付款時,使用「TLS」保護進出網站的通訊,信用卡號碼因為遮罩(Mask)也不會完整顯示,快取(cache)也被關閉,且信用卡號碼也被「強演算法」加密儲存在資料庫中,因此攻擊者幾乎不可能存取未經授權的資料。
本機儲存空間 又稱 Web 儲存空間,允許應用程式在用戶端儲存索引鍵/值對
localStorage.setltem("age", age);。
當應用程式顯示使用localStorage來儲存資料時,會出現這類漏洞。為了防止此項漏洞,開發人員應符合以下原則
- 由於
localStorage始終可以被JavaScript存取,並且沒有辦法限制路徑。因此開發人員在儲存機敏資訊時應避免使用 - 如果必須使用,可將數據先進行加密處理
- 設定適當的過期時間
- 確保應用程式使用 HTTPS,防止數據在傳輸過程中被攔截
- 定期清理
localStorage中不再需要的數據,減少潛在風險
- 由於
d. 重用現有的安全控制措施
在框架或語言中重新使用現有的安全控制措施:這項規則旨在避免過於複雜的開發方法,因為可能增加攻擊面,在可能的情況下,應重複使用已經證明其價值的現有實施作法。
應當考慮 「整潔編碼(Clear Code)」,假設在一段程式碼中有資訊安全漏洞,有多個地方重複使用到該段程式,但因為各自複雜性不同,遺漏一個應修正的地方,則將來該段程式就有可能被攻擊,因此若實施整潔編碼,使開發人員團隊都從一個特定程式庫取得該段程式,則修改時只須在一個地方上進行修改,且不會因複雜度而遺漏或造成混亂,那麼修復這項問題就可以很輕鬆且快速。
為了防止此項漏洞,開發人員應符合以下原則
- 在設計和實施系統時要謹記簡潔性
- 盡可能使用經過證實的程式庫,且避免使用複雜的架構
- 在團隊中指導開發人員如何使用設計模式,和編碼最佳做法非常重要
- 在設計和實施系統時要謹記簡潔性
e. 威脅建模
威脅建模是一種識別、溝通和理解安全威脅與緩解措施的方法,它可以幫助團隊評估威脅,並確定威脅的優先順序。
目前有許多威脅建模方法,如「STRIDE、Attack Trees等」,但在這些方法中有一些共同點,威脅模型應包含四個主要因素
- 資產(Assets):應用程式
- 漏洞(Vulnerabilities):被破解時可能造成損害的漏洞
- 威脅(Threats):由於破解漏洞而可能發生的潛在損害
- 威脅代理者(Threat Agents):利用漏洞造成威脅的人,這可能是內部人員也可能是外部人員
基本威脅建模過程應包括評估
- 正在處理的資產的說明或模型,以確定事前識別的每個威脅的總體風險
- 針對威脅的補救措施,確定可以採取哪些對策,來降低風險程度
要開始使用威脅建模,開發人員應符合以下原則
- 威脅建模在早期完成的情況下最有效,這樣潛在威脅可以為應用程式設計提供資訊參考
- 確保業務目標和需求在此威脅模型中發揮作用,以確保提供恰當的保護
- 隨著專案和環境的發展,應定期重新評估威脅
- 威脅建模過程應包括以下問題
- 我們在建置什麼?
- 可能出現的什麼樣的錯誤?
- 在哪裡最容易受到攻擊?
- 那些威脅最相關?
- 我們應該如何因應那些威脅?
- 我們怎麼做才能防範這些威脅?
- 我們的工作做得好嗎?
STRIDE 威脅建模
這是一種威脅建模方法,可以幫助您識別正在開發的應用程式中的潛在安全問題。它是由微軟Micosoft開發,且被認為是識別威脅最全面的方法之一。
| 字母 | 英文 | 威脅危及範圍 |
|---|---|---|
| S | 冒用(Spoofing) | 身份驗證(Authentication) |
| T | 竄改(Tampering) | 完整性(Integrity) |
| R | 否認(Repudiation) | 不可否認性(Non-repudiation) |
| I | 資訊洩漏(Information Disclosure) | 機密性(Confidentiality) |
| D | 拒絕服務(Denial of Service) | 可用性(Availability) |
| E | 特權提升(Elevation of Privilege) | 授權的預期屬性(Authorization) |
3. 測試階段的安全措施
a. 安全測試方法
- 靜態應用安全測試 (SAST):在開發階段分析程式碼,找出潛在的安全漏洞。
- 動態應用安全測試 (DAST):在運行階段模擬攻擊,檢測應用程式的安全缺陷。
- 滲透測試:模擬真實攻擊,評估系統的防禦能力和潛在的安全漏洞。
b. 自動化測試工具
- 使用CI/CD管道進行自動化安全測試:在持續集成和部署過程中自動執行安全測試,確保及早發現並修正安全問題。
4. 部署階段的安全策略
a. 安全配置
預設安全:表示應用程式的預設配置設定,是最安全的設定。
範例一:如果註冊使用者時,允許使用「弱密碼」的預設政策,則攻擊者就能很迅速的暴力破解出使用者的帳密,從而進行攻擊行為。
範例二:弱用戶端輸入驗證,在伺服器端使用損壞、自訂的驗證功能,資料庫使用的連線使用者甚至預設使用具有讀寫權限的使用者,那麼攻擊者就能刪除資料表。
為了防止此項漏洞,開發人員應符合以下原則
- 從一開始就安全地設計應用程式,將安全性整合到開發生命週期中
- 應用程式於註冊使用者時,就使用「強密碼」政策
- 一律套用「最小特權」原則,且伺服器元件應以最少的必要權限執行
- 停用任何不使用的服務或功能
- 設置安全的Web伺服器:確保Web伺服器配置正確,並使用最新的安全措施保護應用程式。
- 使用安全的配置文件:應用安全配置文件,防止不必要的訪問和潛在的安全漏洞。
b. 基礎設施安全
- 虛擬機和容器的安全性:保護虛擬機和容器環境,防止未授權的存取和攻擊。
- 使用防火牆和入侵檢測系統 (IDS):部署防火牆和入侵檢測系統,實時監控和防禦惡意活動。
c. 持續監控
- 日誌紀錄:當應用程式不紀錄與安全相關的資訊,即根本不紀錄時會發生此漏洞。另一方面當應用程式紀錄機密資訊時,也會發生此類漏洞。
為了防止此項漏洞,開發人員應符合以下原則- 使用框架集中日誌紀錄,這樣做可以確保日誌易於檢視並管理
- 應在所有「應用程式層」紀錄活動,並一律記錄關鍵事件(ex: 成功/失敗的登入嘗試、資料修改和查詢)
- 一般情況下記錄所有相關資訊,遵循「日誌紀錄的5W」原則
- 發生什麼事?
- 什麼時間?
- 在哪裡?(資訊主機、網路和介面)
- 影響範圍?
- 來自哪裡?
- 應避免記錄機敏資訊
- 僅限授權存取人員取得並分析日誌
- 日誌記錄和監控:持續收集和分析系統日誌,以發現和應對潛在的安全威脅。
- 安全信息和事件管理 (SIEM):集中管理和分析安全事件和信息,提供即時的威脅檢測和應對能力。
d. 瀏覽器安全策略
CSP、SOP 和 CORS:這類漏洞通常發生在不正確設定
CORS和CSP標頭所引起的。例如指定萬用字元,從而允許所有外部來源。或者遺漏CSP標頭,導致應用程式不會限制載入的來源。相同來源原則(SOP):是一種將來自不同源頭的來源隔離的安全機制。
源頭定義:protocol host port http:// www.example.com: 80 內容安全性原則(CSP):標頭允許應用程式定義,允許在其網站上載入的內容來源,如
javaScript、HTML框架和其他小程式。或者遺漏CSP標頭可能允許在應用程式中載入外部來源。Access-Control-Allow-Methods:*(指定存取資源時允許的方法)CSP 設置 說明 script-srt 定義可以執行哪個腳本 form-action 列出表單提交的有效端點 child-src 定義嵌入框架允許的內容 object-src 限制 Flash 和其他插件的載入位置 配置良好的 CSP 標頭可以防止跨網站指令馬處理、點擊劫持和網頁上的其他內容注入。
跨來源資源分享(CORS):標頭允許覆寫
SOP並使資源對其他來源可用。當CORS標頭為外部參與方授予對應嫆程式資源的存取權時,會發生來源問題。Access-Control-Allow-Origin:*(指定可以存取資源的 URL)
為了防止此項漏洞,開發人員應符合以下原則- 內容安全性政策:
- 確定應該能夠運行的資源
- 為每個頁面明確指定資源
- 設定 default-src
- 跨來源資源分享:
- 判斷是否需要向其他來源提供存取資源
- 避免配置過於寬鬆,不應指定萬用字元來允許公共存取
- 內容安全性政策:
e. 用戶端安全
- 用戶端安全措施存在問題:此類漏洞會在伺服器端,僅依賴在用戶端實施的安全機制時出現,例如輸入表單驗證。
為了防止此項漏洞,開發人員應符合以下原則- 切勿僅依賴用戶端驗證,應該在伺服器端同時進行驗證,尤其是與安全相關的檢核
- 切勿儲存機敏資訊(如使用者密碼等)
範例:例如輸入留言或評論時,前端針對輸入進行允許字元檢查,但在送出請求時,攻擊者簡單透過「攔截代理」設定,即可在用戶端驗證完成之後修改請求,已修改評論包含未經允許的字元,成功進行儲存 XSS 攻擊,只因該應用程式只依賴於用戶端輸入驗證,而導致 XSS。
5. 維護和更新
a. 定期安全審查
- 程式碼審查:持續進行程式碼審查,以識別並修復潛在的安全漏洞。
- 安全漏洞掃描:使用安全漏洞掃描工具,檢測並修復系統中的安全缺陷。
b. 安全補丁管理
- 更新軟體和依賴項:定期更新應用程式及其所有依賴項,以保持系統的安全性。
- 快速應對安全漏洞:在發現安全漏洞時,迅速採取行動,發布修補程式以保護系統。
6. 安全設計原則
深度防禦
深度防禦是一種設計原則,旨在透過將網路存取伺服器服務分層化,提高駭客入侵的難度,從而達到保護應用程式的目的。
- 資料層級:
- 機敏資料儲存在資料庫時會被加密(ex: 使用者密碼)
- 應具備:存取控制、加密、備份、還原程序
- 應用程式層級:
- 應用程式具有廣泛的輸入驗證機制(ex: 防止注入攻擊)
- 應具備:身份驗證、授權、稽核(也稱AAA)及強化安全編碼
- 伺服器層級:
- 伺服器主機無論是OS版本還是JAVA版本或是其他任何防毒,都一律更新到最新
- 應具備:強化身份驗證、修補程式管理、防毒軟體
- 內部網路層級:
- 內網被劃分成不同區域,並受防火牆規則保護
- 應具備:IPsec、TLS、NAT
- 周邊層級:
- 防火牆將內部網路邊界與外部網際網路區分開
- 應具備:防火牆、TLS、拒絕服務、預防
- 實體層級:
- 伺服器位於一個需要權限識別證保護的機房中
- 應具備:警衛、鎖具、追蹤裝置、識別證系統
- 綜合層級:
- 進行安全評估與依從性檢查
開放式設計
同樣屬於一種設計原則,開發人員應從頭開始安全地設計並實施系統,不能僅僅依賴「透果隱匿來實現安全性」,一些特殊的伺服器控制項應基於公開且已知的原則,這樣即使駭客知道應用程式的內部運作方式,這些控制項仍然安全且可靠。
例如:網頁中夾雜隱藏表單,用以控制權限高低,只要在提交前竄改,即可取得超越自己本來擁有的權限,進而對伺服器進行不正當的存取控制。
最低權限
這是一條通運規則,它規定所有使用者、應用程式和系統功能都應以盡可能少的權限執行,來完成各自的角色。
例如:在某個功能的後端程式會進行資料庫存取,該存取連線使用者具有「讀寫權限」儘管實際上該應用程式功能不需要,若遭遇「SQL注入攻擊」則可能發生特定資料表被刪除,進而導致應用程式崩潰(生產中斷、資料遺失)。
為了防止此項漏洞,開發人員應符合以下原則
- 雖然這並不能修補任何已發現的安全漏洞,但這將使攻擊者儘管竊取到用戶帳號,卻也不能用來執行超過其存取權限的行為
- 作為一項一般規則,由應用程式產生的處理程序,應以完成該任務所需的最小權限執行,而非更大的特權權限
- 應用程式使用者應具有盡可能少的權限,即完成其業務所需的必要權限
- 開發人員應實施角色存取控管,並在「預設拒絕」情況下,依特定情境開放
故障時的安全性
闡述關於應用程式在例外狀況發生時,應該如何呈現的問題,所有異常都應以安全的方式處理。
- 除非使用者已明確接收到應用程式某個部分的權限,否則應拒絕他們存取
- 所有動作都應具有確定的結果,並且必須使用通用錯誤訊息處理異常
- 每個程式碼區塊應該只有三個確定的結果:
- 如果使用者具有權限,則執行動作行為
- 如果使用者沒有權限,則不執行動作行為
- 如果發生例外,則回覆動作並顯示錯誤訊息
- 開發人員應實施強大的錯誤處理,為了確保安全性,應於出現異常時使用通用錯誤訊息。
- 確保系統在發生故障後處於安全狀態
強大的錯誤檢查
這是一種確保機敏資料,不會透過錯誤訊息洩漏的做法。
當攻擊者輸入一段會造成伺服器崩潰的字段時,伺服器回傳了一個包含程式碼推疊追蹤的例外處理頁面,這使得攻擊者掌握了應用程式使用的框架、資料庫連線、部分程式碼等資訊
為了防止此項漏洞,開發人員應符合以下原則
- 當例外錯誤發生時,應盡可能少的向使用者提供資訊,且使用通用錯誤訊息
- 應用程式應以可控且安全的方式關閉
- 切勿洩漏機敏資訊,如:推疊追蹤、內部IP、使用者資訊或資料庫資訊等
- 通常會將錯誤訊息寫入日誌檔,以供系統管理者進一步分析
- 確保系統捕獲所有可能的錯誤,以確保應用勝持續進行
不安全的直接物件引用 (IDOR)
應用程式根據使用者提供的輸入,並允許使用者存取物件時,攻擊者可以繞過授權要求,並直接存取系統中的資源。
範例1:登入頁面攻擊者替換查詢使用者ID,任意存取其他人的機敏資訊、私人訊息、檔案或其他資源等,而無須授權檢查。
範例2:如在應用程式中發出的任何請求,而後端API完全不對此進行授權檢查,即會發生此不安全的直接物件引用漏洞。
為了防止此項漏洞,開發人員應符合以下原則
- 開發人員應確保行動裝置呼叫的後端 API 對相關端點採取適當的存取控制
- 對不同授權等級的使用者進行單元測試檢驗
7. OWASP Web Top 10 2021
OWASP是一個資安界聞名的國際非營利組織。而該組織大約每三年會公布一次Web領域前十大風險類別,供各界參考。
2021年版的Top 3分別是:
- A01 - Broken Access Control (權限控制失效)
- A02 - Cryptographic Failures (加密機制失效)
- A03 - Injection (注入式攻擊)
想瞭解更多有關 OWASP Web Top 10 的資訊可以參考 OWASP Top 10 2021 介紹 OWASP Top 10台灣分會翻譯過的資訊,感謝他們。
若以 A03 - Injection (注入式攻擊) 舉例,這個類型底下有許多弱點:
- CWE-79: Improper Neutralization of Input During Web Page Generation (‘Cross-site Scripting’, 俗稱XSS)
- CWE-89: Improper Neutralization of Special Elements used in an SQL Command (‘SQL Injection’)
- CWE-77: Improper Neutralization of Special Elements used in a Command (‘Command Injection’)
- …
這一類風險的核心改善措施是 對任何外部輸入的資料都需經過驗證」。
8. 結論
本文深入探討了Web應用程式的全面安全性,從開發、測試到部署,介紹了防範常見網絡攻擊的方法。通過實施安全編碼實踐、使用CSRF令牌、配置內容安全策略(CSP)以及進行持續的安全測試和監控,我們可以有效地保護應用程式免受各種威脅。最終,建立全面的安全意識和遵循最佳實踐是確保Web應用程式安全的關鍵。
9. 附錄
參考文獻和資源