- C和C++安全編碼(原書第2版)
- (美)Robert C.Seacord
- 480字
- 2020-10-30 17:56:37
2.1.2 UTF-8
UTF-8是一個多字節字符集,它可以表示在Unicode字符集中的每個字符,而且與美國7位ASCII字符集向后兼容。每個UTF-8字符由1~4個字節(請參閱表2.1)表示。如果某個字符僅由1個字節編碼,那么此字節最高位是0且其他位包含碼值(取值范圍為0~127)。如果某個字符由多個字節的序列編碼,那么首字節中前導1的位數與序列的總字節數相同,然后緊跟著一個0位,且后面的字節都被標記為一個前導“10”位模式。在字節序列中的其余位拼接成Unicode的碼點值(取值范圍為0x80~0x10FFFF)。因此,一個具有前導0位的字節是一個單字節碼,一個具有多個前導1位的字節是一個多字節序列的首字節,而一個具有前導“10”位模式的字節是一個多字節序列的延續字節。這種字節格式允許檢測每個序列的開始,而無須從字符串的開頭解碼。
表2.1 形式合法的UTF-8字節序列
資料來源:[Unicode 2012]
前128個字符構成基本執行字符集,其中每個字符都是單字節。
UTF-8的解碼器有時會成為一個安全漏洞。在某些情況下,攻擊者可以通過向它發送UTF-8語法不允許的一個八位字節序列,來利用一個不謹慎的UTF-8解碼器。《C安全編碼標準》[Seacord 2008]包括“MSC10-C.字符編碼方式UTF-8相關的問題”,它描述這個問題以及其他與UTF-8相關的問題。
推薦閱讀
- Redis Applied Design Patterns
- Python for Secret Agents:Volume II
- C語言程序設計(第2版)
- Kali Linux Wireless Penetration Testing Beginner's Guide(Third Edition)
- Windows Forensics Cookbook
- Hands-On Natural Language Processing with Python
- Learning JavaScript Data Structures and Algorithms
- Mastering Akka
- 現代C++編程實戰:132個核心技巧示例(原書第2版)
- .NET 4.0面向對象編程漫談:應用篇
- C語言從入門到精通
- Continuous Delivery and DevOps:A Quickstart Guide Second Edition
- 安卓工程師教你玩轉Android
- Mastering ASP.NET Web API
- Android開發進階實戰:拓展與提升