網頁應用程式有哪些需要考慮的重要安全性策略呢?
網頁應用程式大多運行於網際網路,因此常常受到外部惡意人士的攻擊。
為保護網頁應用程式,常見的安全策略包含:CSP、同源政策、防範XSS、SQL Injection、CSRF
Content Security Policy (CSP) 是一種網站安全機制,用於限制網頁執行特定類型的不安全行為。通過定義網頁內容的安全政策,CSP 可以調整網頁端各項行為的安全性設定,包括資源載入來源的限制、是否允許 inline JavaScript 和 CSS,以及是否僅允許 HTTPS 請求。
同源政策 (Same-origin policy) 是一種瀏覽器安全機制,此機制不允許其他網域的js存取目前網站的cookie, dom, localStorage, indexedDB,呼叫其他網域的ajax也會受到限制。以減少XSS, cookie洩漏等外部攻擊的風險。
如果想要存取其他網域的資源,可以通過跨域資源共享(CORS)或JSONP等方式實現。CORS藉由response header增加Access-Control-Allow-Origin來允許其他網域的資源。JSONP藉由在HTML中載入Script標籤來規避同源策略限制。
XSS(跨站指令碼攻擊)是一種常見的網站安全漏洞攻擊方式。攻擊者通過向網站注入惡意程式碼,使得使用者在瀏覽網站時執行該惡意程式碼,從而達到攻擊的目的,如重新導向到其他網站或竊取使用者輸入的資訊。
SQL injection 攻擊是指直接把不可信任的變數直接串上 SQL 字串,若此變數內含攻擊內容,則資料庫可能會被攻擊或取出未經授權的資料。避免 SQL injection 的方法有兩種:
不要直接把不可信任的變數串上 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();
檢查不可信任的變數是否包含危險字串或非預期的內容,例如單引號、分號等。如果包含危險字串,則拋出錯誤或進行適當的處理。
Cross-Site Request Forgery (CSRF) 是一種攻擊方式,利用已登入網站的使用者認證,對攻擊目標網站執行惡意行為。
背景: 使用者已經登入攻擊目標網站,並且瀏覽器中保存有該網站的 Cookie。
攻擊: 使用者訪問一個惡意網站,該網站中包含一個圖片或超連結,該圖片或超連結會向攻擊目標網站發送帶有攻擊內容的請求。由於該請求攜帶了正確的 Cookie,攻擊目標網站會信任此請求,從而受到攻擊。