侃侃软件开发人员必懂的安全软件开发五个原则
很多培养软件开发人员的机构(包括大学)并不培训如何安全地软件开发,而只是强调软件开发的效率和软件功能的实现。其实,软件的稳定性与安全在很大程度上决定了该软件的生命力和影响力,也影响着软件开发人员的信誉。它取决于代码编写者的素质。解决软件安全问题的最佳策略就在于程序分析、软件开发、测试阶段对安全性的考虑。因而,如何让代码更安全成为一个关键问题。今天笔者讨论程序设计人员容易忽视的五个安全软件开发原则。
一、减少攻击面
大而全的程序往往隐藏着巨大的风险。记住,在应用程序中每增加一个功能都会对整个应用程序增加一定数量的风险。安全软件开发的目标是什么?是通过减少攻击面来减少整体的风险。
例如,假设某个Web应用程序通过搜索功能来实现在线求助,这个搜索功能就有可能遭受SQL注入攻击。如果这个帮助功能仅限于授权用户,那么该程序遭受攻击的可能性就会大大地降低。但是,如果对这个帮助功能进行重新软件开发,清除其搜索功能,就几乎会消除了攻击面。
二、不要轻信第三方
许多软件公司使用第三方的处理功能,而后者更有可能采用不同的安全策略。而本软件公司又不太可能影响任何外部的第三方,不管它是家庭用户或是重要供应商或合伙人。
所以,盲目信任软件公司外部运行的系统是没有什么道理的。应当以相同的方式来对待所有外部的系统。
例如,一家忠诚的软件供应商要向贵软件公司提供网上银行所使用的数据,提供了奖励积分的数量等数据。贵软件公司的应用软件应当检查这些数据,确保在显示给终端用户时该数据的安全性,而且奖励的积分应当是一个正数,等等。这些都是软件开发人员需要重视的问题。
三、不要通过隐藏来实现安全
通过隐藏来实现安全是一种很弱的安全控制。如果将隐藏作为唯一的控制方式,它迟早都会失效。这并不是说保守秘密不是一个好办法,而只是意味着关键系统的安全性不能仅依赖于隐藏细节。
例如,应用程序的安全性不能依靠保证源代码的秘密,使其不为人知。安全性依赖于许多因素,其中包括合理的口令策略、深度防御、商业交易限制、强健的网络架构、欺诈和审计控制等。
比方说Linux,其源代码是完全公开的,然而只要在部署阶段采取了正确的安全措施,Linux就是强健、安全的操作系统。
四、正确纠正安全问题
如果确认了一个安全问题,非常重要的一点就是理解引起此问题的根本原因,并制定一个测试计划。在使用固有的设计模式时,非常可能的是,安全问题在所有的代码库中都广泛存在,所以在不引起新问题的前提下,如何软件开发和测试适当的修复代码至关重要。
比如,某用户发现,通过调整自己电脑的cookie就能够看到另外一个用户的账户余额。在软件开发人员修复过程中,补救代码看起来可能相对简单,但由于这段cookie处理代码要在所有应用程序中共享,“一石激起千层浪”,仅对一个应用程序的修改就会影响到所有其它的应用程序。因而,必须对这段修复代码所影响到的所有应用程序进行测试。
五、“死得光荣”—安全地发生故障
这里的意思是,由于多种原因引起应用程序无法正常地处理业务时,应用程序发生故障的方式会影响或决定应用程序是否安全。
例如,如果管理员在登录或使用应用程序的过程中,代码失效或发生意外,此程序所带来的安全风险可想而知。
所以软件开发人员必须重视在应用程序发生故障时的安全影响。