如何设计一个有安全性的应用程序?

时间:2010-12-07 12:56:28

标签: security

我在网上遇到以下短语:

  

软件安全性不是一层   应用程序的顶部,它是   从一开始就纳入您的申请。

但是,您如何设计一个考虑安全性的系统?

4 个答案:

答案 0 :(得分:4)

作为第一件事,也是所有安全考虑的起点,你需要定义一个threat model:你想要发生什么事情,你想要防止发生什么事情,什么是如果他们发生了你不关心的事情?

然后,针对每种威胁,解释您的系统如何防止该威胁。使安全专家的专业知识主要是对系统中通常发生的威胁的直觉。您通过阅读文献了解到这一点 - 它通常与挑战许多系统的威胁相同。

答案 1 :(得分:1)

安全性由许多不同的领域组成,坦率地说是一个巨大的领域。我可以给你一些要点,但你真的需要研究。例如:

  • 将密码存储为(盐渍)哈希
  • 清除所有外部系统的所有输入
  • 保留并查看综合日志
  • 执行软件更新

但就像我说的那样 - 这是一个不断变化的大片区域。你最好的选择就是拿一本关于这个主题的书。

答案 2 :(得分:1)

威胁模型是无稽之谈,安全“专家”建议的任何东西都可能是垃圾。如果代码在特定情况下仅是安全的,则代码不安全。正确的封装与安全性是一致的,这正是E所证明的。

查看具有正交安全性(对象能力模型)的E语言。这是一个很好的概念证明,还有其他类似的语言,例如Joe-E,它是Java的相同范例,Emily for Ocaml,Oz-E for Oz。不幸的是,E是动态类型的,但幸运的是,它比我见过的其他动态类型语言更加智能。即使你最终没有将E用于任何东西,它仍然会教你如何通过声音设计实现安全性。

这实际上是应该如何进行安全的;当我想到一台计算机时,我想到了一个运行算法和软件的设备。从来没有我期望Flash游戏能够危及我的整个系统并窃取我的所有数据。但是几天前我在我的实验室PC上运行了一个完全最新的Windows 7安装程序,并且在一天之后使用完全更新的Firefox / Flash浏览互联网后它受到了损害。这不是计算应该如何工作,您不必担心阅读某段文字会使您的银行帐户被盗。但令人遗憾的事实是,每一个事实上的操作系统都会以这种方式存在根本性的缺陷,并且永远都是,因为它们是用不安全的语言编写的。

无论如何,一些有助于安全的基本方面:

  • 没有全局可变状态,没有理由,
  • 以上各种:不要写入文件系统中的随机硬编码路径,它会导致冲突和更多错误以及漏洞。理想情况下,您应该只获取操作系统传递给您的程序的一些持久存储的句柄,您可以读取/写入,然后就不可能发生冲突,Java的java.util.prefs.Preferences正是这样做
  • 尝试尽可能多地处理强类型数据。远离玩具语言,鼓励解析文本来做所有事情和弱类型的语言,如bash,Perl,PHP,JavaScript,tcl,C / C ++ ,Python *等。每次你是手动转义HTML,转义为bash命令的输入,转移到SQL的输入,你要求麻烦。说到HTML,尽可能避免在网上申请,因为网络不是安全的。
  • 没有评估,这是愚蠢的
  • 封装正确,这在任何正交安全语言中都是至关重要的,你不能创建一个名为getSocket()的函数在你的系统中创建一个文件并将〜/ home / lol重命名为〜/ home / wtf,遵循法律德米特。

基本上,只要遵循良好的做法(在现实世界中不存在很多),你就会安全。声音设计=安全=速度=可用性(但不是愚蠢)。封装是关键,E迫使你做适当的封装。

*禁止使用C / C ++。期。即使是世界上最优秀的数学家也无法编写没有重大漏洞的大规模C / C ++程序。我所知道的最好的情况是~4000K线微内核,最终得到了250K线。我从来没有见过用C ++编写的没有重大漏洞的大型视频游戏。

** Python是强类型的,但它仍然容易出错,因为它鼓励做像猴子修补,继承这样的事情(但是没有办法防止私有成员名称冲突,这一直是一个问题)。范围是虚拟的,因此当您访问任何局部变量时,它会在dict中查找它。它有eval / exec。每个人都只是腌制东西,导致任意代码执行(即,你永远不能使用别人的Python程序数据,因为它可能有一个泡菜,当你从中读取它时会拥有你)。这很慢,可能总是与静态类型的语言进行比较。

答案 3 :(得分:0)

有一些软件开发流程,例如Microsoft的安全开发生命周期(SDL),您可以在开发过程中与您的常规开发方法并行使用。引用是非常正确的,你不能在完成后为应用程序添加安全性,或者当你这样做时,它会比从一开始就这样做更昂贵。安全流程可以帮助您确定风险所在(风险管理)并保护包含最敏感信息的应用程序部分。

然而,对于道德开发者(像我自己)来说,开发安全软件很困难。如果安全对您的老板或客户来说足够有价值:聘请安全工程师。他应该能够帮助你完成整个过程。