|  |
| --- |
| 系列條目 |
| 信息安全 |
|  |
| 
相關安全分類 |
| * 计算机安全
* 汽車網路安全
* 網路犯罪（英语：）
	+ 網路性交易（英语：）
	+ 电脑诈骗
* 網路末日戰
* 網路恐怖主義
* 網絡戰
* 電子作戰
* 信息战
* 互联网安全（英语：）
* 移動安全
* 网络安全
* 复制保护
* 数字版权管理
 |
| 
威脅 |
| * 廣告軟體
* 高级长期威胁
* 任意代码执行
* 軟體後門
* 硬體後門（英语：）
* 代碼注入
* 犯罪软件
* 跨網站指令碼
* 騎劫挖礦
* 殭屍網絡
* 数据泄露
* 路过式下载
* 浏览器辅助对象
* 电脑犯罪
* 计算机病毒
* 資料抓取（英语：）
* 阻斷服務攻擊
* 竊聽
* 郵件詐騙（英语：）
* 郵件混淆（英语：）
* 漏洞利用
* 键盘记录
* 邏輯炸彈
* 定時炸彈（英语：）
* Fork炸弹
* Zip 炸弹
* 欺詐撥號器（英语：）
* 恶意软件
* 负载
* 钓鱼式攻击
* 多型引擎
* 特权提升
* 勒索軟體
* Rootkit
* 恐嚇軟體
* Shellcode
* 濫發電子訊息
* 社会工程学
* 屏幕抓取（英语：）
* 间谍软件
* 程序错误
* 特洛伊木马
* 硬體木馬（英语：）
* 远程桌面软件
* 漏洞
* 後門殼層
* 刪除器（英语：）
* 電腦蠕蟲
* SQL注入
* 流氓软件
* 殭屍電腦
 |
| 
防禦 |
| * 應用程式安全
	+ 安全程式碼撰寫
	+ 預設安全
	+ 基於安全的設計
		- 誤用案例（英语：）
* 電腦存取控制（英语：）
	+ 身份验证
		- 多重要素驗證
	+ 授權
* 電腦安全軟體（英语：）
	+ 杀毒软件
	+ 安全作業系統（英语：）
* 以資料為中心的安全（英语：）
* 代码混淆
* 数据脱敏
* 加密
* 防火墙
* 安全強化
* 入侵检测系统
	+ 主機入侵檢測系統 (HIDS)
	+ 异常检测
* 安全性資訊與事件管理（英语：） (SIEM)
* 安全性協作（英语：） (SOAR)
* 安全行動閘道（英语：）
* 應用程式執行期保護（英语：）
 |
| * 
* 论
* 编
 |

**安全程式碼撰寫**（Secure coding）是依照安全指引開發電腦軟體，避免引入漏洞的軟體開發實務。設計缺陷、程序错误及邏輯謬誤是最常被利用軟體漏洞的主要原因。若識別出這些不安全的程式碼撰寫實務，教育程式設計師改用較安全的軟體寫法，組織可以有主動的措施，在程式佈置之前就消除或大幅減少軟體漏洞。

有些研究者建議，為了有效的面對網路安全相關的威脅，應該在程式碼撰寫時加入適當的安全性。若在軟體設計時就已考慮安全性，這可以避免內部人士的攻擊，也減少和應用程式安全有關的威脅。

避免缓冲区溢出
-------

缓冲区溢出是常見的軟體安全漏洞，若程序要在固定長度的緩衝區儲存超過其大小的資料，就會出現此一問題。例如，有8個位置可以儲存資料，但程式卻試著要儲存9個資料，就會出現問題。缓冲区溢出會覆寫到鄰近位置的記憶體，造成安全漏洞（棧緩衝區溢出）或是程式中止執行（例如出現記憶體區段錯誤）

以下是一個容易出現缓冲区溢出的C語言程式例子

```
：
int vulnerable\_function(char \* large\_user\_input) {
 char dst[SMALL];
 strcpy(dst, large\_user\_input);
}

```

若使用者輸入的資料比緩衝區的大小要大，就會出現缓冲区溢出。

若要修正此一問題，可以用strncpy來避免缓冲区溢出

