【科普】趣味编程之设计无小事

#编程&生活#微米老师2023-03-20

设计是根据功能需求进行编码,最终形成软件产品。设计过程中,无论是简单的小功能,还是复杂的功能,都必须认真对待,否则你编...

设计是根据功能需求进行编码,最终形成软件产品。设计过程中,无论是简单的小功能,还是复杂的功能,都必须认真对待,否则你编的可不是代码,而是给自己和后人挖的坑!

2014年4月7号被曝光的“心脏滴血”漏洞,就是很好的证明。黑客可以利用该漏洞对后台的网站服务器进行攻击,每次最多可以获取服务器中的64KB数据(每KB包含1024个字符),这样持续攻击,就能获取源码、用户http原始请求、用户cookie甚至明文帐号密码等敏感信息。全世界大概有三分之一的网站受影响,包括我们常用的淘宝、京东、网易邮箱,中国银联等。

同学们肯定很好奇,这个漏洞到底是怎么造成的?

说起来其实很简单!

我们用手机或者电脑上网时,首先要和网站后台服务器建立联系,建立联系的过程就是发一串字符过去,然后后台服务器收到以后再把字符返回来,这样一来一回就可以建立连接了。就像走在路上,碰到个熟人,我们会跟对方打招呼,说“hello”,对方也会回 “hello”。

听起来没啥问题,你发啥我回啥,能有啥问题,对吧

接下来我们看具体实现。

具体实现的时候,客户端(我们上网的设备统称客户端)会发两个要素给服务器,一个是长度,一个是实际发送的字符信息;服务器收到后呢,根据长度再把收到的数据发回去。

到这里,同学们有没有发现什么不对的地方?

有同学可能发现了,如果长度和实际发送的字符信息长度不一致怎么办?

比如实际我实际发了hello,5个字符,但是我长度标注1000,这样会发生什么?

服务器除了把我发的5个字符返给我,另外还会多返给我995个字符。

这样循环不停的操作,总能找到一些有用的信息。网站的信息就这样泄漏了!

那这个坑怎么填上呢?

也很简单!服务器判断一下收到的实际字符长度,收到0个不回,收到非0个的,按实际长度回。

这个例子就是前面我们介绍霸哥(bug)的时候提到的“设计缺陷”。如果设计方案不够周全、安全性可靠性考虑不周全,在特定的执行逻辑下就会暴露错误。同学们我们不管是编程还是任何小事,都要多思考,考虑周全,不给自己和别人挖坑留漏洞。

用手机扫码体验更多功能

扫码参与评论与作者和更多用户交互