每个程序员应该对安全性了解什么?[关闭]


427

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

我非常确定没有人可以学习有关安全性的所有知识,但可以确保每个程序员或IT学生都应该了解“最小”知识,而我的问题是,这是最低知识?

您能否建议一些电子书或课程,或者有什么可以帮助您开始这条路的?



118
规则1:永远不要信任用户的输入。即使是您的祖母也没有
安东尼·弗洛尼

2
..和这个线程也有伟大的信息- stackoverflow.com/questions/72394/...
Sripathi克里希南

我的问题不仅涉及程序员及其错误,还涉及IT和计算机科学专业的学生
Mohamad Alhamoud 2010年

1
观看您的错误消息。当您希望变得用户友好时,“此帐户不存在”和“密码无效”之间的区别在某些情况下可能很危险。
Michael Mior 2012年

Answers:


551

如果要确保应用程序安全,请记住以下原则:

  • 永远不要相信任何输入!
  • 验证 来自所有不受信任来源的输入 -使用白名单而非黑名单
  • 从一开始就计划安全性-最终您无济于事
  • 保持简单-复杂性增加了安全漏洞的可能性
  • 保持你的攻击面降至最低
  • 确保您安全失败
  • 深入使用防御
  • 坚持最小特权原则
  • 使用威胁建模
  • 分区 -因此您的系统不是全部还是全部
  • 隐藏秘密是很难的-隐藏在代码中的秘密不会长期保持秘密
  • 不要写自己的加密货币
  • 使用加密并不意味着您安全(攻击者会寻找较弱的链接)
  • 注意缓冲区溢出以及如何防止它们溢出

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

对开发人员进行应用程序安全性最佳实践方面的培训

密匙化(付费)

安全创新(收费)

安全指南针(收费)

OWASP WebGoat(免费)


+1“开发软件:如何破解代码”是一本好书,但是链接到的幻灯片却很糟糕。
rook 2010年

7
但是,不幸的是,几乎不可能在任何现代系统中实例化最小特权原则。例如,Linux内核(我当前正在使用的源代码)包含940万行C代码和40万行汇编代码,所有这些代码均在不受限制的上下文中运行。这些数百万行之一中的简单错误计算(可能是有意为之)将损害整个系统。也许在下一两个世纪出现解决方案,也许不会出现,因为没有人真正关心创建安全的OS /语言/框架。
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳

1
我将“ Web应用程序黑客手册”添加到该列表中。
2012年

34
替换为“永远不要信任用户输入!” “永远不要相信任何输入!”。来自其他软件的输入应与用户输入一样对待-例如,在网站日志记录中,大多数人不会将User-Agent /浏览器ID字段视为“用户输入”,但它可以很容易地包含(例如) SQL注入。
彼得斯2012年

2
@ L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳好吧,Microsoft Research实验性操作系统(Singularity)建立在.NET上,其目标是将安全性作为主要目标(是的,没有缓冲区溢出!)。没有进程内存共享,没有代码自我修改,甚至设备驱动程序也只是.NET中另一个软件隔离的进程。这是一个很有趣的概念,但是很难将其推广给人们(最重要的是,它几乎不能与现有软件甚至驱动程序向后兼容;有点像Linux:D的头十年)。
a安2014年

102

程序员安全性的第一法则:不要自己动手

除非您自己是安全专家和/或密码专家,否则请始终使用设计良好,经过测试和成熟的安全平台,框架或库来为您完成工作。这些东西已经花费了数年的时间由专家和黑客进行思考,修补,更新和检查。您想获得这些优势,而不是通过重新发明轮子来消除它们。

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


10
我认为这是一个坏规则。从本质上来说,您可能会因为选择的平台而成为目标,而不是对资产有任何实际兴趣。考虑一下第三方平台中发现的所有安全漏洞,以及所有因使用它们而立即受到攻击的产品。我不会很快相信我对第三方的信任。
Fosco 2012年

9
我认为这对Crypto来说是个好规则-自行加密是灾难的根源。但是,正如Fosco指出的那样,滚动自己的博客引擎可能更安全-如果滚动自己的博客引擎,则不太可能被wordpress安装必须处理的自动攻击所吸引。
James P McGrath'5年

5
说到加密,此规则绝对正确。不要写自己的加密货币。在使用第三方平台时,要视情况而定。有些平台本来就更安全,某些平台本来就不太安全,并且大多数平台可能提供某些安全功能,但也提供一些已知的攻击媒介。以最近导致在github上出现安全漏洞Rails漏洞为例。毫无疑问,Rails提供了许多安全功能,但它也具有一些功能强大且默认值不安全。
Michael Kopinsky

7
当涉及加密时,不要自己动手- 但一定要了解您正在使用的东西。如果您不明白为什么对两个消息使用相同的RC4加密密钥是一个可怕的主意,请在使用任何流密码之前先进行阅读。
Christopher Creutzig,2012年

3
即使在出现HeartBleed错误之后,显然这也是一个好规则。想象一下,在自定义或专有项目中发现类似发热漏洞的错误有多么困难。如果您自己动手,您只是躲在晦涩难懂的背后,不会知道可能会利用哪些漏洞。
Sqeaky

71

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

在不知道如何利用系统的情况下,您不小心停止了漏洞。除非您知道如何测试补丁,否则知道如何补丁代码绝对是没有意义的。安全不仅仅是一堆思想实验,您必须科学并测试您的实验。


