每个程序员应该知道什么是安全性的?

What should every programmer know about security?

我是一名IT专业的学生,现在我在大学三年级。到目前为止,我们已经研究了很多与计算机相关的学科(编程、算法、计算机体系结构、数学等)。

我非常肯定没有人能学到关于安全的每一件事,但我确信每个程序员或IT学生都应该知道的是"最低"的知识,我的问题是,这是什么最低的知识?

你能推荐一些电子书或课程吗?或者其他什么可以帮助你从这条路开始?


如果希望应用程序安全,请记住以下原则:

  • 不要相信任何意见!
  • 验证所有不可信来源的输入-使用白名单而不是黑名单
  • 从一开始就要做好安全计划-这不是你能在最后得到的东西
  • 保持简单-复杂性增加了安全漏洞的可能性
  • 尽量减少攻击面
  • 确保你安全失败
  • 纵深防御
  • 坚持最小特权原则
  • 使用威胁建模
  • 划分-所以你的系统不是全部或全部
  • 隐藏秘密是很困难的,而隐藏在代码中的秘密不会长时间保持秘密。
  • 不要编写自己的密码
  • 使用加密并不意味着你是安全的(攻击者会寻找较弱的链接)
  • 注意缓冲区溢出以及如何防止溢出

网上有一些关于确保应用程序安全的优秀书籍和文章:

  • 编写安全代码第二版-我认为每个程序员都应该阅读这个
  • 构建安全软件:如何正确避免安全问题
  • 安全编程食谱
  • 代码攻防之道
  • 安全工程-优秀读物
  • Linux和Unix的安全编程Howto

培训开发人员应用程序安全最佳实践

代码抨击(付费)

安全创新(付费)

安全罗盘(付费)

OWASP WebGoat(免费)


程序员安全规则1:不要自己动手

除非您自己是安全专家和/或密码学家,否则请始终使用设计良好、测试良好且成熟的安全平台、框架或库来为您完成工作。这些东西已经花了数年时间被专家和黑客考虑、修补、更新和检查。你想要获得这些优势,而不是通过尝试重新发明轮子来抛弃它们。

现在,这并不是说你不需要学习任何关于安全的知识。你当然需要足够的知识来理解你在做什么,并确保你正确地使用这些工具。但是,如果您发现自己即将开始编写自己的密码算法、身份验证系统、输入消毒剂等,请停止,后退一步,记住规则1。


每个程序员都应该知道如何编写漏洞代码。

在不知道系统如何被利用的情况下,您意外地阻止了漏洞。知道如何修补代码是毫无意义的,除非你知道如何测试你的修补程序。安全性不仅仅是一堆思想实验,你必须是科学的,并测试你的实验。


安全是一个过程,而不是一个产品。

许多人似乎忘记了这个显而易见的事实。


我建议检查一下CWE/SANS前25个最危险的编程错误。它于2010年更新,并承诺在未来定期更新。2009年的修订版也可以使用。

来自http://cwe.mitre.org/top25/index.html

The 2010 CWE/SANS Top 25 Most Dangerous Programming Errors is a list of the most widespread and critical programming errors that can lead to serious software vulnerabilities. They are often easy to find, and easy to exploit. They are dangerous because they will frequently allow attackers to completely take over the software, steal data, or prevent the software from working at all.

The Top 25 list is a tool for education and awareness to help programmers to prevent the kinds of vulnerabilities that plague the software industry, by identifying and avoiding all-too-common mistakes that occur before software is even shipped. Software customers can use the same list to help them to ask for more secure software. Researchers in software security can use the Top 25 to focus on a narrow but important subset of all known security weaknesses. Finally, software managers and CIOs can use the Top 25 list as a measuring stick of progress in their efforts to secure their software.


一个好的入门课程可能是麻省理工学院计算机网络与安全课程。我建议你不要忘记隐私。从某种意义上说,隐私是安全的基础,在安全技术课程中并不经常涉及。在这门与互联网相关的伦理学和法律课程中,你可能会发现一些关于隐私的材料。


