回答
作为所有安全性考虑的第一件事和起点,您需要定义一个threat model:您想要发生什么事情,您希望防止发生什么事情,发生了什么事情你不在乎它是否发生?
然后,对于每个威胁,解释您的系统如何防止该威胁。什么使得安全专家的专业知识主要是对系统中典型威胁发生的直觉。通过阅读文献可以了解到 - 通常是挑战许多系统的相同威胁。
安全由许多不同的领域组成,坦率地说是一个庞大的领域。我可以给你一些要点,但你真的需要研究。例如:
- 存储密码为(咸)哈希
- 净化所有的输入任何外部系统
- 保持和检查全面的日志
- 执行软件更新
但是就像我说的 - 这是一个不断变化的巨大领域。你最好的选择是拿一本关于这个主题的书。
有一些软件开发过程,例如Microsoft的安全开发生命周期(SDL),您可以在开发过程中与您的常规开发方法并行使用。报价非常正确,完成后无法为应用程序添加安全性,或者当您这样做时,它会比从一开始就这样做更加昂贵。安全流程可以帮助您找出风险的位置(风险管理)并保护包含最敏感信息的应用程序部分。
然而,道德开发人员(比如我自己)开发安全软件很困难。如果安全性对于您的老板或您的客户来说足够有价值:雇用一名安全工程师。他应该能够帮助你完成整个过程。
威胁模型是无稽之谈,任何安全“专家”认为可能是垃圾。如果在特定情况下它只是安全的,则代码不安全。正确的封装与安全是一致的,这正是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程序数据,因为它可能有一个腌菜,当你读它时会拥有你)。它很慢,可能总会和静态类型语言进行比较。
- 1. Web应用程序开发:应用程序设计的安全实践
- 2. .NET Web应用程序的应用程序安全审计?
- 3. MVC应用程序中的安全系统设计
- 4. 安全的Java EE Web应用程序和Seam设计指南
- 5. 设计安全的消费者黑莓应用程序
- 6. Flex:如何设计一个功能齐全的自动化应用程序?
- 7. 设计一个聊天应用程序
- 8. 设计一个iPhone应用程序
- 9. 如何在Meteor应用程序上设置安全的websocket(localhost)
- 10. 安全的应用程序
- 11. 如何为Android应用程序设计一个不错的GUI?
- 12. 如何设计一个超过500页的wpf应用程序
- 13. 如何设计这个安全需求?
- 14. 需要设计一个Android应用程序的架构设计
- 15. 设计线程安全类
- 16. 如何将Android应用程序安全保护至设备?
- 17. 如何为全球应用程序设计后端架构
- 18. 如何设计一个多模块播放应用程序
- 19. WPF如何设计一个多窗口应用程序?
- 20. 如何为android应用程序设计一个遥控器?
- 21. Web应用程序安全
- 22. Web应用程序安全
- 23. iPhone应用程序安全
- 24. 写第一个角度的应用程序。我应该如何设计这个?
- 25. 线程安全应用程序中的线程安全
- 26. 使用ip运行iOS应用程序的Sinatra ruby应用程序的安全性如何安全
- 27. 用basicHttpBinding创建一个安全的应用程序
- 28. 如何设计洪流应用程序?
- 29. 如何设计Java应用程序?
- 30. 设计一个轻量级的会计应用程序
安全并不难,这是一个神话。尽管(*咳嗽*咳嗽那5000万行C/C++操作系统),但现有的系统基本上不安全,很难保证安全。 – 2010-12-07 14:23:17
是的,但这是我们必须作为开发者在正常生活中处理的情况。而这使安全性变得困难。我见过开发人员在保护多层应用程序方面做得非常好,但是一个错误和他们的完整应用程序就变得面临攻击。这就是为什么这很困难,这就是为什么你需要使用安全过程和理解该过程的人。 – Steven 2010-12-11 11:45:40