我是一名IT学生,现在大学三年级 . 到目前为止,我们一直在研究与计算机相关的许多主题(编程,算法,计算机体系结构,数学等) .
我非常确定没有人能够学到关于安全性的所有事情,但确保每个程序员或IT学生都应该了解它的“最低”知识,而我的问题是这个最低限度的知识是什么?
你能推荐一些电子书或课程,或者有什么方法可以帮助你开始这条路吗?
一个好的入门课程可能是Computer Networks and Security的麻省理工学院课程 . 我建议的一件事是不要忘记隐私 . 从某种意义上说,隐私确实是安全的基础,并且通常不涉及安全技术课程 . 您可能会在Ethics and the Law上找到有关隐私的一些材料,因为它与互联网有关 .
加盐并哈希用户的密码 . 永远不要将它们保存在数据库的纯文本中 .
请记住,你(程序员)必须保护所有部件,但攻击者只需成功找到你盔甲中的一个扭结 .
安全性是"unknown unknowns"的一个例子 . 有时你不会知道可能的安全漏洞是什么(直到之后) .
错误和安全漏洞之间的区别取决于攻击者的智能 .
有关安全性的一般信息,我强烈建议您阅读Bruce Schneier . 他有一个网站,他的crypto-gram newsletter,几个books,并做了很多interviews .
我也熟悉社会工程(和Kevin Mitnick) .
关于安全如何在现实世界中发挥作用的好书(并且非常有趣),我会推荐Cliff Stoll的优秀(尽管有点过时)'The Cuckoo's Egg' .
如果您希望您的应用程序安全,请记住这些原则:
Never trust any input!
Validate input来自所有不受信任的来源 - 使用白名单而不是黑名单
从一开始就计划安全 - 这不是你最后可以解决的问题
保持简单 - 复杂性增加了安全漏洞的可能性
将attack surface保持在最低限度
确保你fail securely
使用defence in depth
坚持least privilege的原则
使用threat modelling
Compartmentalize - 所以你的系统不是全部或全部
隐藏秘密很难 - 隐藏在代码中的秘密不会长期保密
不要写自己的加密
使用crypto并不安全(攻击者会查找较弱的链接)
注意buffer overflows以及如何防范它们
有一些关于使您的应用程序安全的优秀书籍和文章:
Writing Secure Code 2nd Edition - 我想每个程序员都应该读这个
Building Secure Software: How to Avoid Security Problems the Right Way
Secure Programming Cookbook
Exploiting Software
Security Engineering - 读得很好
Secure Programming for Linux and Unix HOWTO
Train your developers on application security best pratices
Codebashing(已付款)
Security Innovation(已付款)
Security Compass(已付款)
OWASP WebGoat(免费)
框架和API中安全默认值的重要性:
许多早期的Web框架默认情况下没有在模板中转义html,因此存在XSS问题
许多早期的Web框架使得连接SQL比创建参数化查询更容易,从而导致大量的SQL注入错误 .
某些版本的Erlang(R13B,可能是其他版本)默认情况下不验证ssl对等证书,并且可能存在大量易受SSL MITM攻击的erlang代码
Java的XSLT转换器默认允许执行任意java代码 . 由此产生了许多严重的安全漏洞 .
Java的XML解析API默认允许解析的文档读取文件系统上的任意文件 . 更多乐趣 :)
Mozilla的网络安全团队组建了一个great guide,我们在开发我们的网站和服务时遵守这一要求 .
为什么重要 .
这完全取决于权衡 .
密码学在很大程度上分散了安全性 .
你应该知道三个A的 . 身份验证,授权,审计 . 经典错误是对用户进行身份验证,而不检查用户是否有权执行某些操作,因此用户可能会查看其他用户的私人照片,这是Diaspora所犯的错误 . 很多人忘记了审计,你需要在一个安全的系统中告诉谁做了什么,什么时候做什么 .
程序员安全规则#1: Don't roll your own
除非您自己是安全专家和/或密码学家,否则请始终使用设计良好,经过良好测试且成熟的安全平台,框架或库来为您完成工作 . 这些事情花了数年时间被专家和黑客一直考虑,修补,更新和检查 . 你想获得这些优势,而不是试图通过重新发明轮子来解雇它们 .
现在,这并不是说你不需要学习任何有关安全性的知识 . 你当然需要足够了解你正在做什么,并确保你正确使用这些工具 . 但是,如果您发现自己即将开始编写自己的加密算法,身份验证系统,输入清理程序等,请停止,退后一步,并记住规则#1 .
另外一定要查看OWASP Top 10 List以获取所有主要攻击的分类矢量/漏洞 .
阅读这些内容令人着迷 . 学习像攻击者一样思考会在你编写自己的代码时训练你思考什么 .
当你构建任何企业或任何自己的软件时,你应该像黑客一样思考 . 我们知道黑客在所有方面都不是专家,但当他们发现任何漏洞时,他们会开始通过收集所有信息来深入研究事情,最后攻击我们的软件 . 为了防止这种攻击,我们应该遵循一些众所周知的规则,如:
总是试图打破你的代码(使用cheatsheets和谷歌搜索更多的信息) .
将针对您的编程领域中的安全漏洞进行更新 .
并且如上所述从不信任任何类型的用户或自动输入 .
使用开源应用程序(它们的大多数安全漏洞已知并已解决) .
您可以在以下链接中找到更多安全资源:
owasp security
CERT Security
SANS Security
netcraft
SecuritySpace
openwall
PHP Sec
thehackernews(不断更新)
有关您的应用程序供应商安全流程的更多信息 .
我建议复习CWE/SANS TOP 25 Most Dangerous Programming Errors . 它在2010年更新,承诺将来定期更新 . 2009修订版也可用 .
来自http://cwe.mitre.org/top25/index.html
2010年CWE / SANS排名前25位最危险的编程错误列出了可能导致严重软件漏洞的最广泛和最关键的编程错误 . 它们通常很容易找到,并且易于利用 . 它们很危险,因为它们经常允许攻击者完全接管软件,窃取数据或阻止软件工作 . 排名前25的列表是一个教育和意识工具,通过识别和避免在软件发布之前发生的常见错误,帮助程序员防止困扰软件行业的各种漏洞 . 软件客户可以使用相同的列表来帮助他们要求更安全的软件 . 软件安全方面的研究人员可以使用前25名专注于所有已知安全漏洞的一个狭窄但重要的子集 . 最后,软件经理和CIO可以使用前25名列表作为他们保护软件安全工作的衡量标准 .
我想补充以下内容:
数字签名和数字证书的工作原理
什么是沙箱
了解不同的攻击媒介如何工作:
本机代码上的缓冲区溢出/下溢/等
社会工程
DNS欺骗
中间人
CSRF / XSS等
SQL注入
加密攻击(例如:利用DES等弱加密算法)
程序/框架错误(例如:github的latest安全漏洞)
您可以轻松谷歌所有这一切 . 这将为您奠定良好的基础 . 如果您想查看Web应用程序漏洞,可以使用名为google gruyere的项目向您展示如何利用有效的Web应用程序 .
只是想为网络开发者分享这个:
安全指南换开发商https://github.com/FallibleInc/security-guide-for-developers
Every programmer should know how to write exploit code.
在不知道系统如何被利用的情况下,您会意外地阻止漏洞 . 除非您知道如何测试补丁,否则了解如何修补代码绝对没有意义 . 安全不仅仅是一堆思想实验,你必须科学并测试你的实验 .
Security is a process, not a product.
许多人似乎忘记了这个显而易见的事实 .
17 回答
一个好的入门课程可能是Computer Networks and Security的麻省理工学院课程 . 我建议的一件事是不要忘记隐私 . 从某种意义上说,隐私确实是安全的基础,并且通常不涉及安全技术课程 . 您可能会在Ethics and the Law上找到有关隐私的一些材料,因为它与互联网有关 .
加盐并哈希用户的密码 . 永远不要将它们保存在数据库的纯文本中 .
请记住,你(程序员)必须保护所有部件,但攻击者只需成功找到你盔甲中的一个扭结 .
安全性是"unknown unknowns"的一个例子 . 有时你不会知道可能的安全漏洞是什么(直到之后) .
错误和安全漏洞之间的区别取决于攻击者的智能 .
有关安全性的一般信息,我强烈建议您阅读Bruce Schneier . 他有一个网站,他的crypto-gram newsletter,几个books,并做了很多interviews .
我也熟悉社会工程(和Kevin Mitnick) .
关于安全如何在现实世界中发挥作用的好书(并且非常有趣),我会推荐Cliff Stoll的优秀(尽管有点过时)'The Cuckoo's Egg' .
如果您希望您的应用程序安全,请记住这些原则:
Never trust any input!
Validate input来自所有不受信任的来源 - 使用白名单而不是黑名单
从一开始就计划安全 - 这不是你最后可以解决的问题
保持简单 - 复杂性增加了安全漏洞的可能性
将attack surface保持在最低限度
确保你fail securely
使用defence in depth
坚持least privilege的原则
使用threat modelling
Compartmentalize - 所以你的系统不是全部或全部
隐藏秘密很难 - 隐藏在代码中的秘密不会长期保密
不要写自己的加密
使用crypto并不安全(攻击者会查找较弱的链接)
注意buffer overflows以及如何防范它们
有一些关于使您的应用程序安全的优秀书籍和文章:
Writing Secure Code 2nd Edition - 我想每个程序员都应该读这个
Building Secure Software: How to Avoid Security Problems the Right Way
Secure Programming Cookbook
Exploiting Software
Security Engineering - 读得很好
Secure Programming for Linux and Unix HOWTO
Train your developers on application security best pratices
Codebashing(已付款)
Security Innovation(已付款)
Security Compass(已付款)
OWASP WebGoat(免费)
框架和API中安全默认值的重要性:
许多早期的Web框架默认情况下没有在模板中转义html,因此存在XSS问题
许多早期的Web框架使得连接SQL比创建参数化查询更容易,从而导致大量的SQL注入错误 .
某些版本的Erlang(R13B,可能是其他版本)默认情况下不验证ssl对等证书,并且可能存在大量易受SSL MITM攻击的erlang代码
Java的XSLT转换器默认允许执行任意java代码 . 由此产生了许多严重的安全漏洞 .
Java的XML解析API默认允许解析的文档读取文件系统上的任意文件 . 更多乐趣 :)
Mozilla的网络安全团队组建了一个great guide,我们在开发我们的网站和服务时遵守这一要求 .
为什么重要 .
这完全取决于权衡 .
密码学在很大程度上分散了安全性 .
你应该知道三个A的 . 身份验证,授权,审计 . 经典错误是对用户进行身份验证,而不检查用户是否有权执行某些操作,因此用户可能会查看其他用户的私人照片,这是Diaspora所犯的错误 . 很多人忘记了审计,你需要在一个安全的系统中告诉谁做了什么,什么时候做什么 .
程序员安全规则#1: Don't roll your own
除非您自己是安全专家和/或密码学家,否则请始终使用设计良好,经过良好测试且成熟的安全平台,框架或库来为您完成工作 . 这些事情花了数年时间被专家和黑客一直考虑,修补,更新和检查 . 你想获得这些优势,而不是试图通过重新发明轮子来解雇它们 .
现在,这并不是说你不需要学习任何有关安全性的知识 . 你当然需要足够了解你正在做什么,并确保你正确使用这些工具 . 但是,如果您发现自己即将开始编写自己的加密算法,身份验证系统,输入清理程序等,请停止,退后一步,并记住规则#1 .
另外一定要查看OWASP Top 10 List以获取所有主要攻击的分类矢量/漏洞 .
阅读这些内容令人着迷 . 学习像攻击者一样思考会在你编写自己的代码时训练你思考什么 .
当你构建任何企业或任何自己的软件时,你应该像黑客一样思考 . 我们知道黑客在所有方面都不是专家,但当他们发现任何漏洞时,他们会开始通过收集所有信息来深入研究事情,最后攻击我们的软件 . 为了防止这种攻击,我们应该遵循一些众所周知的规则,如:
总是试图打破你的代码(使用cheatsheets和谷歌搜索更多的信息) .
将针对您的编程领域中的安全漏洞进行更新 .
并且如上所述从不信任任何类型的用户或自动输入 .
使用开源应用程序(它们的大多数安全漏洞已知并已解决) .
您可以在以下链接中找到更多安全资源:
owasp security
CERT Security
SANS Security
netcraft
SecuritySpace
openwall
PHP Sec
thehackernews(不断更新)
有关您的应用程序供应商安全流程的更多信息 .
我建议复习CWE/SANS TOP 25 Most Dangerous Programming Errors . 它在2010年更新,承诺将来定期更新 . 2009修订版也可用 .
来自http://cwe.mitre.org/top25/index.html
我想补充以下内容:
数字签名和数字证书的工作原理
什么是沙箱
了解不同的攻击媒介如何工作:
本机代码上的缓冲区溢出/下溢/等
社会工程
DNS欺骗
中间人
CSRF / XSS等
SQL注入
加密攻击(例如:利用DES等弱加密算法)
程序/框架错误(例如:github的latest安全漏洞)
您可以轻松谷歌所有这一切 . 这将为您奠定良好的基础 . 如果您想查看Web应用程序漏洞,可以使用名为google gruyere的项目向您展示如何利用有效的Web应用程序 .
只是想为网络开发者分享这个:
安全指南换开发商
https://github.com/FallibleInc/security-guide-for-developers
Every programmer should know how to write exploit code.
在不知道系统如何被利用的情况下,您会意外地阻止漏洞 . 除非您知道如何测试补丁,否则了解如何修补代码绝对没有意义 . 安全不仅仅是一堆思想实验,你必须科学并测试你的实验 .
Security is a process, not a product.
许多人似乎忘记了这个显而易见的事实 .