代码精进之路
范学雷
前 Oracle 首席软件工程师,Java SE 安全组成员,OpenJDK 评审成员
38234 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 48 讲
结束语 (1讲)
代码精进之路
15
15
1.0x
00:00/00:00
登录|注册

40 | 规范,代码长治久安的基础

实现与规范的平衡
规范的清晰简单性
应用接口规范的重要性
少数派的问题
1/n-1分割的解决方案
链式加密的安全漏洞
安全套接字协议(SSL/TLS)
read()函数返回0的问题
信息的完整性检验
read()函数的规范
函数功能是否符合预期
read()函数返回值的使用问题
加上规范描述
其他问题的发现和修改
read()函数的问题
小结
十年的死局
案例分析
评审案例
一起来动手
规范,代码长治久安的基础

该思维导图由 AI 生成,仅供参考

如果从安全角度去考察,软件是非常脆弱的。今天还是安全的代码,明天可能就有人发现漏洞。安全攻击的问题,大部分出自信息的不对称性;而维护代码安全之所以难,大部分是因为安全问题是不可预见的。那么,该怎么保持代码的长治久安呢?

评审案例

有些函数或者接口,可能在我们刚开始写程序的时候,就已经接触,了解,甚至熟知了它们,比如说 C 语言的 read() 函数、Java 语言的 InputStream.read() 方法。我一点都不怀疑,我们熟知这些函数或接口的规范。比如说,C 语言的 read() 函数在什么情况下返回值为 0? InputStream.read() 方法在什么情况下返回值为 -1?
我知道,我们用错 read() 的概率很小。但是今天,我要和你讨论一两个不太常见,且非常有趣,的错误的用法。
让我们一起来看几段节选改编的 C 代码,代码中的 socket 表示网络连接的套接字文件描述符(file descriptor)。 你能够找到这些代码里潜在的问题吗?
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
void clientHello(int socket) {
char buffer[1024];
char* hello = "Hello from client!";
send(socket, hello, strlen(hello), 0);
printf("Hello message sent\n");
int n = read(socket, buffer, 1024);
printf("%s\n", buffer);
}
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
void serverHello(int socket) {
char buffer[1024];
char* hello = "Hello from server!";
int n = read(socket, buffer, 1024);
printf("%s\n", buffer);
send(socket, hello, strlen(hello), 0);
printf("Hello message sent\n");
}
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
void serverHello(int socket) {
char buffer[1024];
char* hello = "Hello from server!";
int n = read(socket, buffer, 1024);
if (n == 0) {
close(socket);
} else {
printf("%s\n", buffer);
send(socket, hello, strlen(hello), 0);
printf("Hello message sent\n");
}
}
现在,我们集中寻找 read() 函数返回值的使用问题。为了方便你分析,我把一个标准的 read() 函数返回值的规范摘抄如下:
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文讨论了传输层安全协议(TLS)早期版本中存在的链式加密安全漏洞,以及针对该漏洞的修复过程。作者通过详细描述了该漏洞的影响和修复方案的提出与实施过程,展现了技术标准制定与实施的复杂性和挑战。文章强调了在实际应用中可能出现的数据传输不完整情况,并指出了对安全漏洞修复方案的实际落地和互操作性问题的重要性。通过对早期TLS版本的安全漏洞修复历程的描述,读者可以了解到技术标准的演进和实践中的挑战,以及在实际开发中需要注意的细节。文章深入浅出地解释了技术标准制定与实施的复杂性,对于开发人员和安全从业者具有一定的参考意义。同时,文章还提出了对于应用接口(API)使用、定义和实现的一些个人看法,为读者提供了对技术标准实践的思考和启发。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《代码精进之路》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(6)

  • 最新
  • 精选
  • hua168
    像我们开发是直接调用框架函数,如果是安全问题,一般是框架自身的问题吧?

    作者回复: 一般不是框架自身的问题。

    2019-04-08
    4
  • 我来也
    我还是只懂c语言。我觉得比较奇怪,buffer的长度是1024,read 1024没问题,但是printf(%s)时,如果最后一个字节不是\0,那输出就会有问题了。

    作者回复: 哈哈,buffer不是字符串,printf打印的是字符串,所以问题就来了。

    2019-04-06
    4
  • 磉盘
    听得热血沸腾。小细节体验出编程的高深。只可惜自己达不到这样的境界,亦不知如何是好。

    作者回复: 养成认真看原版接口规范的好习惯,时间长一点,见识就积累下来了。

    2020-06-26
    1
  • 丁丁历险记
    由衷的感谢ie 退场。让it 文明得以更好的发展。(此处省略5000字的脏话)
    2019-10-16
    4
  • ifelse
    学习了
    2022-08-02归属地:浙江
  • ifelse
    对于接口规范来说,我们应该严格遵从白名单原则,没有明文规定的行为规范,就不是能依赖的行为规范。--记下来
    2022-08-02归属地:浙江
收起评论
显示
设置
留言
6
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部