2010-12-07 88 views

回答

4

作为所有安全性考虑的第一件事和起点,您需要定义一个threat model:您想要发生什么事情,您希望防止发生什么事情,发生了什么事情你不在乎它是否发生?

然后,对于每个威胁,解释您的系统如何防止该威胁。什么使得安全专家的专业知识主要是对系统中典型威胁发生的直觉。通过阅读文献可以了解到 - 通常是挑战许多系统的相同威胁。

1

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

  • 存储密码为(咸)哈希
  • 净化所有的输入任何外部系统
  • 保持和检查全面的日志
  • 执行软件更新

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

0

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

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

+0

安全并不难,这是一个神话。尽管(*咳嗽*咳嗽那5000万行C/C++操作系统),但现有的系统基本上不安全,很难保证安全。 – 2010-12-07 14:23:17

+0

是的,但这是我们必须作为开发者在正常生活中处理的情况。而这使安全性变得困难。我见过开发人员在保护多层应用程序方面做得非常好,但是一个错误和他们的完整应用程序就变得面临攻击。这就是为什么这很困难,这就是为什么你需要使用安全过程和理解该过程的人。 – Steven 2010-12-11 11:45:40

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,如果可能的话,避免让你的Web应用程序,因为网络不安全。
  • 没有的eval,那是愚蠢的
  • 封装正确,这是任何正交安全语言的重要,你不能让一个叫getSocket()函数,它在你的系统中创建一个文件,重命名〜/家/笑到〜/home/wtf,遵循Demeter法则。

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

* C/C++被禁止。期。即使是世界上最好的数学家也不可能编写大规模的C/C++程序而没有大的漏洞。我所知道的最好的情况是一个~4000K的线程微内核,它以250K的线程结束。我从来没有见过用C++编写的大型视频游戏,没有任何重大漏洞。

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