10
我认为这根本没有必要。只需遵守以下原则:如果攻击者可能导致任何形式的内存损坏,请认为自己是拥有者。无需深入研究实际编写(工作)漏洞的细节。
newgre 2012年

6
@newgre并非每个漏洞都是缓冲区溢出。通用弱点枚举系统涵盖了数千个漏洞。程序员需要了解攻击者的思想,否则他将不知道会犯错误。
菜鸟2012年

1
我知道并不是每个缓冲区溢出都是缓冲区溢出,但是通常被称为“漏洞利用”的任何事物都是基于某种内存损坏的:缓冲区溢出,双释放,堆溢出,与整数相关的溢出,格式字符串,等等。当然还有其他一些东西,例如逻辑错误,但这并不是开始时要回答的主题。
newgre 2012年

5
@newgre这是一种利用类型,但是如今,利用更多应用程序利用Web应用程序缺陷而不是内存破坏问题。利用SQL注入,本地文件包含,CSRF和XSS编写漏洞利用程序,这是常见的问题。(资料来源:exploit-db.com
菜鸟

1
我同意这一点,如果您自己可以编写漏洞利用程序,则可以理解黑客最大的想法!
linuxeasy 2012年


23

我建议复习CWE / SANS TOP 25最危险的编程错误。它在2010年进行了更新,并承诺将来会进行定期更新。在2009年修订版可用。

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

2010年CWE / SANS排名前25位的最危险编程错误是最广泛和最严重的编程错误的列表,这些错误可能导致严重的软件漏洞。它们通常很容易找到,也很容易被利用。它们之所以危险,是因为它们经常使攻击者能够完全接管该软件,窃取数据或完全阻止该软件运行。

排名前25位的清单是一种教育和意识工具,可通过识别和避免在软件出厂前就已发生的非常常见的错误来帮助程序员防止困扰软件行业的各种漏洞。软件客户可以使用相同的列表来帮助他们要求更安全的软件。软件安全性研究人员可以使用前25名来关注所有已知安全性缺陷的狭窄但重要的子集。最后,软件经理和CIO可以使用“前25名”清单来衡量他们保护软件的进度。


1
请注意,该列表上的前4个错误(以及许多其他错误)都是相同的错误-信任输入。
克里斯·多德



8

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

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

5

您应该了解三个A。认证,授权,审计。经典错误是对用户进行身份验证,而不检查用户是否有权执行某些操作,因此用户可以查看其他用户的私人照片,而Diaspora所做的错误。越来越多的人忘记了审核,您需要在一个安全的系统中才能知道谁在何时何地执行了操作。


1
并非所有授权都需要身份验证。 “从ABAC到ZBAC”将NBAC(基于身份验证)访问控制与不需要身份验证的解决方案进行了对比。“ IBAC,RBAC,ABAC甚至CBAC –基于声明的访问控制都依赖于身份验证...为了简单起见,本文将它们视为单个解决方案,而忽略了那些已实现ZBAC体系结构方面的版本。它们统称为autheNtication基于访问控制(NBAC)。”
Mike Samuel

4
  • 请记住,您(程序员)必须保护所有零件,但攻击者只需成功找到盔甲中的一个纽扣即可。
  • 安全性是“未知未知数”的一个示例。有时,您可能不知道潜在的安全漏洞是什么(直到之后)。
  • 错误和安全漏洞之间的区别取决于攻击者的情报。

4

我将添加以下内容:

  • 数字签名和数字证书如何工作
  • 什么是沙箱

了解不同的攻击媒介如何工作:

  • 本地代码上的缓冲区溢出/下溢/等
  • 社会工程
  • DNS欺骗
  • 中间人
  • CSRF / XSS等
  • SQL注入
  • 加密攻击(例如:利用弱加密算法,例如DES)
  • 程序/框架错误(例如:github的最新安全漏洞)

您可以轻松地用Google搜索所有这些内容。这将为您奠定良好的基础。如果您想查看Web应用程序的漏洞,可以使用一个名为google gruyere的项目,该项目向您展示如何利用有效的Web应用程序。


4

当您建立任何企业或任何自己的软件时,您应该像黑客一样思考。众所周知,黑客也不是所有事物的专家,但是当他们发现任何漏洞时,他们便会通过收集有关所有信息的方式来深入研究它。这些东西并最终攻击我们的软件。为防止此类攻击,我们应遵循一些众所周知的规则,例如:

  • 始终尝试破坏您的代码(使用备忘单和Google事物查找更多信息)。
  • 针对您的编程领域中的安全漏洞进行更新。
  • 并且如上所述,从不信任任何类型的用户或自动输入。
  • 使用开源应用程序(已知和解决了大多数安全漏洞)。

您可以在以下链接上找到更多安全资源:

有关Google的更多信息,请参见有关应用程序供应商安全流程的信息。


3
  1. 为什么重要。
  2. 这都是关于权衡的。
  3. 密码学很大程度上分散了安全性。


3

另外,请务必查看OWASP十大列表,以了解所有主要攻击媒介/漏洞的分类。

这些东西令人着迷。学会像攻击者一样思考,将训练您编写自己的代码时所要考虑的事情。


2

盐化并哈希用户密码。切勿将它们以纯文本格式保存在数据库中。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.