# 網頁資訊安全 ###### tags: `Lidemy` 以下為 Lidemy [MTR05] 課程筆記,如有錯誤,歡迎留言/寄信通知,感謝。 --- 關於資安,一句總結: > 不要相信任何來自 client 端的資料 近年出現許多框架,對使用者來說是件好事,框架的好處是把很多基本功能包好好,使用者體驗很不錯,但基本功能往往是初學者需要知道,其中一個基本功能就是資訊安全的部分,這篇的目的就是簡介有關資訊安全的概念。 ## 1. 雜湊 一種對資料的處理方法,透過一連串的演算,將資料轉換成看似亂碼的字串。 特性:不可逆、同樣的輸入會有同樣的輸出。 2. 加密 如同大家熟知的加密,要有金鑰 (Key) 才能解開 3. 雜湊與加密的差別 雜湊:不可逆,使用演算法,將資料轉換成看似亂碼的字串。 加密:可逆,加密跟解密必須要有金鑰(Key)才能進行。 差別:雜湊不可逆,無法追溯源頭(或是超級無敵費時),給予的安全保護較佳。 4. SQL Injection? 如何防範? 使用者可以透過能 input 的地方,使用 SQL query 來進行操作,導致背後的資料庫,會直接接收 SQL 指令,在輸出使用者想要的資訊,後台資料就不但被看光光,還會被惡意刪除或修改。 防範方法:使用 prepare statement,將舊有的 springf + % 更新! ```php // 原本: $sql = sprintf( "INSERT INTO tableName(tableColumn1, tableColumn2) VALUES('%s', '%d')", $STRING, $NUM ); $result = $conn->query($sql); if (!$result) { die($conn->error); } // 更改為: $sql = "INSERT INTO tableName(tableColumn1, tableColumn2) VALUES(?, ?)"; $stmt = $conn->prepare($sql); // 兩個 s === 兩個 string 變數 $stmt->bind_param('ss', $nickname, $content); // 從 query($sql) 改為 execute() $result = $stmt->execute(); if (!$result) { die($conn->error); } // 取值 (若需要的話) $result = $stmt->get_result(); ``` 5. XXS? 如何防範? ross-site scripting 的縮寫,主軸就是放在 scripting。使用者可以在 input 的地方加入 script tag,如 `<scipt>alert(123)</script>` 或 `<h1></h1>`,讓理論上要輸入純文字的地方,變成可以執行的程式碼。 防範方法:在輸出的 encoding 上做處理,讓瀏覽器不會任意執行 JS 程式,讓它們成為純文字。PHP 可使用內建 htmlspecialchars 函式 example: `htmlspecialchars($str, ENT_QUOTES);` 6. 前端驗證 VS 後端驗證 7. CSRF ? 如何防範? 全名為 Cross Site Request Forgery,跨站請求偽造,又稱作 one-click attack,因為只要誤點一下就中招。利用瀏覽器的 cookie 機制來製造攻擊機會。因為瀏覽器是透過 cookie 來認使用者的臉,若取得 cookie,也等於取得你的臉,瀏覽器基本上會以為本人在自行操作,不會做出任何防備動作。 常見防範方法: 1. 每次使用網站後就登出,把通行證藏好 2. 檢查 request header 裡的 referer 欄位 3. 加上圖形驗證機制、簡訊驗證等 4. 加上 CSRF Token 5. Double Submit Cookie 6. SameSite Cookie