专栏作者:宝玉
专栏发布平台:极客时间
今天,我将带你了解一下软件开发中的安全问题,学习如何构建安全的软件,以及出现了安全问题之后该怎么办。
安全问题,本质上也是一种技术风险,没发生问题的时候一切都好,一旦发生就会有严重的影响。
软件中的安全问题来源主要可以分为以下三大类。
第一类:恶意输入
SQL 注入、XSS 攻击等
这类问题都是由于恶意输入导致的,应对恶意输入的问题,最简单有效的方式就是对用户输入的数据,做严格的校验,格式化。
第二类:假冒身份
很多程序对于用户身份的校验比较弱,可能会导致黑客假冒用户身份做出超越权限的事情。
如果对用户的身份不做严格的验证,很可能就会导致假冒身份的安全问题。应对策略就是要对用户的身份做验证,尤其是涉及敏感权限的操作,甚至要做两重验证。
第三类:数据泄露
很多软件都储存了用户的敏感信息,比如用户帐号密码信用卡记录,或者服务器的敏感信息,比如数据库连接字符串、登录帐号密码,而这些数据是有被泄露风险的。
预防软件中的安全问题,也可以参考对风险管理的策略。在风险管理中,对风险识别和量化后,接下来就是要制定应对计划了。
那么在软件开发的各个阶段,都需要如何考虑好安全方面的问题呢?
需求阶段
需求是软件项目的源头,在确定需求,做产品设计的时候,不仅要考虑到功能上的需求,还要同时考虑到安全方面的要求。这样当你在架构设计的时候,就不会轻易遗漏安全方面的架构设计。
当你在需求阶段就提出了安全性的需求,设计、实现和测试时自然不会遗漏掉安全方面的内容,从源头上就让大家有了安全方面的意识。
设计阶段
在做设计架构时,最重要的事就是要把安全加入到设计目标,有了安全方面的设计目标,自然能找到很多安全相关的解决方案。
现在架构设计领域,也有了一些业界公认的好的安全相关的设计原则,比如说攻击面最小化、权限最小化、纵深防御等。
开发阶段
只是设计阶段做好安全相关的设计还不好,很多安全问题其实都是编码阶段时,没有好的编码习惯、没有良好的安全意识导致的。
对于开发阶段的安全问题预防,需要从以下几个方面入手。
测试阶段
在测试阶段,除了功能测试以外,增加对安全性方面的测试。
上线维护
上线部署时,不部署源代码,只对编译后程序部署;删除 Debug 文件。
安全问题就像程序的 Bug 一样,没有谁能保证绝对的安全,就像风险管理的最后一步风险监控那样,我们必须做好 Plan B,万一出现安全问题,马上应对,将损失降到最低。
软件的安全问题本质也是一种技术风险,可以借用风险管理的知识来帮助构建高安全性的软件。
安全问题就像程序的 Bug 一样,不能绝对避免,同时也要做好应对措施,在出现安全问题后,将损失降到最低,并且避免以后发生类似问题。课后思考