33 | 整数的运算有哪些安全威胁?
范学雷
该思维导图由 AI 生成,仅供参考
在我的日常工作中,有一类错误,无论是原理还是后果,我都十分清楚。但是写代码的时候,这类错误曾经还是会反复出现。如果不是代码评审和代码分析环节的校正,我都很难意识到自己的代码中存在这样的缺陷。今天,我想和你聊聊,那些“道理我都懂,但代码就是写不好”的老顽固问题。
你不妨先停下来想一想,你有没有类似的经历? 又是怎么解决的呢?
评审案例
HTTP 连接经常被中断或者取消,如果客户端已经获得一部分数据,再次连接时,应该可以请求获取剩余的数据,而不是再次请求获取所有数据。这个特性背后的支持协议就是 HTTP 范围请求协议(RFC 7233)。
比如下面的例子,客户端请求服务器返回 image.jpg 图像的前 1024 个字节。其中“bytes=0-1023”表示请求传输的数据范围是从 0 到第 1023 位的字节(0-1023),以及“-512”表示请求传输数据的最后 512 个字节(-512)。
如果服务器支持该协议,就会只传输图像的指定数据段。响应消息的代码大致如下所示:
如果服务器端使用下属的代码验证请求数据的指定数据段(C 语言),你来看看可能存在什么严重的问题?
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
本文深入探讨了整数运算中存在的安全问题,并通过具体案例分析引起了读者的关注。作者通过HTTP范围请求协议的支持和相关代码实现,以及针对Nginx服务器的实际案例分析,向读者展示了整数运算中的安全问题。此外,文章还介绍了一些避免整数溢出的技巧,如比较运算中选择较小的数、限定数的范围选择冗余的空间以及检查数据溢出等方法。同时,还提到了Java 8提供的数据溢出保护方法,如Math.addExact(int, int),以及对大量内存的动态分配需要特别警惕的问题。总体而言,本文为读者提供了解决整数运算安全问题的思路和方法,对于关注计算机安全的读者具有一定的参考价值。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《代码精进之路》,新⼈⾸单¥59
《代码精进之路》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(12)
- 最新
- 精选
- hua168第三段代码 for (int i = 0; i < nums.length; i++) {…} 把nums设置为i的最大值,这样i++就溢出
作者回复: 嗯,今天学到新东西了,我以前没有意识到这个溢出问题。
2019-03-2010 - 空知nums数组没说正负,负数 target - nums 可能溢出
作者回复: 👍
2019-03-205 - 一周思进这个最后证书问题,为什么不可以使用64位无符号数表示呢?
作者回复: 可以使用64位无符号数呀,为什么不可以呢?
2019-07-072 - FengX老师,这段代码if ((data.length + 1024) > cache.remaining()) ,为什么是+1024?
作者回复: 1024在这段代码里没有特别的含义。因为data.length的最大值是2^14, 我想用data.length + 1024说明,这样的操作不会产生整数的溢出问题,也就是“限定了数的范围“的安全性。
2019-03-221 - 彩色的沙漠@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-3115
- 我来也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-204
- hua168public static int mixed(int addOn, int multiplied, int scale) { return addOn + (multiplied * scale); } 1. (multiplied * scale)如果相乘大于默认的int类型最大值会溢出 2. addOn + (multiplied * scale)相加大于int最大值也会溢出2019-03-204
- 我来也C语言的代码看得懂,我就回复下.2019-03-203
- Demon.Leekbuf好像还要memset初始化一下吧2019-03-211
- ifelse第一个c语言代码,len是负数怎么办?2022-07-29归属地:北京
收起评论