代码精进之路
范学雷
Oracle首席软件工程师,Java SE安全组成员,OpenJDK评审成员
立即订阅
6316 人已学习
课程目录
已完结 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讲)
结束语|如何成为一个编程好手?
代码精进之路
登录|注册

33 | 整数的运算有哪些安全威胁?

范学雷 2019-03-20
在我的日常工作中,有一类错误,无论是原理还是后果,我都十分清楚。但是写代码的时候,这类错误曾经还是会反复出现。如果不是代码评审和代码分析环节的校正,我都很难意识到自己的代码中存在这样的缺陷。今天,我想和你聊聊,那些“道理我都懂,但代码就是写不好”的老顽固问题。
你不妨先停下来想一想,你有没有类似的经历? 又是怎么解决的呢?

评审案例

HTTP 连接经常被中断或者取消,如果客户端已经获得一部分数据,再次连接时,应该可以请求获取剩余的数据,而不是再次请求获取所有数据。这个特性背后的支持协议就是 HTTP 范围请求协议(RFC 7233)。
比如下面的例子,客户端请求服务器返回 image.jpg 图像的前 1024 个字节。其中“bytes=0-1023”表示请求传输的数据范围是从 0 到第 1023 位的字节(0-1023),以及“-512”表示请求传输数据的最后 512 个字节(-512)。
GET /image.jpg HTTP/1.1
Host: www.example.come
Range: bytes=0-1023,-512
如果服务器支持该协议,就会只传输图像的指定数据段。响应消息的代码大致如下所示:
HTTP/1.1 206 Partial Content
Content-Type: multipart/byteranges; boundary=THIS_STRING_SEPARATES
Content-Length: 2345
--THIS_STRING_SEPARATES
Content-Type: image/jpeg
Content-Range: bytes 0-1023/2048
...
(binary content)
--THIS_STRING_SEPARATES
Content-Type: image/jpeg
Content-Range: bytes 1535-2047/2048
...
(binary content)
--THIS_STRING_SEPARATES--
如果服务器端使用下属的代码验证请求数据的指定数据段(C 语言),你来看看可能存在什么严重的问题?
/**
* Check if the requested range is valid.
*
* start: the first byte position of the range request
* end: the end byte position of the range request
* contentLength: the content length of the requested data
* sum: the sum of bytes of the range request
*/
bool isValid(int start, int end, int contentLength, int* sum )) {
if (start < end) {
*sum += end - start;
if (*sum > contentLength) {
return false;
} else {
return true;
}
} else {
return false;
}
}
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《代码精进之路》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(10)

  • hua168
    第三段代码
    for (int i = 0; i < nums.length; i++) {…}
    把nums设置为i的最大值,这样i++就溢出

    作者回复: 嗯,今天学到新东西了,我以前没有意识到这个溢出问题。

    2019-03-20
    4
  • 我来也
    C语言的代码我看的懂,就回复下.
    需要对参数做合法性校验. buf 不能为NULL. memcopy时的长度不能为负数.
    我们写的函数,需要考虑健壮性.
    需要保证不管别人传什么参数,我们的代码不出问题.
    以下是完善后的代码.
    ---------------------------
    int copy_something(char* buf, int len){
        char kbuf[800];

        if ((NULL == buf) || (len <= 0)) { //len为0时拷贝0字节,没意义.
            return -1;
        }

        if(len > sizeof(kbuf)){
            return -1;
        }

        return memcpy(kbuf, buf, len);
    }

    2019-03-20
    2
  • 空知
    nums数组没说正负,负数 target - nums 可能溢出

    作者回复: 👍

    2019-03-20
    2
  • hua168
    public static int mixed(int addOn, int multiplied, int scale) {
        return addOn + (multiplied * scale);
    }
    1. (multiplied * scale)如果相乘大于默认的int类型最大值会溢出
    2. addOn + (multiplied * scale)相加大于int最大值也会溢出
    2019-03-20
    2
  • 一周思进
    这个最后证书问题,为什么不可以使用64位无符号数表示呢?

    作者回复: 可以使用64位无符号数呀,为什么不可以呢?

    2019-07-07
    1
  • 彩色的沙漠
    @hua168同学
    第三段代码
    for (int i = 0; i < nums.length; i++) {…}
    把nums设置为i的最大值,这样i++就溢出

    实际这段代码把nums设置i的最大值,i++是不会溢出的,因为条件是i<nums.length;如果条件是i<=num.length,那么把nums设置i的最大值,i++是会溢出的。
    2019-05-31
    1
    1
  • Demon.Lee
    kbuf好像还要memset初始化一下吧
    2019-03-21
    1
  • 我来也
    C语言的代码看得懂,我就回复下.
    2019-03-20
    1
  • Feng.X
    老师,这段代码if ((data.length + 1024) > cache.remaining()) ,为什么是+1024?

    作者回复: 1024在这段代码里没有特别的含义。因为data.length的最大值是2^14, 我想用data.length + 1024说明,这样的操作不会产生整数的溢出问题,也就是“限定了数的范围“的安全性。

    2019-03-22
  • wahaha
    gosu支持checked arithmetic
    2019-03-21
收起评论
10
返回
顶部