论文部分内容阅读
从我成立IT咨询公司以来的十年时间,我和全球成千上万的软件开发员打过交道,也见过各种不同的安全故障。经常会有人问我:什么是最糟糕的软件安全错误?
当然,我不会像“OWASP Top 10”(OWASP:开放式web应用程序安全项目)那样做一个具体的列表来告诉你答案,因为在我看来,安全问题的发生最主要来源于两大方面:一是软件开发人员过于专注软件的功能规格,另一个则是过于信任软件的安全系数。
我遇见过的软件开发人员大多数都很聪明、很上进,而他们总是在压力极大的环境下工作,总是在看似不可能完工的最后期限内将产品做出来。在这样的情况下,开发人员往往只关注产品的功能,而对其他方面,比如安全,则欠缺考虑。因为“客户需要什么样的功能”的问题显然比“哪里可能出岔子”或“攻击者如何诱骗软件出现异常行为”来得更为迫切。
另一方面,开发人员普遍低估了软件隐藏的安全威胁。因为开发人员往往过于信任用户及用户在代码中所使用的应用编程接口(API)。
一旦开发人员一味注重开发功能,而不事先做足准备来防止潜在攻击,那么软件经常出现故障,也是理所当然的事了。
当然,功能的开发也相当重要,但是防止代码出现异常的准备是必不可少的。然而,做好这点并非易事。
两件事情或许对于做好这点有所帮助。首先,积极主动地通过应用软件对数据进行编排处理。前期要严格验证数据的输入,后期则要确保数据的输出不会给预期环境造成任何破坏。第二,预测异常情况,并采取合理的处理措施。只要有可能,就要积极验证所有输入的数据。比如,如果你要求的数据是整数,那么不是整数的任何数字都将是危险的,这被称为积极验证;有别于消极验证,消极验证是指通过寻找已知的危险的输入内容,并阻止那些内容输入。但我建议最好避免采用消极验证,因为我已看到过无数个消极验证失败的例子。
接下来,在输出数据时,你需要编排处理该数据,防止数据在你输出时的任何地方引起问题。比如,要是输出上下文是XML格式化的,那么你的用户数据绝对不能含有“<”或“>”之类的元素。倘若没有做到这一点,每次输入都会受到攻击。
对于专业人员来说,软件就好比是小孩,安全人员则是第一看护人,他们会注意到潜伏的危险,并习惯于最先考虑哪些方面会出岔子;开发人员则更像第二看护人,他们尽量不在交通高峰期带孩子出去散步,尽量避免出岔子。安全人员和开发人员如果能卓有成效地协同工作,大家就能够从中受益。
最近,我与一群软件开发人员进行合作,他们接受了我的这些建议,并且很快便心领神会。事后,我的客户告诉我,在这个项目完工后的一天内,他数次接到了开发人员和安全团队提出的请求,要求探讨两个部门如何能够更好地协同工作。(编译沈建苗)
当然,我不会像“OWASP Top 10”(OWASP:开放式web应用程序安全项目)那样做一个具体的列表来告诉你答案,因为在我看来,安全问题的发生最主要来源于两大方面:一是软件开发人员过于专注软件的功能规格,另一个则是过于信任软件的安全系数。
我遇见过的软件开发人员大多数都很聪明、很上进,而他们总是在压力极大的环境下工作,总是在看似不可能完工的最后期限内将产品做出来。在这样的情况下,开发人员往往只关注产品的功能,而对其他方面,比如安全,则欠缺考虑。因为“客户需要什么样的功能”的问题显然比“哪里可能出岔子”或“攻击者如何诱骗软件出现异常行为”来得更为迫切。
另一方面,开发人员普遍低估了软件隐藏的安全威胁。因为开发人员往往过于信任用户及用户在代码中所使用的应用编程接口(API)。
一旦开发人员一味注重开发功能,而不事先做足准备来防止潜在攻击,那么软件经常出现故障,也是理所当然的事了。
当然,功能的开发也相当重要,但是防止代码出现异常的准备是必不可少的。然而,做好这点并非易事。
两件事情或许对于做好这点有所帮助。首先,积极主动地通过应用软件对数据进行编排处理。前期要严格验证数据的输入,后期则要确保数据的输出不会给预期环境造成任何破坏。第二,预测异常情况,并采取合理的处理措施。只要有可能,就要积极验证所有输入的数据。比如,如果你要求的数据是整数,那么不是整数的任何数字都将是危险的,这被称为积极验证;有别于消极验证,消极验证是指通过寻找已知的危险的输入内容,并阻止那些内容输入。但我建议最好避免采用消极验证,因为我已看到过无数个消极验证失败的例子。
接下来,在输出数据时,你需要编排处理该数据,防止数据在你输出时的任何地方引起问题。比如,要是输出上下文是XML格式化的,那么你的用户数据绝对不能含有“<”或“>”之类的元素。倘若没有做到这一点,每次输入都会受到攻击。
对于专业人员来说,软件就好比是小孩,安全人员则是第一看护人,他们会注意到潜伏的危险,并习惯于最先考虑哪些方面会出岔子;开发人员则更像第二看护人,他们尽量不在交通高峰期带孩子出去散步,尽量避免出岔子。安全人员和开发人员如果能卓有成效地协同工作,大家就能够从中受益。
最近,我与一群软件开发人员进行合作,他们接受了我的这些建议,并且很快便心领神会。事后,我的客户告诉我,在这个项目完工后的一天内,他数次接到了开发人员和安全团队提出的请求,要求探讨两个部门如何能够更好地协同工作。(编译沈建苗)