每个程序员都应该了解安全性啥? [关闭]
Posted
技术标签:
【中文标题】每个程序员都应该了解安全性啥? [关闭]【英文标题】:What should every programmer know about security? [closed]每个程序员都应该了解安全性什么? [关闭] 【发布时间】:2011-02-17 03:38:09 【问题描述】:我是一名 IT 专业的学生,现在大学三年级。到目前为止,我们一直在研究很多与计算机相关的主题(编程、算法、计算机体系结构、数学等)。
我非常确定没有人可以了解有关安全性的所有知识,但我确信每个程序员或 IT 学生都应该了解它的“最低限度”知识,我的问题是这个最低限度的知识是什么?
您能否推荐一些电子书或课程或任何可以帮助您开始这条道路的东西?
【问题讨论】:
很像***.com/questions/325862/… 规则#1:永远不要相信用户的输入。即使是你的祖母也不行 ..这个线程也有很好的信息 - ***.com/questions/72394/… 我的问题不仅与程序员及其错误有关,还与 IT 和计算机科学专业的学生有关 注意你的错误信息。虽然您希望对用户友好,但在某些情况下,“此帐户不存在”和“密码无效”之间的区别可能很危险。 【参考方案1】:如果您希望应用程序安全,请牢记以下原则:
永远不要相信任何输入! Validate input 来自所有不受信任的来源 - 使用白名单而不是黑名单 从一开始就做好安全计划 - 这不是你可以在最后固定的东西 保持简单 - 复杂性会增加安全漏洞的可能性 尽量少用attack surface 确保你fail securely 使用defence in depth 坚持least privilege的原则 使用threat modelling Compartmentalize - 所以你的系统不是全有或全无 隐藏秘密很难 - 隐藏在代码中的秘密不会长期保密 不要编写自己的加密货币 使用加密并不意味着您是安全的(攻击者会寻找较弱的链接) 注意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就应用程序安全最佳实践培训您的开发人员
Codebashing(付费)
Security Innovation(付费)
Security Compass(付费)
OWASP WebGoat(免费)
【讨论】:
+1“利用软件:如何破解代码”是一本很棒的书,但是你链接到的幻灯片太可怕了。 然而,不幸的是,在任何现代系统中实例化最小权限原则几乎是不可能的。例如,Linux 内核(我目前正在使用的源代码)包含超过 940 万行 C 代码和超过 40 万行汇编,所有这些都在不受限制的上下文中运行。在这数百万行中的一个中的一个简单的错误计算(可能是故意的)将危及整个系统。也许在下一两个世纪会出现一个解决方案,也许不会,因为没有人真正关心创建安全的操作系统/语言/框架。 我会将“Web 应用程序黑客手册”添加到该列表中。 替换“从不信任用户输入!” “永远不要相信任何输入!”。来自其他软件的输入应该与用户输入一样对待 - 例如,在网站日志记录中,大多数人不会将 User-Agent / 浏览器 ID 字段视为“用户输入”,但它可以很容易地包含,例如, SQL 注入。 @L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳ 嗯,微软研究院的实验性操作系统(Singularity)建立在.NET之上,它以安全为主要目标(没有缓冲区溢出,耶!)。没有进程内存共享,没有代码自修改,甚至设备驱动程序都只是.NET中另一个软件隔离进程。相当有趣的概念,但很难将其推广给人们(最重要的是,它几乎不能与现有软件甚至驱动程序向后兼容;有点像 Linux 的前 10 年:D)。 【参考方案2】:程序员的安全规则 #1:不要自己动手
除非您自己是安全专家和/或密码学家,否则始终使用精心设计、经过良好测试且成熟的安全平台、框架或库来为您完成工作。这些东西经过多年的思考、修补、更新和专家和黑客的检查。您希望获得这些优势,而不是通过尝试重新发明***来消除它们。
现在,这并不是说您不需要学习任何有关安全的知识。您当然需要足够了解以了解您在做什么,并确保您正确使用这些工具。但是,如果您发现自己即将开始编写自己的密码算法、身份验证系统、输入清理程序等,请停下来,退后一步,并记住规则 #1。
【讨论】:
在我看来这是一个糟糕的规则。您基本上可以仅仅因为您选择的平台而成为目标,而不是对您的资产有任何真正的兴趣。想想在 3rd 方平台中发现的所有安全漏洞,以及所有因为使用它而立即易受攻击的产品。我不会这么快就将我的安全性交给第 3 方。 我认为这是 Crypto 的一个很好的规则 - 滚动你自己的加密是灾难的根源。但是,正如 Fosco 指出的那样,滚动您自己的博客引擎可能会更安全 - 如果您滚动自己的博客引擎,那么您不太可能被 wordpress 安装必须处理的自动攻击所捕获。 谈到加密,这条规则是绝对正确的。不要编写自己的加密货币,期间。在使用 3rd 方平台时,这取决于。一些平台本质上更安全,一些平台本质上不太安全,大多数平台可能提供一些安全功能,但也提供一些已知的攻击向量。以最近的Rails vulnerability that caused a security hole at github 为例。毫无疑问,Rails 提供了许多安全功能,但它也有一些强大的功能,但默认设置不安全。 当涉及到加密时,不要自己动手 - 但要了解你正在使用的东西。 如果你不明白为什么要使用相同的加密密钥两条消息的 RC4 是一个可怕的想法,例如,在使用任何流密码之前阅读。 即使在 HeartBleed 漏洞之后,很明显这是一个很好的规则。想象一下,在自定义或专有项目中找到类似热出血的错误将是多么困难。如果你自己动手,你只是躲在默默无闻的后面,不知道有哪些漏洞可能被利用。【参考方案3】:每个程序员都应该知道如何编写漏洞利用代码。
在不知道系统是如何被利用的情况下,您会意外阻止漏洞。除非您知道如何测试补丁,否则知道如何修补代码绝对没有意义。安全不仅仅是一堆思想实验,您必须科学并测试您的实验。
【讨论】:
我认为这根本没有必要。只要坚持原则:如果攻击者可以导致任何类型的内存损坏,请认为自己拥有。无需深入了解实际编写(工作)漏洞的细节。 @newgre 并非每个漏洞都是缓冲区溢出。 Common Weakness Enumeration 系统涵盖了数千个漏洞。程序员需要了解攻击者的想法,否则他会在不知不觉中犯错。 我知道并不是每一个都是缓冲区溢出,但任何通常被称为“利用”的东西都是基于某种内存损坏:缓冲区溢出、双释放、堆溢出,整数相关的溢出,格式字符串等。当然还有其他的东西,比如逻辑错误,但这不是这个答案开始的主题。 @newgre 这是一种利用类型,但如今更多的利用是为了利用 Web 应用程序缺陷而不是内存损坏问题。漏洞利用是利用 SQL 注入、本地文件包含、CSRF 和 XSS 编写的,这些是常见问题。 (来源:exploit-db.com) 我同意,如果你自己会写漏洞利用,你就可以理解黑客的脑洞最大!【参考方案4】:安全是一个过程,而不是一个产品。
许多人似乎忘记了这个显而易见的事实。
【讨论】:
【参考方案5】:我建议查看CWE/SANS TOP 25 Most Dangerous Programming Errors。它已于 2010 年更新,并承诺在未来定期更新。 2009 修订版也可用。
来自http://cwe.mitre.org/top25/index.html
2010 年 CWE/SANS 最危险的 25 个编程错误列出了可能导致严重软件漏洞的最普遍和最严重的编程错误。它们通常很容易找到,也很容易被利用。它们很危险,因为它们经常允许攻击者完全接管软件、窃取数据或完全阻止软件运行。
Top 25 列表是一种教育和意识工具,通过识别和避免在软件发布之前发生的非常常见的错误,帮助程序员预防困扰软件行业的各种漏洞。软件客户可以使用相同的列表来帮助他们要求更安全的软件。软件安全研究人员可以使用前 25 名来关注所有已知安全弱点的一个狭窄但重要的子集。最后,软件经理和 CIO 可以使用前 25 名列表作为衡量其软件安全工作进度的标尺。
【讨论】:
请注意,该列表中的前 4 个错误(以及其他一些错误)都是相同的错误 - 信任输入。【参考方案6】:一个好的入门课程可能是Computer Networks and Security 的麻省理工学院课程。我建议的一件事是不要忘记隐私。从某种意义上说,隐私确实是安全的基础,并且通常不会在安全技术课程中涉及。您可能会在 Ethics and the Law 上的本课程中找到一些关于隐私的材料,因为它与互联网有关。
【讨论】:
MIT 课程链接失效 链接已修复(暂时)。谢谢。【参考方案7】:Mozilla 的网络安全团队整理了一个 great guide,我们在开发网站和服务时遵守了这一规定。
【讨论】:
【参考方案8】:框架和 API 中安全默认值的重要性:
许多早期的 Web 框架在模板中默认没有转义 html,因此存在 XSS 问题 许多早期的 Web 框架使得连接 SQL 比创建导致大量 SQL 注入错误的参数化查询更容易。 某些版本的 Erlang(R13B,可能还有其他版本)默认不验证 ssl 对等证书,并且可能有很多 erlang 代码容易受到 SSL MITM 攻击 默认情况下,Java 的 XSLT 转换器允许执行任意 Java 代码。这造成了许多严重的安全漏洞。 默认情况下,Java 的 XML 解析 API 允许已解析的文档读取文件系统上的任意文件。更有趣:)【讨论】:
【参考方案9】:您应该了解三个 A。身份验证、授权、审计。经典的错误是对用户进行身份验证,而不检查用户是否被授权执行某些操作,因此用户可能会查看其他用户的私人照片,Diaspora 就犯了这个错误。越来越多的人忘记了审计,你需要在一个安全的系统中,能够知道谁在什么时候做了什么。
【讨论】:
并非所有授权都需要身份验证。 "From ABAC to ZBAC" 将 NBAC(基于身份验证)访问控制与不需要身份验证的解决方案进行对比。 “IBAC、RBAC、ABAC 甚至 CBAC——基于声明的访问控制都依赖于身份验证......为简单起见,本文将它们视为单一解决方案,并忽略那些已实现 ZBAC 架构方面的版本。它们统称为身份验证基于访问控制 (NBAC)。”【参考方案10】: 请记住,您(程序员)必须保护所有部件,但攻击者只需成功找到您盔甲中的一处扭结。 安全是“未知未知数”的一个例子。有时您不知道可能存在哪些安全漏洞(直到之后)。 错误和安全漏洞之间的区别取决于攻击者的智能。【讨论】:
【参考方案11】:我会添加以下内容:
数字签名和数字证书的工作原理 什么是沙盒了解不同攻击媒介的工作原理:
本机代码上的缓冲区溢出/下溢/等 社会工程 DNS 欺骗 中间人 CSRF/XSS 等 SQL 注入 加密攻击(例如:利用弱加密算法,例如 DES) 程序/框架错误(例如:github 的latest 安全漏洞)您可以轻松地通过谷歌搜索所有这些。这会给你一个很好的基础。 如果您想查看 Web 应用程序的漏洞,有一个名为 google gruyere 的项目向您展示了如何利用工作中的 Web 应用程序。
【讨论】:
【参考方案12】:当您构建任何企业或任何您自己的软件时,您应该像黑客一样思考。我们知道黑客也不是所有事情的专家,但是当他们发现任何漏洞时,他们开始通过收集来挖掘它有关所有事物的信息,并最终攻击我们的软件。因此,为了防止此类攻击,我们应该遵循一些众所周知的规则,例如:
总是尝试破解您的密码(使用备忘单和谷歌搜索更多信息)。 针对您的编程领域中的安全漏洞进行更新。 如上所述,永远不要相信任何类型的用户或自动输入。 使用开源应用程序(它们的大多数安全漏洞已被知晓并已解决)。您可以在以下链接中找到更多安全资源:
owasp security CERT Security SANS Security netcraft SecuritySpace openwall php Sec thehackernews(不断更新自己)有关您的应用程序供应商安全流程的更多信息,请访问 Google。
【讨论】:
【参考方案13】:-
为什么很重要。
一切都是为了取舍。
密码学很大程度上会分散安全性。
【讨论】:
【参考方案14】:关于安全的一般信息,我强烈推荐阅读Bruce Schneier。他有一个网站,他的crypto-gram newsletter,几个books,并且做了很多interviews。
我也会熟悉社会工程学(和Kevin Mitnick)。
对于一本关于安全如何在现实世界中发挥作用的好书(而且非常有趣),我会推荐 Cliff Stoll 的优秀(虽然有点过时)'The Cuckoo's Egg'。
【讨论】:
【参考方案15】:还请务必查看OWASP Top 10 List,了解所有主要攻击媒介/漏洞的分类。
这些东西读起来很有趣。学习像攻击者一样思考将训练您在编写自己的代码时思考什么。
【讨论】:
【参考方案16】:对您的用户密码进行加盐和哈希处理。切勿将它们以明文形式保存在数据库中。
【讨论】:
【参考方案17】:只是想为网络开发者分享这个:
开发人员安全指南https://github.com/FallibleInc/security-guide-for-developers
【讨论】:
以上是关于每个程序员都应该了解安全性啥? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章