现在的位置: 首页 > 编程语言 > 正文

C语言网络编程和跨平台代码安全性

2019年09月21日 编程语言 ⁄ 共 1012字 ⁄ 字号 评论关闭

C语言语法简洁,但内涵丰富。对一个聪明的人来说,可能几个小时就能学会使用C语言,但可能一辈也很难成为大师。C语言处处隐藏陷阱,没有阅读过大量优秀代码,没有思考过大师专家级代码的特别之处,没有写了过大量应用程序,写的程序中往往容易不经意间隐藏地雷。一旦爆发,系统被炸的面目全非。

兹摘抄一个知名公司系统中的代码研究

1.  移位陷阱

公司的大牛在写一个base64编解码程序时,使用了如下方法:

staticvoid encodeblock( unsigned char *in, unsigned char *out, int len )

{

out[0] = (unsigned char) cb64[ (int)(in[0]>> 2) ];

out[1] = (unsigned char) cb64[ (int)(((in[0]& 0x03) << 4) | ((in[1] & 0xf0) >> 4)) ];

out[2] = (unsigned char) (len > 1 ? cb64[(int)(((in[1] & 0x0f) << 2) | ((in[2] & 0xc0) >> 6)) ] :'=');

out[3] = (unsigned char) (len > 2 ? cb64[(int)(in[2] & 0x3f) ] : '=');

}

这在本系统中不错,但却隐藏着很大的风险,系统是做为基础的加密工具给公司各种各样的嵌入式设备使用,这里隐藏着一个数组越界的地雷。(int)(in[0] >> 2)如果不&0x3f,在不同编绎器环境下,右移位后,左边空拉有些是填充零,有些时填充1,有些是填充最高符号位,这样就会导致不同系统的加密出现数据一不致性,有时会溢出。

2. 对齐陷阱

Sizeof是在C语言里经常使用的方法,有人把归为运算符,其他他计算结构体变量的指针偏移相当方便,有很多书推荐,因为他计算基础类型变量时能根据系统和编绎器不同自动计算调整,具有很强的自适应性和跨平台能力,但这种自适合性在单机程序中是很牛X,不过有不同系统交互时,会存在数据不一致。不同系统或者编程语言会把同样结构转为不同的byte流,这种情况下,数据传输交互就会失去一致性。而且我们的系统使用C语言,java作为客户端,而java是没有结构体的,只能把对象的成员根据系统大小自拼接,c语言老手建议我在java端对C系统做适配,在java端做一个类似C结构对齐的操作,这是一个很复杂的工程,C语言端是二字节对齐还是四字节对齐不要猜测,要针对不同的C设备做适配又是不一件不可能的事。

抱歉!评论已关闭.