---
# System prepended metadata

title: 網頁資訊安全
tags: [Lidemy]

---

# 網頁資訊安全

###### 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