软件供应链安全——源代码缺陷实例剖析
目录
第1章 概述 1
1.1 缺陷的基本概念 1
1.2 发现缺陷的方法 2
1.3 自动化缺陷检测技术 4
1.4 缺陷处置流程 5
1.5 缺陷种类划分 6
1.5.1 输入验证类 6
1.5.2 资源管理类 8
1.5.3 代码质量类 10
查看完整
第1章 概述 1
1.1 缺陷的基本概念 1
1.2 发现缺陷的方法 2
1.3 自动化缺陷检测技术 4
1.4 缺陷处置流程 5
1.5 缺陷种类划分 6
1.5.1 输入验证类 6
1.5.2 资源管理类 8
1.5.3 代码质量类 10
查看完整
奇安信代码安全实验室专注于软件源代码安全分析技术和二进制漏洞挖掘技术的研究与开发。基于多年的技术积累,奇安信代码安全实验室在国内率先推出了自主可控的软件代码安全分析系统——奇安信代码卫士和奇安信开源卫士。奇安信代码安全实验室支撑漏洞平台的技术工作,多次向国家信息安全漏洞库(CNNVD)和国家信息安全漏洞共享平台(CNVD)报送原创通用型漏洞信息,并获得表彰。同时,还为微软、谷歌、苹果、华为等大型厂商和机构的软件安全缺陷和漏洞发现提供服务与支撑,并以期为更多用户构建代码安全保障体系,消除软件代码安全隐患。
源代码缺陷是指在软件开发生命周期的编码阶段,产生的有意或者无意的缺陷。为了便于读者更好地了解各种缺陷的基本特性,本书根据缺陷产生的原因、造成的结果以及表现形式等因素,将60种重要且常见缺陷分为3大类:输入验证类、资源管理类和代码质量类。全书分为4章,第1章概述了源代码缺陷的基本概念、发现缺陷的方法、自动化缺陷检测技术、缺陷处置流程、缺陷种类划分、代码审计工具、代码安全保障技术趋势;第2章至第4章通过具体实例依次介绍了各类缺陷的原理、危害、在代码中的表现形式及修复建议。本书适合有一定计算机编码基础和网络安全基础的读者阅读,也适合作为网络安全爱好者的参考书。
目录
第1章 概述 1
1.1 缺陷的基本概念 1
1.2 发现缺陷的方法 2
1.3 自动化缺陷检测技术 4
1.4 缺陷处置流程 5
1.5 缺陷种类划分 6
1.5.1 输入验证类 6
1.5.2 资源管理类 8
1.5.3 代码质量类 10
1.6 代码审计工具使用实例 11
1.6.1 任务配置页面 11
1.6.2 检测结果页面 13
1.7 代码安全保障技术趋势前瞻 14
1.7.1 基于人工智能技术的代码安全分析 14
1.7.2 面向安全的软件代码成分分析 15
1.7.3 面向DevSecOps的代码安全测试 15
1.7.4 交互式应用安全测试 16
第2章 输入验证类缺陷分析 17
2.1 SQL注入 17
2.1.1 SQL注入的概念 17
2.1.2 SQL注入的危害 17
2.1.3 实例代码 18
2.1.4 如何避免SQL注入 20
2.2 XML外部实体注入 20
2.2.1 XML外部实体注入的概念 20
2.2.2 XML外部实体注入的危害 21
2.2.3 实例代码 21
2.2.4 如何避免XML外部实体注入 24
2.3 命令注入 24
2.3.1 命令注入的概念 24
2.3.2 命令注入的危害 25
2.3.3 实例代码 26
2.3.4 如何避免命令注入 28
2.4 XPath注入 28
2.4.1 XPath注入的概念 28
2.4.2 XPath注入的危害 28
2.4.3 实例代码 29
2.4.4 如何避免XPath注入 32
2.5 LDAP注入 32
2.5.1 LDAP注入的概念 32
2.5.2 LDAP注入的危害 33
2.5.3 实例代码 33
2.5.4 如何避免LDAP注入 37
2.6 JSON注入 37
2.6.1 JSON注入的概念 37
2.6.2 JSON注入的危害 38
2.6.3 实例代码 38
2.6.4 如何避免JSON注入 40
2.7 XQuery注入 40
2.7.1 XQuery注入的概念 40
2.7.2 XQuery注入的危害 40
2.7.3 实例代码 41
2.7.4 如何避免XQuery注入 43
2.8 HTTP响应截断 43
2.8.1 HTTP响应截断的概念 43
2.8.2 HTTP响应截断的危害 44
2.8.3 实例代码 45
2.8.4 如何避免HTTP响应截断 46
2.9 不安全的反序列化(XStream) 46
2.9.1 不安全的反序列化(XStream)的概念 46
2.9.2 不安全的反序列化(XStream)的危害 46
2.9.3 实例代码 47
2.9.4 如何避免不安全的反序列化(XStream) 49
2.10 动态解析代码 49
2.10.1 动态解析代码的概念 49
2.10.2 动态解析代码的危害 49
2.10.3 实例代码 50
2.10.4 如何避免动态解析代码 51
2.11 ContentProvider URI注入 52
2.11.1 ContentProvider URI 注入的概念 52
2.11.2 ContentProvider URI 注入的危害 52
2.11.3 实例代码 52
2.11.4 如何避免ContentProvider URI 注入 54
2.12 反射型XSS 54
2.12.1 反射型XSS的概念 54
2.12.2 反射型XSS的危害 55
2.12.3 实例代码 56
2.12.4 如何避免反射型XSS 57
2.13 存储型XSS 58
2.13.1 存储型XSS的概念 58
2.13.2 存储型XSS的危害 58
2.13.3 实例代码 59
2.13.4 如何避免存储型XSS 61
2.14 弱验证 62
2.14.1 弱验证的概念 62
2.14.2 弱验证的危害 62
2.14.3 实例代码 63
2.14.4 如何避免弱验证 65
2.15 组件间通信XSS 66
2.15.1 组件间通信XSS的概念 66
2.15.2 组件间通信XSS的危害 66
2.15.3 实例代码 67
2.15.4 如何避免组件间通信XSS 68
2.16 进程控制 69
2.16.1 进程控制的概念 69
2.16.2 进程控制的危害 69
2.16.3 实例代码 70
2.16.4 如何避免进程控制 72
2.17 路径遍历 72
2.17.1 路径遍历的概念 72
2.17.2 路径遍历的危害 72
2.17.3 实例代码 73
2.17.4 如何避免路径遍历 75
2.18 重定向 76
2.18.1 重定向的概念 76
2.18.2 重定向的危害 76
2.18.3 实例代码 77
2.18.4 如何避免重定向 79
2.19 日志伪造 79
2.19.1 日志伪造的概念 79
2.19.2 日志伪造的危害 79
2.19.3 实例代码 79
2.19.4 如何避免日志伪造 81
第3章 资源管理类缺陷分析 82
3.1 缓冲区上溢 82
3.1.1 缓冲区上溢的概念 82
3.1.2 缓冲区上溢的危害 82
3.1.3 实例代码 83
3.1.4 如何避免缓冲区上溢 85
3.2 缓冲区下溢 85
3.2.1 缓冲区下溢的概念 85
3.2.2 缓冲区下溢的危害 86
3.2.3 实例代码 86
3.2.4 如何避免缓冲区下溢 88
3.3 越界访问 88
3.3.1 越界访问的概念 88
3.3.2 越界访问的危害 88
3.3.3 实例代码 89
3.3.4 如何避免越界访问 90
3.4 释放后使用 91
3.4.1 释放后使用的概念 91
3.4.2 释放后使用的危害 91
3.4.3 实例代码 92
3.4.4 如何避免释放后使用 93
3.5 二次释放 94
3.5.1 二次释放的概念 94
3.5.2 二次释放的危害 94
3.5.3 实例代码 95
3.5.4 如何避免二次释放 96
3.6 内存泄漏 97
3.6.1 内存泄漏的概念 97
3.6.2 内存泄漏的危害 97
3.6.3 实例代码 98
3.6.4 如何避免内存泄漏 99
3.7 文件资源未释放 99
3.7.1 文件资源未释放的概念 99
3.7.2 文件资源未释放的危害 99
3.7.3 实例代码 100
3.7.4 如何避免文件资源未释放 101
3.8 流资源未释放 101
3.8.1 流资源未释放的概念 101
3.8.2 流资源未释放的危害 102
3.8.3 实例代码 102
3.8.4 如何避免流资源未释放 105
3.9 错误的资源关闭 105
3.9.1 错误的资源关闭的概念 105
3.9.2 错误的资源关闭的危害 106
3.9.3 实例代码 106
3.9.4 如何避免错误的资源关闭 107
3.10 重复加锁 107
3.10.1 重复加锁的概念 107
3.10.2 重复加锁的危害 108
3.10.3 实例代码 108
3.10.4 如何避免重复加锁 109
3.11 错误的内存释放对象 110
3.11.1 错误的内存释放对象的概念 110
3.11.2 错误的内存释放对象的危害 110
3.11.3 实例代码 111
3.11.4 如何避免错误的内存释放对象 112
3.12 错误的内存释放方法 113
3.12.1 错误的内存释放方法的概念 113
3.12.2 错误的内存释放方法的危害 113
3.12.3 实例代码 114
3.12.4 如何避免错误的内存释放方法 115
3.13 返回栈地址 115
3.13.1 返回栈地址的概念 115
3.13.2 返回栈地址的危害 115
3.13.3 实例代码 116
3.13.4 如何避免返回栈地址 117
3.14 被污染的内存分配 117
3.14.1 被污染的内存分配的概念 117
3.14.2 被污染的内存分配的危害 118
3.14.3 实例代码 118
3.14.4 如何避免被污染的内存分配 121
3.15 数据库访问控制 122
3.15.1 数据库访问控制的概念 122
3.15.2 数据库访问控制的危害 122
3.15.3 实例代码 122
3.15.4 如何避免数据库访问控制 124
3.16 硬编码密码 125
3.16.1 硬编码密码的概念 125
3.16.2 硬编码密码的危害 125
3.16.3 实例代码 126
3.16.4 如何避免硬编码密码 128
3.17 不安全的随机数 128
3.17.1 不安全的随机数的概念 128
3.17.2 不安全的随机数的危害 129
3.17.3 实例代码 129
3.17.4 如何避免不安全的随机数 131
3.18 不安全的哈希算法 131
3.18.1 不安全的哈希算法的概念 131
3.18.2 不安全的哈希算法的危害 132
3.18.3 实例代码 132
3.18.4 如何避免不安全的哈希算法 135
3.19 弱加密 135
3.19.1 弱加密的概念 135
3.19.2 弱加密的危害 135
3.19.3 实例代码 136
3.19.4 如何避免弱加密 138
3.20 硬编码加密密钥 139
3.20.1 硬编码加密密钥的概念 139
3.20.2 硬编码加密密钥的危害 139
3.20.3 实例代码 139
3.20.4 如何避免硬编码加密密钥 140
第4章 代码质量类缺陷分析 141
4.1 有符号整数溢出 141
4.1.1 有符号整数溢出的概念 141
4.1.2 有符号整数溢出的危害 141
4.1.3 实例代码 142
4.1.4 如何避免有符号整数溢出 143
4.2 无符号整数回绕 144
4.2.1 无符号整数回绕的概念 144
4.2.2 无符号整数回绕的危害 144
4.2.3 实例代码 145
4.2.4 如何避免无符号整数回绕 146
4.3 空指针解引用 147
4.3.1 空指针解引用的概念 147
4.3.2 空指针解引用的危害 147
4.3.3 实例代码 148
4.3.4 如何避免空指针解引用 149
4.4 解引用未初始化的指针 149
4.4.1 解引用未初始化的指针的概念 149
4.4.2 解引用未初始化的指针的危害 149
4.4.3 实例代码 150
4.4.4 如何避免解引用未初始化的指针 151
4.5 除数为零 151
4.5.1 除数为零的概念 151
4.5.2 除数为零的危害 152
4.5.3 实例代码 152
4.5.4 如何避免除数为零 154
4.6 在scanf()函数中没有对%s格式符进行宽度限制 154
4.6.1 在scanf()函数中没有对%s格式符进行宽度限制的概念 154
4.6.2 在scanf()函数中没有对%s格式符进行宽度限制的危害 154
4.6.3 实例代码 155
4.6.4 如何避免在scanf()函数中没有对%s格式符进行宽度限制 156
4.7 被污染的格式化字符串 157
4.7.1 被污染的格式化字符串的概念 157
4.7.2 被污染的格式化字符串的危害 157
4.7.3 实例代码 158
4.7.4 如何避免被污染的格式化字符串 160
4.8 不当的循环终止 160
4.8.1 不当的循环终止的概念 160
4.8.2 不当的循环终止的危害 160
4.8.3 实例代码 160
4.8.4 如何避免不当的循环终止 162
4.9 双重检查锁定 162
4.9.1 双重检查锁定的概念 162
^ 收 起
第1章 概述 1
1.1 缺陷的基本概念 1
1.2 发现缺陷的方法 2
1.3 自动化缺陷检测技术 4
1.4 缺陷处置流程 5
1.5 缺陷种类划分 6
1.5.1 输入验证类 6
1.5.2 资源管理类 8
1.5.3 代码质量类 10
1.6 代码审计工具使用实例 11
1.6.1 任务配置页面 11
1.6.2 检测结果页面 13
1.7 代码安全保障技术趋势前瞻 14
1.7.1 基于人工智能技术的代码安全分析 14
1.7.2 面向安全的软件代码成分分析 15
1.7.3 面向DevSecOps的代码安全测试 15
1.7.4 交互式应用安全测试 16
第2章 输入验证类缺陷分析 17
2.1 SQL注入 17
2.1.1 SQL注入的概念 17
2.1.2 SQL注入的危害 17
2.1.3 实例代码 18
2.1.4 如何避免SQL注入 20
2.2 XML外部实体注入 20
2.2.1 XML外部实体注入的概念 20
2.2.2 XML外部实体注入的危害 21
2.2.3 实例代码 21
2.2.4 如何避免XML外部实体注入 24
2.3 命令注入 24
2.3.1 命令注入的概念 24
2.3.2 命令注入的危害 25
2.3.3 实例代码 26
2.3.4 如何避免命令注入 28
2.4 XPath注入 28
2.4.1 XPath注入的概念 28
2.4.2 XPath注入的危害 28
2.4.3 实例代码 29
2.4.4 如何避免XPath注入 32
2.5 LDAP注入 32
2.5.1 LDAP注入的概念 32
2.5.2 LDAP注入的危害 33
2.5.3 实例代码 33
2.5.4 如何避免LDAP注入 37
2.6 JSON注入 37
2.6.1 JSON注入的概念 37
2.6.2 JSON注入的危害 38
2.6.3 实例代码 38
2.6.4 如何避免JSON注入 40
2.7 XQuery注入 40
2.7.1 XQuery注入的概念 40
2.7.2 XQuery注入的危害 40
2.7.3 实例代码 41
2.7.4 如何避免XQuery注入 43
2.8 HTTP响应截断 43
2.8.1 HTTP响应截断的概念 43
2.8.2 HTTP响应截断的危害 44
2.8.3 实例代码 45
2.8.4 如何避免HTTP响应截断 46
2.9 不安全的反序列化(XStream) 46
2.9.1 不安全的反序列化(XStream)的概念 46
2.9.2 不安全的反序列化(XStream)的危害 46
2.9.3 实例代码 47
2.9.4 如何避免不安全的反序列化(XStream) 49
2.10 动态解析代码 49
2.10.1 动态解析代码的概念 49
2.10.2 动态解析代码的危害 49
2.10.3 实例代码 50
2.10.4 如何避免动态解析代码 51
2.11 ContentProvider URI注入 52
2.11.1 ContentProvider URI 注入的概念 52
2.11.2 ContentProvider URI 注入的危害 52
2.11.3 实例代码 52
2.11.4 如何避免ContentProvider URI 注入 54
2.12 反射型XSS 54
2.12.1 反射型XSS的概念 54
2.12.2 反射型XSS的危害 55
2.12.3 实例代码 56
2.12.4 如何避免反射型XSS 57
2.13 存储型XSS 58
2.13.1 存储型XSS的概念 58
2.13.2 存储型XSS的危害 58
2.13.3 实例代码 59
2.13.4 如何避免存储型XSS 61
2.14 弱验证 62
2.14.1 弱验证的概念 62
2.14.2 弱验证的危害 62
2.14.3 实例代码 63
2.14.4 如何避免弱验证 65
2.15 组件间通信XSS 66
2.15.1 组件间通信XSS的概念 66
2.15.2 组件间通信XSS的危害 66
2.15.3 实例代码 67
2.15.4 如何避免组件间通信XSS 68
2.16 进程控制 69
2.16.1 进程控制的概念 69
2.16.2 进程控制的危害 69
2.16.3 实例代码 70
2.16.4 如何避免进程控制 72
2.17 路径遍历 72
2.17.1 路径遍历的概念 72
2.17.2 路径遍历的危害 72
2.17.3 实例代码 73
2.17.4 如何避免路径遍历 75
2.18 重定向 76
2.18.1 重定向的概念 76
2.18.2 重定向的危害 76
2.18.3 实例代码 77
2.18.4 如何避免重定向 79
2.19 日志伪造 79
2.19.1 日志伪造的概念 79
2.19.2 日志伪造的危害 79
2.19.3 实例代码 79
2.19.4 如何避免日志伪造 81
第3章 资源管理类缺陷分析 82
3.1 缓冲区上溢 82
3.1.1 缓冲区上溢的概念 82
3.1.2 缓冲区上溢的危害 82
3.1.3 实例代码 83
3.1.4 如何避免缓冲区上溢 85
3.2 缓冲区下溢 85
3.2.1 缓冲区下溢的概念 85
3.2.2 缓冲区下溢的危害 86
3.2.3 实例代码 86
3.2.4 如何避免缓冲区下溢 88
3.3 越界访问 88
3.3.1 越界访问的概念 88
3.3.2 越界访问的危害 88
3.3.3 实例代码 89
3.3.4 如何避免越界访问 90
3.4 释放后使用 91
3.4.1 释放后使用的概念 91
3.4.2 释放后使用的危害 91
3.4.3 实例代码 92
3.4.4 如何避免释放后使用 93
3.5 二次释放 94
3.5.1 二次释放的概念 94
3.5.2 二次释放的危害 94
3.5.3 实例代码 95
3.5.4 如何避免二次释放 96
3.6 内存泄漏 97
3.6.1 内存泄漏的概念 97
3.6.2 内存泄漏的危害 97
3.6.3 实例代码 98
3.6.4 如何避免内存泄漏 99
3.7 文件资源未释放 99
3.7.1 文件资源未释放的概念 99
3.7.2 文件资源未释放的危害 99
3.7.3 实例代码 100
3.7.4 如何避免文件资源未释放 101
3.8 流资源未释放 101
3.8.1 流资源未释放的概念 101
3.8.2 流资源未释放的危害 102
3.8.3 实例代码 102
3.8.4 如何避免流资源未释放 105
3.9 错误的资源关闭 105
3.9.1 错误的资源关闭的概念 105
3.9.2 错误的资源关闭的危害 106
3.9.3 实例代码 106
3.9.4 如何避免错误的资源关闭 107
3.10 重复加锁 107
3.10.1 重复加锁的概念 107
3.10.2 重复加锁的危害 108
3.10.3 实例代码 108
3.10.4 如何避免重复加锁 109
3.11 错误的内存释放对象 110
3.11.1 错误的内存释放对象的概念 110
3.11.2 错误的内存释放对象的危害 110
3.11.3 实例代码 111
3.11.4 如何避免错误的内存释放对象 112
3.12 错误的内存释放方法 113
3.12.1 错误的内存释放方法的概念 113
3.12.2 错误的内存释放方法的危害 113
3.12.3 实例代码 114
3.12.4 如何避免错误的内存释放方法 115
3.13 返回栈地址 115
3.13.1 返回栈地址的概念 115
3.13.2 返回栈地址的危害 115
3.13.3 实例代码 116
3.13.4 如何避免返回栈地址 117
3.14 被污染的内存分配 117
3.14.1 被污染的内存分配的概念 117
3.14.2 被污染的内存分配的危害 118
3.14.3 实例代码 118
3.14.4 如何避免被污染的内存分配 121
3.15 数据库访问控制 122
3.15.1 数据库访问控制的概念 122
3.15.2 数据库访问控制的危害 122
3.15.3 实例代码 122
3.15.4 如何避免数据库访问控制 124
3.16 硬编码密码 125
3.16.1 硬编码密码的概念 125
3.16.2 硬编码密码的危害 125
3.16.3 实例代码 126
3.16.4 如何避免硬编码密码 128
3.17 不安全的随机数 128
3.17.1 不安全的随机数的概念 128
3.17.2 不安全的随机数的危害 129
3.17.3 实例代码 129
3.17.4 如何避免不安全的随机数 131
3.18 不安全的哈希算法 131
3.18.1 不安全的哈希算法的概念 131
3.18.2 不安全的哈希算法的危害 132
3.18.3 实例代码 132
3.18.4 如何避免不安全的哈希算法 135
3.19 弱加密 135
3.19.1 弱加密的概念 135
3.19.2 弱加密的危害 135
3.19.3 实例代码 136
3.19.4 如何避免弱加密 138
3.20 硬编码加密密钥 139
3.20.1 硬编码加密密钥的概念 139
3.20.2 硬编码加密密钥的危害 139
3.20.3 实例代码 139
3.20.4 如何避免硬编码加密密钥 140
第4章 代码质量类缺陷分析 141
4.1 有符号整数溢出 141
4.1.1 有符号整数溢出的概念 141
4.1.2 有符号整数溢出的危害 141
4.1.3 实例代码 142
4.1.4 如何避免有符号整数溢出 143
4.2 无符号整数回绕 144
4.2.1 无符号整数回绕的概念 144
4.2.2 无符号整数回绕的危害 144
4.2.3 实例代码 145
4.2.4 如何避免无符号整数回绕 146
4.3 空指针解引用 147
4.3.1 空指针解引用的概念 147
4.3.2 空指针解引用的危害 147
4.3.3 实例代码 148
4.3.4 如何避免空指针解引用 149
4.4 解引用未初始化的指针 149
4.4.1 解引用未初始化的指针的概念 149
4.4.2 解引用未初始化的指针的危害 149
4.4.3 实例代码 150
4.4.4 如何避免解引用未初始化的指针 151
4.5 除数为零 151
4.5.1 除数为零的概念 151
4.5.2 除数为零的危害 152
4.5.3 实例代码 152
4.5.4 如何避免除数为零 154
4.6 在scanf()函数中没有对%s格式符进行宽度限制 154
4.6.1 在scanf()函数中没有对%s格式符进行宽度限制的概念 154
4.6.2 在scanf()函数中没有对%s格式符进行宽度限制的危害 154
4.6.3 实例代码 155
4.6.4 如何避免在scanf()函数中没有对%s格式符进行宽度限制 156
4.7 被污染的格式化字符串 157
4.7.1 被污染的格式化字符串的概念 157
4.7.2 被污染的格式化字符串的危害 157
4.7.3 实例代码 158
4.7.4 如何避免被污染的格式化字符串 160
4.8 不当的循环终止 160
4.8.1 不当的循环终止的概念 160
4.8.2 不当的循环终止的危害 160
4.8.3 实例代码 160
4.8.4 如何避免不当的循环终止 162
4.9 双重检查锁定 162
4.9.1 双重检查锁定的概念 162
^ 收 起
奇安信代码安全实验室专注于软件源代码安全分析技术和二进制漏洞挖掘技术的研究与开发。基于多年的技术积累,奇安信代码安全实验室在国内率先推出了自主可控的软件代码安全分析系统——奇安信代码卫士和奇安信开源卫士。奇安信代码安全实验室支撑漏洞平台的技术工作,多次向国家信息安全漏洞库(CNNVD)和国家信息安全漏洞共享平台(CNVD)报送原创通用型漏洞信息,并获得表彰。同时,还为微软、谷歌、苹果、华为等大型厂商和机构的软件安全缺陷和漏洞发现提供服务与支撑,并以期为更多用户构建代码安全保障体系,消除软件代码安全隐患。
源代码缺陷是指在软件开发生命周期的编码阶段,产生的有意或者无意的缺陷。为了便于读者更好地了解各种缺陷的基本特性,本书根据缺陷产生的原因、造成的结果以及表现形式等因素,将60种重要且常见缺陷分为3大类:输入验证类、资源管理类和代码质量类。全书分为4章,第1章概述了源代码缺陷的基本概念、发现缺陷的方法、自动化缺陷检测技术、缺陷处置流程、缺陷种类划分、代码审计工具、代码安全保障技术趋势;第2章至第4章通过具体实例依次介绍了各类缺陷的原理、危害、在代码中的表现形式及修复建议。本书适合有一定计算机编码基础和网络安全基础的读者阅读,也适合作为网络安全爱好者的参考书。
比价列表
1人想要
公众号、微信群
缺书网
微信公众号
微信公众号
扫码进群
实时获取购书优惠
实时获取购书优惠