目錄
第1章 概述\t1
1.1 缺陷的基本概念\t1
1.2 發現缺陷的方法\t2
1.3 自動化缺陷檢測技術\t4
1.4 缺陷處置流程\t5
1.5 缺陷種類劃分\t6
1.5.1 輸入驗證類\t6
1.5.2 資源管理類\t8
1.5.3 代碼質量類\t10
1.6 代碼審計工具使用實例\t11
1.6.1 任務配置頁面\t11
1.6.2 檢測結果頁面\t13
1.7 代碼安全保障技術趨勢前瞻\t14
1.7.1 基於人工智能技術的代碼安全分析\t14
1.7.2 面向安全的軟件代碼成分分析\t15
1.7.3 面向DevSecOps的代碼安全測試\t15
1.7.4 交互式應用安全測試\t16
第2章 輸入驗證類缺陷分析\t17
2.1 SQL注入\t17
2.1.1 SQL注入的概念\t17
2.1.2 SQL注入的危害\t17
2.1.3 實例代碼\t18
2.1.4 如何避免SQL注入\t20
2.2 XML外部實體注入\t20
2.2.1 XML外部實體注入的概念\t20
2.2.2 XML外部實體注入的危害\t21
2.2.3 實例代碼\t21
2.2.4 如何避免XML外部實體注入\t24
2.3 命令注入\t24
2.3.1 命令注入的概念\t24
2.3.2 命令注入的危害\t25
2.3.3 實例代碼\t26
2.3.4 如何避免命令注入\t28
2.4 XPath注入\t28
2.4.1 XPath注入的概念\t28
2.4.2 XPath注入的危害\t28
2.4.3 實例代碼\t29
2.4.4 如何避免XPath注入\t32
2.5 LDAP注入\t32
2.5.1 LDAP注入的概念\t32
2.5.2 LDAP注入的危害\t33
2.5.3 實例代碼\t33
2.5.4 如何避免LDAP注入\t37
2.6 JSON注入\t37
2.6.1 JSON注入的概念\t37
2.6.2 JSON注入的危害\t38
2.6.3 實例代碼\t38
2.6.4 如何避免JSON注入\t40
2.7 XQuery注入\t40
2.7.1 XQuery注入的概念\t40
2.7.2 XQuery注入的危害\t40
2.7.3 實例代碼\t41
2.7.4 如何避免XQuery注入\t43
2.8 HTTP響應截斷\t43
2.8.1 HTTP響應截斷的概念\t43
2.8.2 HTTP響應截斷的危害\t44
2.8.3 實例代碼\t45
2.8.4 如何避免HTTP響應截斷\t46
2.9 不安全的反序列化(XStream)\t46
2.9.1 不安全的反序列化(XStream)的概念\t46
2.9.2 不安全的反序列化(XStream)的危害\t46
2.9.3 實例代碼\t47
2.9.4 如何避免不安全的反序列化(XStream)\t49
2.10 動態解析代碼\t49
2.10.1 動態解析代碼的概念\t49
2.10.2 動態解析代碼的危害\t49
2.10.3 實例代碼\t50
2.10.4 如何避免動態解析代碼\t51
2.11 ContentProvider URI注入\t52
2.11.1 ContentProvider URI 注入的概念\t52
2.11.2 ContentProvider URI 注入的危害\t52
2.11.3 實例代碼\t52
2.11.4 如何避免ContentProvider URI 注入\t54
2.12 反射型XSS\t54
2.12.1 反射型XSS的概念\t54
2.12.2 反射型XSS的危害\t55
2.12.3 實例代碼\t56
2.12.4 如何避免反射型XSS\t57
2.13 存儲型XSS\t58
2.13.1 存儲型XSS的概念\t58
2.13.2 存儲型XSS的危害\t58
2.13.3 實例代碼\t59
2.13.4 如何避免存儲型XSS\t61
2.14 弱驗證\t62
2.14.1 弱驗證的概念\t62
2.14.2 弱驗證的危害\t62
2.14.3 實例代碼\t63
2.14.4 如何避免弱驗證\t65
2.15 組件間通信XSS\t66
2.15.1 組件間通信XSS的概念\t66
2.15.2 組件間通信XSS的危害\t66
2.15.3 實例代碼\t67
2.15.4 如何避免組件間通信XSS\t68
2.16 進程控制\t69
2.16.1 進程控制的概念\t69
2.16.2 進程控制的危害\t69
2.16.3 實例代碼\t70
2.16.4 如何避免進程控制\t72
2.17 路徑遍歷\t72
2.17.1 路徑遍歷的概念\t72
2.17.2 路徑遍歷的危害\t72
2.17.3 實例代碼\t73
2.17.4 如何避免路徑遍歷\t75
2.18 重定向\t76
2.18.1 重定向的概念\t76
2.18.2 重定向的危害\t76
2.18.3 實例代碼\t77
2.18.4 如何避免重定向\t79
2.19 日志偽造\t79
2.19.1 日志偽造的概念\t79
2.19.2 日志偽造的危害\t79
2.19.3 實例代碼\t79
2.19.4 如何避免日志偽造\t81
第3章 資源管理類缺陷分析\t82
3.1 緩衝區上溢\t82
3.1.1 緩衝區上溢的概念\t82
3.1.2 緩衝區上溢的危害\t82
3.1.3 實例代碼\t83
3.1.4 如何避免緩衝區上溢\t85
3.2 緩衝區下溢\t85
3.2.1 緩衝區下溢的概念\t85
3.2.2 緩衝區下溢的危害\t86
3.2.3 實例代碼\t86
3.2.4 如何避免緩衝區下溢\t88
3.3 越界訪問\t88
3.3.1 越界訪問的概念\t88
3.3.2 越界訪問的危害\t88
3.3.3 實例代碼\t89
3.3.4 如何避免越界訪問\t90
3.4 釋放後使用\t91
3.4.1 釋放後使用的概念\t91
3.4.2 釋放後使用的危害\t91
3.4.3 實例代碼\t92
3.4.4 如何避免釋放後使用\t93
3.5 二次釋放\t94
3.5.1 二次釋放的概念\t94
3.5.2 二次釋放的危害\t94
3.5.3 實例代碼\t95
3.5.4 如何避免二次釋放\t96
3.6 內存洩漏\t97
3.6.1 內存洩漏的概念\t97
3.6.2 內存洩漏的危害\t97
3.6.3 實例代碼\t98
3.6.4 如何避免內存洩漏\t99
3.7 文件資源未釋放\t99
3.7.1 文件資源未釋放的概念\t99
3.7.2 文件資源未釋放的危害\t99
3.7.3 實例代碼\t100
3.7.4 如何避免文件資源未釋放\t101
3.8 流資源未釋放\t101
3.8.1 流資源未釋放的概念\t101
3.8.2 流資源未釋放的危害\t102
3.8.3 實例代碼\t102
3.8.4 如何避免流資源未釋放\t105
3.9 錯誤的資源關閉\t105
3.9.1 錯誤的資源關閉的概念\t105
3.9.2 錯誤的資源關閉的危害\t106
3.9.3 實例代碼\t106
3.9.4 如何避免錯誤的資源關閉\t107
3.10 重復加鎖\t107
3.10.1 重復加鎖的概念\t107
3.10.2 重復加鎖的危害\t108
3.10.3 實例代碼\t108
3.10.4 如何避免重復加鎖\t109
3.11 錯誤的內存釋放對像\t110
3.11.1 錯誤的內存釋放對像的概念\t110
3.11.2 錯誤的內存釋放對像的危害\t110
3.11.3 實例代碼\t111
3.11.4 如何避免錯誤的內存釋放對像\t112
3.12 錯誤的內存釋放方法\t113
3.12.1 錯誤的內存釋放方法的概念\t113
3.12.2 錯誤的內存釋放方法的危害\t113
3.12.3 實例代碼\t114
3.12.4 如何避免錯誤的內存釋放方法\t115
3.13 返回棧地址\t115
3.13.1 返回棧地址的概念\t115
3.13.2 返回棧地址的危害\t115
3.13.3 實例代碼\t116
3.13.4 如何避免返回棧地址\t117
3.14 被污染的內存分配\t117
3.14.1 被污染的內存分配的概念\t117
3.14.2 被污染的內存分配的危害\t118
3.14.3 實例代碼\t118
3.14.4 如何避免被污染的內存分配\t121
3.15 數據庫訪問控制\t122
3.15.1 數據庫訪問控制的概念\t122
3.15.2 數據庫訪問控制的危害\t122
3.15.3 實例代碼\t122
3.15.4 如何避免數據庫訪問控制\t124
3.16 硬編碼密碼\t125
3.16.1 硬編碼密碼的概念\t125
3.16.2 硬編碼密碼的危害\t125
3.16.3 實例代碼\t126
3.16.4 如何避免硬編碼密碼\t128
3.17 不安全的隨機數\t128
3.17.1 不安全的隨機數的概念\t128
3.17.2 不安全的隨機數的危害\t129
3.17.3 實例代碼\t129
3.17.4 如何避免不安全的隨機數\t131
3.18 不安全的哈希算法\t131
3.18.1 不安全的哈希算法的概念\t131
3.18.2 不安全的哈希算法的危害\t132
3.18.3 實例代碼\t132
3.18.4 如何避免不安全的哈希算法\t135
3.19 弱加密\t135
3.19.1 弱加密的概念\t135
3.19.2 弱加密的危害\t135
3.19.3 實例代碼\t136
3.19.4 如何避免弱加密\t138
3.20 硬編碼加密密鑰\t139
3.20.1 硬編碼加密密鑰的概念\t139
3.20.2 硬編碼加密密鑰的危害\t139
3.20.3 實例代碼\t139
3.20.4 如何避免硬編碼加密密鑰\t140
第4章 代碼質量類缺陷分析\t141
4.1 有符號整數溢出\t141
4.1.1 有符號整數溢出的概念\t141
4.1.2 有符號整數溢出的危害\t141
4.1.3 實例代碼\t142
4.1.4 如何避免有符號整數溢出\t143
4.2 無符號整數回繞\t144
4.2.1 無符號整數回繞的概念\t144
4.2.2 無符號整數回繞的危害\t144
4.2.3 實例代碼\t145
4.2.4 如何避免無符號整數回繞\t146
4.3 空指針解引用\t147
4.3.1 空指針解引用的概念\t147
4.3.2 空指針解引用的危害\t147
4.3.3 實例代碼\t148
4.3.4 如何避免空指針解引用\t149
4.4 解引用未初始化的指針\t149
4.4.1 解引用未初始化的指針的概念\t149
4.4.2 解引用未初始化的指針的危害\t149
4.4.3 實例代碼\t150
4.4.4 如何避免解引用未初始化的指針\t151
4.5 除數為零\t151
4.5.1 除數為零的概念\t151
4.5.2 除數為零的危害\t152
4.5.3 實例代碼\t152
4.5.4 如何避免除數為零\t154
4.6 在scanf()函數中沒有對%s格式符進行寬度限制\t154
4.6.1 在scanf()函數中沒有對%s格式符進行寬度限制的概念\t154
4.6.2 在scanf()函數中沒有對%s格式符進行寬度限制的危害\t154
4.6.3 實例代碼\t155
4.6.4 如何避免在scanf()函數中沒有對%s格式符進行寬度限制\t156
4.7 被污染的格式化字符串\t157
4.7.1 被污染的格式化字符串的概念\t157
4.7.2 被污染的格式化字符串的危害\t157
4.7.3 實例代碼\t158
4.7.4 如何避免被污染的格式化字符串\t160
4.8 不當的循環終止\t160
4.8.1 不當的循環終止的概念\t160
4.8.2 不當的循環終止的危害\t160
4.8.3 實例代碼\t160
4.8.4 如何避免不當的循環終止\t162
4.9 雙重檢查鎖定\t162
4.9.1 雙重檢查鎖定的概念\t162
4.9.2 雙重檢查鎖定的危害\t162
4.9.3 實例代碼\t162
4.9.4 如何避免雙重檢查鎖定\t165
4.10 未初始化值用於賦值操作\t165
4.10.1 未初始化值用於賦值操作的概念\t165
4.10.2 未初始化值用於賦值操作的危害\t165
4.10.3 實例代碼\t166
4.10.4 如何避免未初始化值用於賦值操作\t167
4.11 參數未初始化\t167
4.11.1 參數未初始化的概念\t167
4.11.2 參數未初始化的危害\t168
4.11.3 實例代碼\t168
4.11.4 如何避免參數未初始化\t169
4.12 返回值未初始化\t169
4.12.1 返回值未初始化的概念\t169
4.12.2 返回值未初始化的危害\t169
4.12.3 實例代碼\t170
4.12.4 如何避免返回值未初始化\t170
4.13 Cookie:未經過SSL加密\t171
4.13.1 Cookie:未經過SSL加密的概念\t171
4.13.2 Cookie:未經過SSL加密的危害\t171
4.13.3 實例代碼\t172
4.13.4 如何避免Cookie:未經過SSL加密\t174
4.14 郵件服務器建立未加密的連接\t174
4.14.1 郵件服務器建立未加密的連接的概念\t174
4.14.2 郵件服務器建立未加密的連接的危害\t174
4.14.3 實例代碼\t175
4.14.4 如何避件服務器建立未加密的連接\t176
4.15 不安全的SSL:過於廣泛的信任證書\t176
4.15.1 不安全的SSL:過於廣泛的信任證書的概念\t176
4.15.2 不安全的SSL:過於廣泛的信任證書的危害\t177
4.15.3 實例代碼\t177
4.15.4 如何避免不安全的SSL:過於廣泛的信任證書\t179
4.16 Spring Boot配置錯誤:不安全的Actuator\t179
4.16.1 Spring Boot配置錯誤:不安全的Actuator的概念\t179
4.16.2 Spring Boot配置錯誤:不安全的Actuator的危害\t179
4.16.3 實例代碼\t180
4.16.4 如何避免Spring Boot配置錯誤:不安全的Actuator\t180
4.17 未使用的局部變量\t181
4.17.1 未使用的局部變量的概念\t181
4.17.2 未使用的局部變量的危害\t181
4.17.3 實例代碼\t181
4.17.4 如何避免未使用的局部變量\t182
4.18 死代碼\t182
4.18.1 死代碼的概念\t182
4.18.2 死代碼的危害\t183
4.18.3 實例代碼\t183
4.18.4 如何避免死代碼\t184
4.19 函數調用時參數不匹配\t184
4.19.1 函數調用時參數不匹配的概念\t184
4.19.2 函數調用時參數不匹配的危害\t184
4.19.3 實例代碼\t184
4.19.4 如何避免函數調用時參數不匹配\t186
4.20 不當的函數地址使用\t186
4.20.1 不當的函數地址使用的概念\t186
4.20.2 不當的函數地址使用的危害\t186
4.20.3 實例代碼\t186
4.20.4 如何避免不當的函數地址使用\t188
4.21 忽略返回值\t188
4.21.1 忽略返回值的概念\t188
4.21.2 忽略返回值的危害\t188
4.21.3 實例代碼\t189
4.21.4 如何避免忽略返回值\t190