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

Moh*_*oud 423 security

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

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

您能否建议一些电子书或课程或任何可以帮助您从这条道路开始?

big*_*num 548

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

  • 绝不相信任何输入!
  • 验证 来自所有不受信任来源的输入 - 使用白名单而不是黑名单
  • 从一开始就计划安全 - 这不是你最后可以坚持的东西
  • 保持简单 - 复杂性增加了安全漏洞的可能性
  • 攻击面保持在最低限度
  • 确保你安全失败
  • 深入使用防御
  • 坚持最小特权原则
  • 使用威胁建模
  • 隔离 - 所以你的系统不是全部或全部
  • 隐藏秘密很难 - 隐藏在代码中的秘密不会长期保密
  • 不要写自己的加密
  • 使用加密并不意味着你是安全的(攻击者会寻找一个较弱的链接)
  • 请注意缓冲区溢出以及如何防止它们

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

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

Codebashing(付费)

安全创新(付费)

安全指南针(付费)

OWASP WebGoat(免费)

  • 替换"永远不要相信用户输入!" "绝不相信任何意见!" 来自其他软件的输入应该与用户输入相同 - 例如,在网站记录中,大多数人不会将用户代理/浏览器ID字段视为"用户输入",但它可以很容易地包含,例如, SQL注入. (34认同)
  • 然而,遗憾的是,在任何现代系统中实例化最小特权原则几乎是不可能的.例如,Linux内核(我目前使用的源代码)包含超过940万行C代码和超过400K的汇编行,所有这些都在不受限制的上下文中运行.在这些数百万行中的一行中进行简单的错误计算(可能是有意的)会危及整个系统.也许在未来一两个世纪,或许不会出现一个解决方案,因为没有人真正关心创建安全的操作系统/语言/框架. (6认同)
  • @L̳o̳̳n̳̳g̳̳p̳o̳̳k̳̳e̳̳嗯,有一个基于.NET的微软研究实验操作系统(Singularity),它将安全作为主要目标(没有缓冲区溢出,是的!).没有进程内存共享,没有代码自我修改,甚至设备驱动程序也只是.NET中的另一个软件隔离进程.这是一个非常有趣的概念,但要将它推向人们是非常困难的(最重要的是,它几乎不能与现有软件甚至驱动程序向后兼容;有点像Linux的前10年:D). (2认同)

Tyl*_*nry 102

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

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

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

  • 在我看来,这是一个不好的规则.您可以基本上因为您选择的平台而成为目标,而不是对您资产的任何真正兴趣.想想第三方平台中的所有安全漏洞,以及因使用它而立即易受攻击的所有产品.我不会那么快就相信我对第三方的安全感. (10认同)
  • 我认为这对加密来说是一个很好的规则 - 滚动你自己的加密是灾难的一个秘诀.但是,正如Fosco指出的那样,滚动自己的博客引擎可能会更加安全 - 如果你自己动手,你就不太可能被wordpress安装必须处理的自动攻击所抓住. (9认同)
  • 当谈到加密时,不要自己滚动 - *但要理解你正在使用的东西.*如果你不明白为什么对两条消息使用相同的RC4加密密钥是一个可怕的想法,请在使用前阅读例如,任何流密码. (7认同)
  • 说到加密,这个规则绝对正确.不要写自己的加密期.在使用第三方平台时,它取决于.有些平台本质上更安全,有些平台本质上不太安全,大多数平台可能提供一些安全功能,但也有一些已知的攻击向量.以最近[导致github出现安全漏洞的Rails漏洞]为例(http://news.ycombinator.com/item?id=3663197).毫无疑问,Rails提供了许多安全功能,但它也有一些强大的功能,默认情况不安全. (5认同)
  • 即使在HeartBleed bug之后,显然这是一个很好的规则.想象一下,在定制或专有项目中找到类似热量的错误会有多么困难.如果你自己动手,你只是躲在默默无闻之下,不知道哪些漏洞可能被利用. (3认同)

roo*_*ook 70

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

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

  • 我认为这根本不是必要的.只要坚持原则:如果攻击者可以造成任何类型的内存损坏,请考虑自己拥有.无需了解实际编写(工作)漏洞的详细信息. (9认同)
  • @newgre并非每个漏洞都是缓冲区溢出.Common Weakness Enumeration系统涵盖了几千个漏洞.程序员需要了解攻击者的头脑,否则他会不知道会犯错误. (6认同)
  • @newgre这是一种类型的漏洞利用程序,但今天编写的漏洞利用程序漏洞比内存损坏问题更多.利用SQL注入,本地文件包含,CSRF和XSS编写漏洞,这些是常见问题.(来源:http://www.exploit-db.com/) (5认同)

eri*_*ert 41

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

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


jsc*_*ier 23

我建议查看CWE/SANS TOP 25最危险的编程错误.它在2010年更新,承诺将来定期更新.在2009年修订版可用.

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

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

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


tva*_*son 13

一个好的入门课程可能是计算机网络和安全方面的麻省理工学院课程.我建议的一件事是不要忘记隐私.从某种意义上说,隐私确实是安全的基础,而且通常不会涉及安全技术课程.您可能会在本课程中找到有关互联网的道德和法律方面的隐私材料.


小智 10

Mozilla的网络安全团队汇集了一份伟大的指南,我们在开发我们的网站和服务时遵守这一指南.


ben*_*phy 8

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

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


rap*_*ura 5

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