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

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

一起来动手
小结
整数的陷阱
案例分析
评审案例
整数的运算安全威胁

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

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

评审案例

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/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了整数运算中存在的安全问题,并通过具体案例分析引起了读者的关注。作者通过HTTP范围请求协议的支持和相关代码实现,以及针对Nginx服务器的实际案例分析,向读者展示了整数运算中的安全问题。此外,文章还介绍了一些避免整数溢出的技巧,如比较运算中选择较小的数、限定数的范围选择冗余的空间以及检查数据溢出等方法。同时,还提到了Java 8提供的数据溢出保护方法,如Math.addExact(int, int),以及对大量内存的动态分配需要特别警惕的问题。总体而言,本文为读者提供了解决整数运算安全问题的思路和方法,对于关注计算机安全的读者具有一定的参考价值。

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

全部留言(12)

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

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

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

    作者回复: 👍

    2019-03-20
    5
  • 一周思进
    这个最后证书问题,为什么不可以使用64位无符号数表示呢?

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

    2019-07-07
    2
  • FengX
    老师,这段代码if ((data.length + 1024) > cache.remaining()) ,为什么是+1024?

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

    2019-03-22
    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
    5
  • 我来也
    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
    4
  • 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
    4
  • 我来也
    C语言的代码看得懂,我就回复下.
    2019-03-20
    3
  • Demon.Lee
    kbuf好像还要memset初始化一下吧
    2019-03-21
    1
  • ifelse
    第一个c语言代码,len是负数怎么办?
    2022-07-29归属地:北京
收起评论
显示
设置
留言
12
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部