代码精进之路
范学雷
Oracle首席软件工程师,Java SE安全组成员,OpenJDK评审成员
立即订阅
6350 人已学习
课程目录
已完结 47 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 你写的每一行代码,都是你的名片
免费
第一模块:代码“规范”篇 (16讲)
01 | 从条件运算符说起,反思什么是好代码
02 | 把错误关在笼子里的五道关卡
03 | 优秀程序员的六个关键特质
04 | 代码规范的价值:复盘苹果公司的GoToFail漏洞
05 | 经验总结:如何给你的代码起好名字?
06 | 代码整理的关键逻辑和最佳案例
07 | 写好注释,真的是小菜一碟吗?
08 | 写好声明的“八项纪律”
09 | 怎么用好Java注解?
10 | 异常处理都有哪些陷阱?
11 | 组织好代码段,让人对它“一见钟情”
12丨组织好代码文件,要有“用户思维”
13 | 接口规范,是协作的合约
14 | 怎么写好用户指南?
15 | 编写规范代码的检查清单
16丨代码“规范”篇用户答疑
第二模块:代码“经济”篇 (14讲)
17 | 为什么需要经济的代码?
18丨思考框架:什么样的代码才是高效的代码?
19 | 怎么避免过度设计?
20 | 简单和直观,是永恒的解决方案
21 | 怎么设计一个简单又直观的接口?
22丨高效率,从超越线程同步开始!
23 | 怎么减少内存使用,减轻内存管理负担?
24 | 黑白灰,理解延迟分配的两面性
25 | 使用有序的代码,调动异步的事件
26 | 有哪些招惹麻烦的性能陷阱?
27 | 怎么编写可持续发展的代码?
28 | 怎么尽量“不写”代码?
29 | 编写经济代码的检查清单
30丨“代码经济篇”答疑汇总
第三模块:代码“安全”篇 (14讲)
31 | 为什么安全的代码这么重要?
32 | 如何评估代码的安全缺陷?
33 | 整数的运算有哪些安全威胁?
34 | 数组和集合,可变量的安全陷阱
35 | 怎么处理敏感信息?
36 | 继承有什么安全缺陷?
37 | 边界,信任的分水岭
38 | 对象序列化的危害有多大?
39 | 怎么控制好代码的权力?
40 | 规范,代码长治久安的基础
41 | 预案,代码的主动风险管理
42 | 纵深,代码安全的深度防御
43 | 编写安全代码的最佳实践清单
44 | “代码安全篇”答疑汇总
加餐 (1讲)
Q&A加餐丨关于代码质量,你关心的那些事儿
结束语 (1讲)
结束语|如何成为一个编程好手?
代码精进之路
登录|注册

37 | 边界,信任的分水岭

范学雷 2019-03-29
边界是信息安全里一个重要的概念。如果不能清晰地界定信任的边界,并且有效地守护好这个边界,那么编写安全的代码几乎就是一项不可能完成的任务。

评审案例

计算机之间的通信,尤其是建立在非可靠连接之上的通信,如果我们能够知道对方是否处于活跃状态,会大幅度地提升通信效率。在传输层安全通信的场景下,这种检测对方活跃状态的协议,叫做心跳协议。
心跳协议的基本原理,就是发起方给对方发送一段检测数据,如果对方能原封不动地把检测数据都送回,就证明对方处于活跃状态。
下面的数据结构,定义的就是包含检测数据的通信消息。
struct {
HeartbeatMessageType type;
uint16 payload_length;
opaque payload[HeartbeatMessage.payload_length];
opaque padding[padding_length];
} HeartbeatMessage;
其中,type 是一个字节,表明心跳检测的类型;payload_length 使用两个字节,定义的是检测数据的长度;payload 的字节数由 payload_length 确定,它携带的是检测数据;padding 是随机的填充数据,最少 16 个字节。
如果愿意回应心跳请求,接收方就拷贝检测数据(payload_length 和 payload),并把它封装在同样的数据结构里。
下面的这段代码(函数 process_heartbeat,为便于阅读,在源代码基础上有修改),就是接收方处理心跳请求的 C 语言代码。你能看出其中的问题吗?
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《代码精进之路》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(6)

  • 彩色的沙漠
    malloc 开辟的空间可能包含释放了内存空间但是没有清除里面数据,所以里面的敏感信息有泄露的风险。释放内存空间的同时清空内存数据也是一个好习惯,避免很多不必要的麻烦

    作者回复: 是的,一个完整的方案要做到两个方面:清空敏感数据以及防范内存泄漏。

    2019-06-04
    2
  • DasonCheng
    作为开发人员,有哪些途径即时获取各种漏洞信息以便修补漏洞,避免损失呢?

    作者回复: 主要有:订阅相关的安全威胁情报,查看依赖软件的安全修复发布版,跟踪NIST提供的安全漏洞数据库。

    2019-06-13
    1
  • 天佑
    老师,文件IO怎么也算外部数据呢?

    作者回复: 文件修改不在代码可以控制的范围里呀。

    2019-04-14
    1
  • 空知
    之前的整数溢出也算是边界问题的一种吧

    作者回复: 是的。

    2019-04-01
    1
  • 天佑
    我看防御式编程会在边界处,专门构建一些类进行外部输入过滤,穿越进边界内不,可以完全信任,这在实际场景当中可操作性更强些吧,避免个人开发的遗漏。
    另外,我看到有些例子对外部输入有标准化归一化处理,比如String normalized = Normalizer.normalize(xxx, Normalizer.Form.NFKC);道理也很好理解,觉得这样做会更好些,但是我咨询了开发,他们并不会经常用到,这是为什么,还是有特定场景才会使用?还有nfkc这玩意儿我一直没参透明白,希望老师解惑,谢谢。

    作者回复: 专门有一个过滤层,这种办法也能有作用,但是局限性很大。个例还可以,不是一个普遍的解决方案。 因为,在边界处,如果处理了所有的数据,过滤层就和内部的代码没什么重大区别;如果处理不了所有的数据,遗漏的数据还是不可信任。 就像我们文中边界那一部分的数据d一样。另外,加一层做所有的过滤损害效率,增大代码复杂度,破坏代码逻辑。我很少看到这种用法。如果过滤层能想到检查,没有过滤层,常规代码里也能做到。先想到,才能做到;想到了,怎么做就有很多选择了。

    我也不懂NFKC是什么。

    2019-03-29
    1
  • 丁丁历险记
    涨了不少见识
    2019-10-15
收起评论
6
返回
顶部