每个程序员应该知道什么安全?
我是一名IT专业的学生,现在已经进入大学三年级。 到目前为止,我们一直在研究与计算机相关的许多学科(编程,algorithm,计算机体系结构,math等)。
我很确定,没有人能够学习有关安全的每件事情,但是每个程序员或者IT学员都应该知道有一个“最低”的知识,而我的问题是这个最低限度的知识是什么?
你能build议一些电子书或课程或任何东西可以帮助开始这条路吗?
如果您希望您的应用程序安全,请牢记以下原则:
- 不要相信任何input!
- validation来自所有不受信任来源的input – 使用白名单而不是黑名单
- 从一开始就计划安全 – 这不是你最后可以locking的东西
- 保持简单 – 复杂性会增加安全漏洞的可能性
- 保持你的攻击面最小化
- 确保你安全地失败
- 深度使用防御
- 坚持最小特权的原则
- 使用威胁build模
- 分区 – 所以你的系统不是全部或没有
- 隐藏秘密是很难的 – 隐藏在代码中的秘密不会长久保密
- 不要写你自己的密码
- 使用encryption并不意味着你是安全的(攻击者会寻找一个较弱的链接)
- 了解缓冲区溢出以及如何防止这些溢出
有一些关于使您的应用程序安全的优秀书籍和文章:
- 编写安全代码第二版 – 我想每个程序员都应该阅读这个
- 构build安全软件:如何正确避免安全问题
- 安全编程手册
- 开发软件
- 安全工程 – 一个很好的阅读
- Linux和Unix的安全编程HOWTO
培训您的开发人员应用程序安全最佳实践
代码清理 (付费)
安全创新 (付费)
安全指南针 (付费)
OWASP WebGoat (免费)
程序员的安全规则#1: 不要自己动手
除非您自己是安全专家和/或密码专家,否则请始终使用devise良好,经过充分testing的成熟安全平台,框架或库来为您完成这项工作。 这些东西花费了数年的时间,由专家和黑客进行了修补,更新和检查。 你想获得这些优势,而不是试图重新发明轮子的理由。
现在,这并不是说你不需要学习任何有关安全的知识。 您当然需要足够的了解,了解自己在做什么,并确保正确使用工具。 但是,如果您发现自己开始编写自己的密码algorithm,身份validation系统,input消毒器等,请退后一步,并记住规则1。
每个程序员都应该知道如何编写漏洞利用代码。
不知道系统如何被利用,你意外地阻止漏洞。 知道如何修补代码是绝对没有意义的,除非你知道如何testing你的补丁。 安全不仅仅是一堆思想实验,你必须科学地testing你的实验。
安全是一个过程,而不是一个产品。
许多人似乎忘记了这个明显的事实。
我build议查看CWE / SANS TOP 25最危险的编程错误 。 它在2010年更新,承诺将来定期更新。 2009年版本也是可用的。
从http://cwe.mitre.org/top25/index.html
2010年CWE / SANS 25大危险编程错误列出了可导致严重软件漏洞的最普遍和最关键的编程错误。 它们通常很容易find,而且容易被利用。 他们是危险的,因为他们经常会允许攻击者完全接pipe软件,窃取数据或阻止软件工作。
排名前25的名单是一个教育和意识的工具,通过识别和避免软件出货之前发生的常见错误,帮助程序员防止困扰软件行业的各种漏洞。 软件客户可以使用相同的列表来帮助他们请求更安全的软件。 软件安全研究人员可以使用Top 25来关注所有已知安全弱点的一个狭窄而重要的子集。 最后,软件经理和首席信息官可以使用排名前25的名单作为保护软件安全进度的衡量标准。
计算机networking和安全领域的麻省理工学院课程可能是一门很好的入门课程。 我build议的一件事是不要忘记隐私。 在某些意义上,隐私真的是安全的基础,而且在安全技术课程中经常没有涉及。 在伦理和法律方面 ,你可能会发现一些关于隐私的材料,因为它涉及到互联网。
Mozilla的networking安全团队提供了一个很好的指导 ,我们在开发我们的网站和服务时遵守这个指导 。
框架和API中安全默认的重要性:
- 很多早期的web框架在模板中并没有默认转义html,并因此产生了XSS问题
- 很多早期的Web框架使连接SQL更容易,而不是创build导致大量SQL注入漏洞的参数化查询。
- 某些版本的Erlang(R13B,也许是其他版本)在默认情况下不validationSSL对等证书,并且可能有很多容易受到SSL MITM攻击的erlang代码
- Java的XSLT转换器默认允许执行任意的java代码。 由此产生了许多严重的安全漏洞。
- Java的XMLparsingAPI默认允许parsing的文档读取文件系统上的任意文件。 更多乐趣 :)
你应该知道三个A的。 authentication,授权,审计。 传统的错误是authentication用户,而不检查用户是否被授权执行一些操作,因此用户可以查看其他用户的私人照片,散居在外的错误。 许多许多人忘记了审计,你需要一个安全的系统来分辨谁做了什么,什么时候做什么。
- 请记住,你(程序员)必须确保所有部件的安全,但是攻击者只能成功find你的盔甲。
- 安全是“未知的未知”的一个例子。 有时你不知道可能的安全缺陷是什么(直到之后)。
- 错误和安全漏洞之间的差异取决于攻击者的智能。
我会添加以下内容:
- 数字签名和数字证书的工作原理
- 什么是沙盒
了解不同的攻击媒介如何工作:
- 本地代码上的缓冲区溢出/下溢/等
- 社会工程师
- DNS欺骗
- 人在中间
- CSRF / XSS等人
- SQL注入
- encryption攻击(例如:利用弱encryptionalgorithm,如DES)
- 程序/框架错误(例如:github 最新的安全缺陷)
你可以很容易地谷歌所有这一切。 这会给你一个很好的基础。 如果您想查看networking应用程序漏洞,有一个名为google gruyere的项目,向您展示如何利用正在运行的Web应用程序。
当你build立任何企业或任何你自己的软件时,你应该像黑客一样思考。我们知道黑客并不是所有事情的专家,但是当他们发现任何漏洞时,他们开始通过收集所有信息事情,最后攻击我们的软件。所以为了防止这种攻击,我们应该遵循一些众所周知的规则,如:
- 总是试图打破你的代码(使用cheatsheets和谷歌的东西了解更多信息)。
- 针对您编程领域的安全漏洞进行更新。
- 如上所述,不要信任任何types的用户或自动input。
- 使用开源应用程序(他们的大多数安全缺陷已知并解决)。
您可以在以下链接中find更多的安全资源:
- owasp安全
- CERT安全
- SANS安全
- Netcraft公司
- SecuritySpace
- OpenWall的
- PHP Sec
- thehackernews (不断更新自己)
有关您的应用程序供应商安全stream程的更多信息。
- 为什么是重要的。
- 这全是关于权衡。
- 密码学在很大程度上是安全的分心。
有关安全的一般信息,我强烈推荐阅读Bruce Schneier 。 他有一个网站,他的密码克通讯 ,几本书 ,并做了很多采访 。
我也会熟悉社交工程(和凯文米特尼克 )。
对于一本关于如何在现实世界中发挥安全性的好书(而且非常有趣),我会推荐那些优秀的(虽然有点过时) 的 Cliff Stoll 的“杜鹃蛋” ( The Cuckoo's Egg) 。
另外,请务必查看OWASP Top 10列表 ,了解所有主要攻击媒介/漏洞的分类。
这些东西是令人着迷的阅读。 学习像攻击者一样思考,将会训练你在编写自己的代码时要考虑什么。
用盐和哈希你的用户的密码。 切勿将它们以明文forms保存在数据库中。
只是想分享给网页开发者:
安全指南换开发商
https://github.com/FallibleInc/security-guide-for-developers