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

时间:2010-05-08 12:21:03

标签: security

我是一名IT学生,现在大学三年级。到目前为止,我们一直在研究与计算机相关的许多主题(编程,算法,计算机体系结构,数学等)。

我非常确定没有人能够了解有关安全的所有事情,但确信每个程序员或IT学生都应该了解它的“最低限度”知识,而我的问题是这个最低限度的知识是什么?

你能推荐一些电子书或课程,还是有什么可以帮助你从这条道路开始?

17 个答案:

答案 0 :(得分:544)

如果您希望应用程序安全,请记住这些原则:

  • 绝不相信任何意见!
  • 来自所有不受信任来源的
  • Validate input - 使用白名单而不是黑名单
  • 从一开始就计划安全 - 这不是你最后可以坚持的东西
  • 保持简单 - 复杂性增加了安全漏洞的可能性
  • attack surface保持在最低限度
  • 确保fail securely
  • 使用defence in depth
  • 坚持least privilege
  • 的原则
  • 使用threat modelling
  • Compartmentalize - 所以你的系统不是全部或全部
  • 隐藏秘密很难 - 隐藏在代码中的秘密不会长期保密
  • 不要写自己的加密
  • 使用加密并不意味着您是安全的(攻击者会寻找较弱的链接)
  • 了解buffer overflows以及如何防范他们

有一些关于使您的应用程序安全的优秀书籍和文章:

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

Codebashing(付费)

Security Innovation(付费)

Security Compass(付费)

OWASP WebGoat(免费)

答案 1 :(得分:102)

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

除非您自己是安全专家和/或密码学家,否则总是使用经过精心设计,经过良好测试的成熟安全平台,框架或库来为您完成工作。这些事情花了数年时间被专家和黑客一直考虑,修补,更新和检查。你想获得这些优势,而不是通过重新发明轮子来解雇它们。

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

答案 2 :(得分:69)

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

在不知道系统如何被利用的情况下,您会意外地阻止漏洞。除非您知道如何测试补丁,否则了解如何修补代码绝对没有意义。安全不仅仅是一堆思想实验,你必须科学并测试你的实验。

答案 3 :(得分:41)

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

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

答案 4 :(得分:23)

我建议审核CWE/SANS TOP 25 Most Dangerous Programming Errors。它在2010年更新,承诺将来定期更新。 2009修订版也可用。

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

  

2010年CWE / SANS排名前25位最危险的编程错误列出了可能导致严重软件漏洞的最广泛和最关键的编程错误。它们通常很容易找到,并且易于利用。它们很危险,因为它们经常允许攻击者完全接管软件,窃取数据或阻止软件工作。

     

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

答案 5 :(得分:13)

良好的入门课程可能是Computer Networks and Security中的麻省理工学院课程。我建议的一件事是不要忘记隐私。从某种意义上说,隐私确实是安全的基础,而且通常不会涉及安全技术课程。您可以在Ethics and the Law上找到有关隐私的一些材料,因为它与互联网有关。

答案 6 :(得分:10)

Mozilla的网络安全团队组建了一个great guide,我们在开发我们的网站和服务时遵守这一要求。

答案 7 :(得分:8)

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

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

答案 8 :(得分:5)

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

答案 9 :(得分:4)

  • 请记住,您(程序员)必须保护所有部件,但攻击者只需要成功找到盔甲中的一个扭结。
  • 安全是“未知未知”的一个例子。有时你不会知道可能的安全漏洞是什么(直到之后)。
  • 错误和安全漏洞之间的区别取决于攻击者的智能。

答案 10 :(得分:4)

我会添加以下内容:

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

了解不同的攻击媒介的工作原理:

  • 本机代码上的缓冲区溢出/下溢/等
  • 社交工程
  • DNS欺骗
  • Man-in-the middle
  • CSRF / XSS等
  • SQL注入
  • 加密攻击(例如:利用DES等弱加密算法)
  • 程序/框架错误(例如:github的latest安全漏洞)

您可以轻松谷歌所有这一切。这将为您奠定良好的基础。 如果您想查看Web应用程序漏洞,可以使用名为google gruyere的项目向您展示如何利用有效的Web应用程序。

答案 11 :(得分:4)

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

  • 总是试图破坏你的代码(使用cheatsheets& google以获取更多信息)。
  • 针对编程领域的安全漏洞进行更新。
  • 并且如上所述从不信任任何类型的用户或自动输入。
  • 使用开源应用程序(他们的大多数安全漏洞已知并已解决)。

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

了解有关您的应用程序供应商安全流程的更多信息。

答案 12 :(得分:3)

  1. 为什么重要。
  2. 这完全取决于权衡。
  3. 密码学在很大程度上分散了安全性。

答案 13 :(得分:3)

另请务必查看OWASP Top 10 List以查看所有主要攻击媒介/漏洞的分类。

这些内容令人着迷。学习像攻击者一样思考会在你编写自己的代码时训练你思考什么。

答案 14 :(得分:3)

有关安全性的一般信息,我强烈建议您阅读Bruce Schneier。他有一个网站,他的crypto-gram newsletter,几个books,并且做了很多interviews

我也熟悉社会工程(和Kevin Mitnick)。

关于安全如何在现实世界中发挥作用的好书(并且非常有趣),我会推荐Cliff Stoll的优秀(虽然有点过时)'The Cuckoo's Egg'

答案 15 :(得分:2)

加盐并哈希用户的密码。切勿将它们以明文形式保存在数据库中。

答案 16 :(得分:0)

只是想为网络开发者分享这个:

安全引导换开发
https://github.com/FallibleInc/security-guide-for-developers