我是一名IT学生,现在大学三年级.到目前为止,我们一直在研究与计算机相关的许多主题(编程,算法,计算机体系结构,数学等).
我很确定没有人能够学到关于安全性的所有事情,但确保每个程序员或IT学生都应该了解它的"最低"知识,而我的问题是这个最低限度的知识是什么?
您能否建议一些电子书或课程或任何可以帮助您从这条道路开始?
如果您希望应用程序安全,请记住这些原则:
绝不相信任何输入!
验证 来自所有不受信任来源的输入 - 使用白名单而不是黑名单
从一开始就计划安全 - 这不是你最后可以坚持的东西
保持简单 - 复杂性增加了安全漏洞的可能性
将攻击面保持在最低限度
确保你安全失败
深入使用防御
坚持最小特权原则
使用威胁建模
隔离 - 所以你的系统不是全部或全部
隐藏秘密很难 - 隐藏在代码中的秘密不会长期保密
不要写自己的加密
使用加密并不意味着你是安全的(攻击者会寻找一个较弱的链接)
请注意缓冲区溢出以及如何防止它们
有一些关于使您的应用程序安全的优秀书籍和文章:
编写安全代码第2版 - 我认为每个程序员都应该阅读这个
构建安全软件:如何正确避免安全问题
安全编程指南
利用软件
安全工程 - 一本优秀的读物
Linux和Unix的安全编程HOWTO
培训您的开发人员应用程序安全性最佳实践
Codebashing(付费)
安全创新(付费)
安全指南针(付费)
OWASP WebGoat(免费)
程序员的安全规则#1:不要自己动手
除非您自己是安全专家和/或密码学家,否则请始终使用设计良好,经过良好测试且成熟的安全平台,框架或库来为您完成工作.这些事情花了数年时间被专家和黑客一直考虑,修补,更新和检查.你想获得这些优势,而不是试图通过重新发明轮子来解雇它们.
现在,这并不是说你不需要学习任何有关安全性的知识.你当然需要足够了解你正在做什么,并确保你正确使用这些工具.但是,如果您发现自己即将开始编写自己的加密算法,身份验证系统,输入清理程序等,请停止,退后一步,并记住规则#1.
每个程序员都应该知道如何编写漏洞利用代码.
在不知道系统如何被利用的情况下,您会意外地阻止漏洞.除非您知道如何测试补丁,否则了解如何修补代码绝对没有意义.安全不仅仅是一堆思想实验,你必须科学并测试你的实验.
安全是一个过程,而不是一个产品.
许多人似乎忘记了这个显而易见的事实.
我建议查看CWE/SANS TOP 25最危险的编程错误.它在2010年更新,承诺将来定期更新.在2009年修订版可用.
来自http://cwe.mitre.org/top25/index.html
2010年CWE/SANS排名前25位最危险的编程错误列出了可能导致严重软件漏洞的最广泛和最关键的编程错误.它们通常很容易找到,并且易于利用.它们很危险,因为它们经常允许攻击者完全接管软件,窃取数据或阻止软件工作.
排名前25的列表是一个教育和意识工具,通过识别和避免在软件发布之前发生的常见错误,帮助程序员防止困扰软件行业的各种漏洞.软件客户可以使用相同的列表来帮助他们要求更安全的软件.软件安全方面的研究人员可以使用前25名专注于所有已知安全漏洞的一个狭窄但重要的子集.最后,软件经理和CIO可以使用前25名列表作为他们保护软件安全工作的衡量标准.
一个好的入门课程可能是计算机网络和安全方面的麻省理工学院课程.我建议的一件事是不要忘记隐私.从某种意义上说,隐私确实是安全的基础,而且通常不会涉及安全技术课程.您可能会在本课程中找到有关互联网的道德和法律方面的隐私材料.
Mozilla的网络安全团队汇集了一份伟大的指南,我们在开发我们的网站和服务时遵守这一指南.
框架和API中安全默认值的重要性:
许多早期的Web框架默认情况下没有在模板中转义html,因此存在XSS问题
许多早期的Web框架使得连接SQL比创建参数化查询更容易,从而导致大量的SQL注入错误.
某些版本的Erlang(R13B,可能是其他版本)默认情况下不验证ssl对等证书,并且可能存在大量易受SSL MITM攻击的erlang代码
默认情况下,Java的XSLT转换器允许执行任意java代码.由此产生了许多严重的安全漏洞.
默认情况下,Java的XML解析API允许解析的文档读取文件系统上的任意文件.更多乐趣 :)
你应该知道三个A的.身份验证,授权,审计.经典错误是对用户进行身份验证,而不检查用户是否有权执行某些操作,因此用户可能会查看其他用户的私人照片,这是Diaspora所犯的错误.许多人忘记了审计,你需要在一个安全的系统中,能够分辨出谁做了什么,何时做了什么.