```
int secure\_function(char \* user\_input) {
 char dst[BUF\_SIZE];
 // copy a maximum of BUF\_SIZE bytes
 strncpy(dst, user\_input, BUF\_SIZE);
}

```

另一種作法是用malloc（英语：）指令，在heap裡動態分配記憶體

```
char \* secure\_copy(char \* src) {
 size\_t len = strlen(src);
 char \* dst = (char \*) malloc(len + 1);
 if (dst != NULL) {
 strncpy(dst, src, len);
 // append null terminator 
 dst[len] = '\0';
 }
 return dst;
}

```

在上述的程式片段裡，程式設法將src的內容複製到dst，不過也會檢查malloc的傳回值，確定有足夠的記憶體可以分配記憶體給dst。

避免格式字串攻擊
--------

格式字串攻擊（英语：）是惡意用戶在輸入一些會提供給格式設定函式（如printf()）的資料時，輸入特殊的內容，讓函式的動作異常。此攻擊會破壞性的讀取或寫入呼叫堆疊。

C語言的printf函式會將輸出寫到stdout。若其引數的格式有誤時，會造成一些嚴重的安全錯誤。以下是一個格式字串攻擊的例子。

```
int vulnerable\_print(char \* malicious\_input) {
 printf(malicious\_input);
}

```

像是"%s%s%s%s%s%s%s"就屬於惡意輸入，會因為不正確的記憶體讀取而讓程式崩潰。

避免整數溢位
------

整數溢位會出現在整數運算的結果太大，用規劃的記憶體空間無法正確表示的情形。若程式沒有檢查整數運算的結果，設法避免整數溢位，可能會造成軟體錯誤或是漏洞。

以下是C++的函式，原始目的是要確認x和y相加的結果小於等於已定義好的數值MAX:

```
bool sumIsValid\_flawed(unsigned int x, unsigned int y) {
 unsigned int sum = x + y;
 return sum <= MAX;
}

```

這段程式的問題是在進行整數的加法之後才進行檢查。若x和y的和大於`unsigned int`可以表示的最大值，在進行加法之後就已出現溢位，因此雖然x和y的和大於MAX，但是其溢位後的結果可能會小於MAX。

以下也是檢查溢位的程式，加上了檢查x和y的和是否有大於等於x,y二個數值的判斷，因為x和y是無號數整數，二者的和不會小於其中的任一數字。若是若計算出來的和小於任一數字，就代表已經溢位了。

```
bool sumIsValid\_secure(unsigned int x, unsigned int y) {
 unsigned int sum = x + y;
 return sum >= x && sum >= y && sum <= MAX;
}

```

避免目錄遍歷
------

目錄遍歷是由不可靠來源提供的路徑產生的漏洞，該路徑造成了未授權的伺服器目錄或是檔案存取。

例如，考慮一個接受檔案名稱，讀取文章的腳本，腳本會讀檔案名稱輸入，之後進行處理。這樣腳本可能會用類似以下的的URL 來找有關dog food的文章。

```
https://www.example.net/cgi-bin/article.sh?name=dogfood.html
```

若此腳本沒有輸入檢查，相信使用者輸入的檔案都是有效的，惡意使用者可能會產生以下的URL來取得網站伺服器的組態：

```
https://www.example.net/cgi-bin/article.sh?name=../../../../../etc/passwd
```

若是在类Unix系统中，這可能會洩漏/etc/passwd檔，其中包括了用户ID、用户名稱、家目录路徑等。（SQL注入也是類似情境下的攻擊）。

相關條目
----

* 應用程式安全
* 防御性编程
* 安全錯誤
* 預設安全

參考資料
----

1. 1 2  Viega, John; Gary McGraw.. MAddison-Wesley Professional. 2001: 528. ISBN 978-0201721522.
2. ↑  Taylor, Blair; Azadegan, Shiva.. . InfoSecCD '06. Kennesaw, Georgia: Association for Computing Machinery. 2006-09-22: 24–29. ISBN 978-1-59593-437-6. S2CID 2452783. doi:10.1145/1231047.1231053.
3. ↑  Russell L, Jones.. Information Systems Security. Dec 2004. ProQuest 229507883.

參考書目
----

* Taylor, Art; Brian Buege; Randy Layman.. McGraw-Hill Primis. 2006: 426. ISBN 0-390-59975-1.