关于安全性,每个程序员都应该知道些什么?

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

我很确定没有人能学会所有关于安全的知识,但肯定有一个“最低限度”的知识每个程序员或IT学生都应该知道,我的问题是这个最低限度的知识是什么?

你能建议一些电子书或课程或任何可以帮助我们开始这条路的东西吗?

110675 次浏览
  1. 为什么是重要的。
  2. 这都是关于权衡。
  3. 密码学在很大程度上分散了人们对安全性的注意力。

一个好的入门课程可能是麻省理工学院的课程计算机网络与安全。我建议的一件事是不要忘记隐私。从某种意义上说,隐私确实是安全的基础,在有关安全的技术课程中并不经常涉及。你可能会在本课程道德与法律上找到一些关于隐私的材料,因为它与互联网有关。

程序员的安全规则#1:不要自己卷

除非你自己是一个安全专家和/或密码学家,总是使用一个精心设计、经过良好测试和成熟的安全平台、框架或库来为你工作。专家和黑客等人花了数年时间思考、修补、更新和检查这些问题。你想要获得这些优势,而不是试图重新发明轮子而忽视它们。

现在,这并不是说您不需要学习任何关于安全性的知识。当然,您需要了解足够多的知识来理解您在做什么,并确保正确地使用这些工具。然而,如果你发现自己要开始编写自己的加密算法、认证系统、输入杀毒器等,停下来,后退一步,记住规则#1。

如果你想要你的应用程序是安全的,请记住以下原则:

  • 永远不要相信任何输入!
  • 验证输入来自所有不可信的来源-使用白名单而不是黑名单
  • 从一开始就为安全做好计划——这不是你可以在最后才考虑的事情
  • 保持简单——复杂会增加安全漏洞的可能性
  • 攻击表面保持在最小值
  • 确保你不安全
  • 使用纵深防御
  • 坚持最小特权原则
  • 使用威胁建模
  • 划分 -所以你的系统不是全或无
  • 隐藏秘密是很困难的,而隐藏在代码中的秘密不会长久保密
  • 不要自己写密码
  • 使用加密并不意味着你是安全的(攻击者会寻找一个较弱的链接)
  • 要了解缓冲区溢出以及如何防范它们

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

对开发人员进行应用程序安全最佳实践方面的培训

Codebashing(支付)

安全创新(支付)

安全指南针(支付)

OWASP WebGoat(免费)

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

如果不知道系统是如何被利用的,你就会意外地阻止漏洞。除非你知道如何测试你的补丁,否则知道如何打补丁是毫无意义的。安全不仅仅是一堆思想实验,你必须科学地测试你的实验。

我建议复习CWE/SANS TOP 25最危险的编程错误。它在2010年进行了更新,并承诺在未来定期更新。2009版本也是可用的。

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

2010年CWE/SANS最危险的25个编程错误是一个列表,列出了可能导致严重软件漏洞的最广泛和最关键的编程错误。它们通常很容易被发现,也很容易被利用。它们是危险的,因为它们经常允许攻击者完全接管软件,窃取数据,或者根本阻止软件工作。

前25个列表是一个教育和意识的工具,通过识别和避免在软件发布之前发生的非常常见的错误,帮助程序员预防困扰软件行业的各种漏洞。软件客户可以使用相同的列表来帮助他们要求更安全的软件。软件安全研究人员可以使用Top 25来关注所有已知安全弱点中狭窄但重要的子集。最后,软件经理和首席信息官可以使用前25名列表作为衡量他们在软件安全方面所取得进展的标尺。

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

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

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

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

  • 许多早期的web框架都没有在模板中默认转义html,因此存在XSS问题
  • 许多早期的web框架使得连接SQL比创建参数化查询更容易,这导致了大量的SQL注入错误。
  • 某些版本的Erlang (R13B,也可能是其他版本)默认情况下不验证ssl对等证书,可能有很多Erlang代码容易受到ssl MITM攻击
  • 默认情况下,Java的XSLT转换器允许执行任意Java代码。由此产生了许多严重的安全漏洞。
  • 默认情况下,Java的XML解析api允许被解析的文档读取文件系统上的任意文件。更有趣:)
  • 记住,你(程序员)必须确保所有部分的安全,但攻击者只需要成功地找到你盔甲中的一个漏洞。
  • 安全就是“未知的未知”的一个例子。有时你不知道可能的安全漏洞是什么(直到事后)。
  • 漏洞和安全漏洞之间的区别取决于攻击者的智力。

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

也一定要检查OWASP Top 10榜单,以获得所有主要攻击载体/漏洞的分类。

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

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

我愿补充以下几点:

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

了解不同的攻击载体是如何工作的:

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

你可以很容易地谷歌所有这些。这会给你一个很好的基础。 如果你想查看web应用程序的漏洞,有一个名为谷歌的格鲁耶尔的项目,它向你展示了如何利用一个正常工作的web应用程序

关于安全的一般信息,我强烈建议阅读Bruce Schneier。他有一个网站,他的crypto-gram通讯,几个,并做了很多面试

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

对于一本关于安全如何在现实世界中发挥作用的好(而且相当有趣)的书,我推荐Cliff Stoll的优秀(尽管有点过时)《布谷鸟蛋》

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

  • 总是试着打破你的密码(使用小抄& & quot;谷歌的东西,以获取更多信息)。
  • 更新编程域中的安全漏洞。
  • 如上所述,永远不要相信任何类型的用户或自动输入。
  • 使用开源应用程序(它们的大多数安全缺陷已经被知道并解决了)。

你可在以下连结找到更多保安资源:

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

只是想把这个分享给网页开发者:

security-guide-for-developers < br > https://github.com/FallibleInc/security-guide-for-developers