iT邦幫忙

2023 iThome 鐵人賽

DAY 17
0
Software Development

軟體架構備忘錄系列 第 17

Day 17 程式架構 - 網頁應用程式安全 (知識點085~089)

  • 分享至 

  • xImage
  •  

思考的問題

網頁應用程式有哪些需要考慮的重要安全性策略呢?

網頁應用程式大多運行於網際網路,因此常常受到外部惡意人士的攻擊。
為保護網頁應用程式,常見的安全策略包含:CSP、同源政策、防範XSS、SQL Injection、CSRF


CSP內容安全策略

描述

Content Security Policy (CSP) 是一種網站安全機制,用於限制網頁執行特定類型的不安全行為。通過定義網頁內容的安全政策,CSP 可以調整網頁端各項行為的安全性設定,包括資源載入來源的限制、是否允許 inline JavaScript 和 CSS,以及是否僅允許 HTTPS 請求。

優點

  • 限制瀏覽器執行風險性動作的可能性,減少安全性風險的發生。

缺點

  • 設定較複雜,需要理解各種設定的行為細節差異。
  • 需仔細設計和測試 CSP 規則,以確保不影響網站功能的正常運作,特別是對於使用了較高風險性行為(如 inline CSS)的現有網站功能。

同源政策

描述

同源政策 (Same-origin policy) 是一種瀏覽器安全機制,此機制不允許其他網域的js存取目前網站的cookie, dom, localStorage, indexedDB,呼叫其他網域的ajax也會受到限制。以減少XSS, cookie洩漏等外部攻擊的風險。

如果想要存取其他網域的資源,可以通過跨域資源共享(CORS)或JSONP等方式實現。CORS藉由response header增加Access-Control-Allow-Origin來允許其他網域的資源。JSONP藉由在HTML中載入Script標籤來規避同源策略限制。


防範 XSS

描述

XSS(跨站指令碼攻擊)是一種常見的網站安全漏洞攻擊方式。攻擊者通過向網站注入惡意程式碼,使得使用者在瀏覽網站時執行該惡意程式碼,從而達到攻擊的目的,如重新導向到其他網站或竊取使用者輸入的資訊。

三種XSS類型

  • 反射型:惡意程式碼通過URL參數、Cookie或表單等使用者可控的資料傳入後端,後端將這些資料直接返回給前端,導致惡意程式碼在使用者瀏覽網頁時被執行。
  • 儲存型:惡意程式碼被儲存在資料庫中,當從資料庫中提取資料並在前端呈現時,惡意程式碼被執行。
  • DOM型:惡意程式碼通過Ajax等方式返回給前端,前端直接將惡意程式碼插入到頁面的DOM結構中,導致惡意程式碼被執行。

預防XSS的方式

  • 使用CSP(內容安全策略)來限制網頁的執行內容,防止惡意程式碼的注入和執行。
  • 對輸出到網頁上的資料進行HTML編碼,確保不會顯示具有風險的內容,避免惡意程式碼的執行。
  • 對傳輸到後端的資料進行輸入驗證和過濾,避免使用和儲存具有風險的內容。
  • 定期對網站執行黑箱滲透測試、白箱原始碼掃描,以確保網站沒有安全性漏洞。

SQL injection

描述

SQL injection 攻擊是指直接把不可信任的變數直接串上 SQL 字串,若此變數內含攻擊內容,則資料庫可能會被攻擊或取出未經授權的資料。避免 SQL injection 的方法有兩種:

  1. 不要直接把不可信任的變數串上 SQL 字串,而是使用元件傳遞變數的方式。例如,在 Java 中可以使用 PreparedStatement 來傳遞變數:

    有SQL injection 風險的範例

    String title = request.getParameter("title"); // 從前端傳來的變數
    String sql = "SELECT * FROM booking WHERE title = " + title;
    Statement stmt = conn.createStatement();
    stmt.executeQuery(sql);
    

    修正後的範例

    String title = request.getParameter("title"); // 從前端傳來的變數
    String sql = "SELECT * FROM booking WHERE title = ?";
    PreparedStatement stmt = conn.prepareStatement(sql);
    stmt.setString(1, title);
    stmt.executeQuery();
    
  2. 檢查不可信任的變數是否包含危險字串或非預期的內容,例如單引號、分號等。如果包含危險字串,則拋出錯誤或進行適當的處理。


防範 CSRF跨站請求偽造

描述

Cross-Site Request Forgery (CSRF) 是一種攻擊方式,利用已登入網站的使用者認證,對攻擊目標網站執行惡意行為。

攻擊範例情境

背景: 使用者已經登入攻擊目標網站,並且瀏覽器中保存有該網站的 Cookie。

攻擊: 使用者訪問一個惡意網站,該網站中包含一個圖片或超連結,該圖片或超連結會向攻擊目標網站發送帶有攻擊內容的請求。由於該請求攜帶了正確的 Cookie,攻擊目標網站會信任此請求,從而受到攻擊。

防範方式

  1. 伺服器端應檢查請求的標頭中的 Origin 或 Referer 是否與目標網站的網域一致,若不一致,則拒絕處理此請求。
  2. 伺服器端在生成網頁時,應生成一個具有隨機性的 CSRF token,並將其存儲在使用者的會話中而非 Cookie 中。每次收到請求時,伺服器端需檢查該請求攜帶的 CSRF token 是否與使用者會話中的相符,以確認請求是否來自正確的網頁。

上一篇
Day 16 程式架構 - 行為型設計模式 (知識點080~084)
下一篇
Day 18 網路架構 - 網路設備 (知識點090~094)
系列文
軟體架構備忘錄30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言