图片都存在一起,最大的好处就是可以做CDN加速.特别是某些高清图.同理,视频,音频文件也是这样的.
然而今天却并不是要从这个角度去讨论这个话题.
今天的话题,从一个不太可爱的地方谈起:静态潜伏的恶意代码.
在一个看似正常的动态链接库里面,潜伏着一段恶意代码.当知晓这个秘密的神秘来客用一个同样是看似无害的程序加载了这个库之后,只要调用一个不为人知的API,剩下的事情,也就只能由这个神秘人头顶的神明来决定了.(这里就要感叹一下IOS系统的应用分离机制和IO控制机制了,确实,苹果在兼顾软件生态多样性的同时,找到了一种解决安全问题的有效的办法)
同样的道理,在一些有特殊结构的文件里面,是存在着被追加写入甚至在特殊位置注入其他bit级别信息的可能性的.我们习惯把程序和数据分开,这种思路在阳光下并无大碍,甚至利于思考问题,但是在那些阳光照不到的地方,程序与数据,都是硬件里的信号,他们本质上是没有区别的,只是不同的标识特征决定了他们的身份,进而决定了他们的用途.
那么有没有一种可能,让一个程序从不同的,看似无害的数据文件中,取出一些隐藏在其中的数据,然后把他们组装成另外一个程序呢?从技术上来说,是完全可行的.甚至你可以取出一个事先加了密的片段,组装到一起再解密,最终获得一个可执行程序.
对应的防护策略当然也是有的,这就是AV大战的一部分了.
在个人电脑上,这个问题并不难解决,一般的电脑,跑个av软件会卡一点,但是还不至于卡到失去响应.在联网的系统里,也是如此,服务器仅仅是把图片存起来,再传输给各个终端的PC,真正冒险去解码图片的,还是终端的PC机.
于是程序员渐渐达成了共识,专机专用,绝不混杂不同的可执行区域,这里也就是一个简单的运维手段:最小化安装和运行:服务器除了它所运行的应用所必须的组件之外,不要有任何多余的功能.于是这样,一个白名单的管理体系就能被建立起来:除了允许做的事情之外,一切都是禁止的.有时候,为了防止一台服务器上的组件过多,还要拆分整个应用的功能,把他们分散到不同的机器里面去.
这一切,都是为了防止在服务器上出现某个未知的应用程序被执行的情况.因为你不知道,这个程序究竟会干出什么事情来.对于程序来说,绕过静态代码审查的方法实在是太多了.所以,越是那种功能多,讨人喜欢的系统,反而是越危险的系统,因为这种系统永远都只能等到恶意代码运行之后,才能被动的触发防御机制.根本不能从根源上解决问题,只会把问题越搞越复杂.因此,对于服务器来说,不希望被莫名其妙的神秘人控制?那就别把简单的问题复杂化,分工明确,各司其职,专注,专一,高效的处理和高效的合作,这不才是网络存在的意义吗?