Mozilla的Web安全团队制定了一个伟大的指南,我们在网站和服务的开发过程中遵守这些指南。


框架和API中安全默认的重要性:

  • 许多早期的Web框架在模板中默认情况下并没有转义HTML,因此存在XSS问题。
  • 许多早期的Web框架使得连接SQL比创建参数化查询更容易,从而导致许多SQL注入错误。
  • 有些版本的erlang(R13b,可能还有其他版本)默认情况下不验证SSL对等证书,并且可能有许多erlang代码容易受到SSL MITM攻击。
  • 默认情况下,Java的XSLT转换器允许执行任意Java代码。由此产生了许多严重的安全漏洞。
  • 默认情况下,Java的XML解析API允许解析的文档读取文件系统上的任意文件。更有趣:)

你应该知道三个A。认证,授权,审计。典型的错误是对用户进行身份验证,而不是检查用户是否有权执行某些操作,因此用户可能会查看其他用户的私人照片,这是散居者所犯的错误。许多,更多的人忘记了审计,你需要在一个安全的系统中,能够告诉谁做了什么,什么时候做了。


我将添加以下内容:

  • 数字签名和数字证书的工作原理
  • 什么是沙盒

了解不同的攻击向量如何工作:

  • 本机代码上的缓冲区溢出/下溢/等
  • 社会工程
  • DNS欺骗
  • 中间人
  • CSRF/XSS等
  • SQL注入
  • 加密攻击(例如:利用弱加密算法,如des)
  • 程序/框架错误(例如:Github的最新安全缺陷)

你可以很容易地用谷歌搜索所有这些。这会给你打下良好的基础。如果你想看到web应用的漏洞,有一个叫做google grueyere的项目可以告诉你如何利用一个有效的web应用。


当你在构建任何企业或你自己的软件时,你应该像黑客一样思考。正如我们所知,黑客也不是所有事情的专家,但是当他们发现任何漏洞时,就开始通过收集所有事情的信息来挖掘,最后攻击我们的软件。因此,为了防止此类攻击,我们应该遵循以下原则:一些众所周知的规则,比如:

  • 始终尝试破解您的代码(使用作弊表和谷歌搜索内容以获取更多信息)。
  • 更新您的编程领域中的安全缺陷。
  • 如上所述,绝不信任任何类型的用户或自动输入。
  • 使用OpenSource应用程序(它们最安全的缺陷是已知的和解决的)。

您可以在以下链接中找到更多安全资源:

  • OWASP安全
  • 证书安全性
  • SAN安全
  • 网络工艺品
  • 安全空间
  • 开放式墙壁
  • PHP秒
  • 黑客新闻(不断更新自己)

有关应用程序供应商安全流的更多信息,请访问谷歌。


  • 记住,你(程序员)必须保护好所有的部分,但是攻击者只需要在你的盔甲中找到一个扭结。
  • 安全性是"未知未知"的一个例子。有时候你不知道可能的安全缺陷是什么(直到后来)。
  • 漏洞和安全漏洞之间的区别取决于攻击者的智能。

  • 为什么很重要。
  • 这都是为了权衡取舍。
  • 密码学在很大程度上分散了人们对安全的注意力。

  • 此外,请务必查看OWASP前10名列表,了解所有主要攻击向量/漏洞的分类。

    这些东西读起来很吸引人。学习像攻击者一样思考将训练您在编写自己的代码时思考什么。


    关于安全性的一般信息,我强烈建议您阅读Bruce Schneier。他有一个网站,他的密码简讯,几本书,并做了很多采访。

    我也会熟悉社会工程学(和凯文·米尼克)。

    对于一本关于安全如何在现实世界中发挥作用的好书(也很有趣),我推荐克里夫·斯托尔的《布谷鸟的蛋》(虽然有点过时)。


    盐和散列你的用户密码。不要将它们以明文形式保存在数据库中。


    只想为网络开发者分享:

    开发人员安全指南https://github.com/fallibleinc/security-guide-for-developers