向亲人传授安全编码实践

信息安全 代码审查 用户教育 编程
2021-08-31 20:13:54

这可能过于狭窄,但对于 ITSec 专业人士来说,这是一个独特的问题。一个心爱的人刚刚开始新的编程生涯,我很高兴看到她从头开始学习最基本的编程概念。她在每门大学课程中都名列前茅,工作质量很高,而且她吸引了如此多的关注,以至于她已经获得了合同工作。

作为 ITSec 专业人士,我们谈论在开发周期中注入安全编码实践和设计,但这如何适用于全新的学习者?一个新的程序员正处于他们自己的“终身开发周期”的开始。从教育的角度来看,在什么时候从“让它工作”的心态转变为“它绝对必须是安全的”是合适的?由于安全问题,学生应该在什么时候“失败”作业?

她完全理解生成安全代码的必要性,并且想要这样做,但她的课程都没有介绍过这个想法,并不断来找我进行代码审查和分析。什么时候应该进行切换以迫使她重新设计所有课堂作业以使用安全设计?

我不想通过引入令人沮丧的要求来缩短有前途的职业生涯,但我也想给新的职业生涯一个最好的开始。此外,是否有资源可以帮助我从初级程序员的角度教她安全编码的基础知识?我发现我边走边编...

我欢迎你的建议。

  • 从教育的角度来看,在什么时候从“让它工作”的心态转变为“它绝对必须是安全的”是合适的?
  • 由于安全问题,学生应该在什么时候“失败”作业?
  • 什么时候应该进行切换以迫使她重新设计所有课堂作业以使用安全设计?
  • 是否有资源可以帮助我从初级程序员的角度教她安全编码的基础知识?

作为旁注:我注意到通过提高我对她的课堂作业的代码审查的标准,仅就基本的“验证和清理”安全性而言,她最终生成了非常高质量的代码。从这个例子中,我想我可以看到以这种方式开始教育的价值,因为它迫使人们对数据流和编程逻辑有更深入的理解。

4个回答

我想说一个很好的学习方法是让她打破她已经写好的应用程序。

假设她正在编写 Web 应用程序,请将她指向 OWASP 前 10 名。让她看看她是否可以在自己的代码中找到任何这些缺陷。没有比实际看到它发生在您自己的代码上更好的方法来了解安全概念。

一旦发现缺陷,让她重写应用程序以修复缺陷。这样做将使她能够欣赏诸如卫生和验证用户输入和参数化查询之类的效果。

采取渐进的步骤。在真正了解什么类型的代码会导致安全漏洞之前,我不会直接跳入设计具有安全性的新应用程序。

我将采取可能让我燃烧的立场...

我看到的问题是,安全编程是作为附加内容教授的。应从一开始就教授最佳实践(包括安全性)。人们被教导的谎言是熟能生巧。事实是实践使之永久化。所以,如果你做错了,你就必须忘记你所学的。那是一种低调的方法。

我会说应该从第一天开始教授安全编码实践。没有理由学习如何去做,然后学习如何安全地去做。这是浪费时间和金钱...

我要说的还有 2 位、1 和零……

虽然我原则上同意埃弗雷特,但还有另一种观点。课程的重点是学习一个概念,然后可以进一步建立。这减少了学习曲线的斜率。教得太多太快是压倒性的;当面对信息的猛烈冲击时,大多数大脑都会“泄漏”。

说“应该从第一天开始教授安全编码实践”真是太好了,但很难证明第一天的“Hello World”程序可能是易受攻击的,尤其是当“什么是计算机程序”是一个新概念时班级。一个涉及共享数据存储的网站项目(我至少在大学中途才真正看到)更容易显示出弱点,但这些弱点通常是建立一个基本的概念验证网络环境所固有的“默认设置。当漏洞已知时,很容易证明应用程序存在漏洞。证明不存在更难(实际上是不可能的)。

我认为与OP类似;在程序员发展的某个阶段,“某人如何使用此代码做您不希望他们做的事情,以及您如何防止它”的想法可以合并到您正在做的事情中。这个起点可能是在开始学习外部通信或持久性(读取/写入数据到硬盘或数据库,或通过网络通道发送数据)或面向对象的原则(继承、重载/覆盖、等),以先到者为准。这是编码人员可以开始编写有能力在坏人手中造成损害的程序的地方,因此应注意确保坏人不能滥用程序。

有些概念很容易掌握;“我的程序使用对其用户保密的数据;我信任它,并且必须确保只允许那些应该看到数据的人”。有些更难;我看到有人真正震惊地发现程序二进制文件可以被反编译和读取以发现硬编码的凭据或密钥(并且像 .NET 这样的一些环境将足够的元数据放入二进制文件中以生成几乎完全相同的源代码用于构建他们),或者他们的组装二进制文件可以被攻击者以编译形式搭载,该攻击者使用公共的非密封类或成员插入,然后可以访问这些类使用的任何秘密。这些是应该说明的基本问题,然后应该说明解决方案,并说明它们的工作方式和原因。

就像真实教育的其他方面(也许这应该更多地放在 Parenting.SE 上......),我认为它回到了批判性思维

我女儿也在学习一些大学计算机科学课程,我正在帮助她完成这些课程。但是,我不会向她灌输信息,她需要为此努力。
在很多情况下,我向她解释了一些非常错误的事情,并希望她给我打电话。(她通常会这样做)。有时,它只是微妙的错误,然后她就更难注意到了。有时她不会马上注意到它,而是根据错误的假设开始构建一些东西——然后她必须向后工作以找出问题所在。(她也在这方面做得更好。)

通过这种方式,我强迫她习惯于质疑假设。
诚然,她对我的方法并不感到兴奋。

同样,我要求她找出任何可能误用她的代码的方式,无论是意外还是恶意。我向她解释说,她拥有她的代码,并对她的代码所做的事情负责,这里没有被动的余地。其中一部分是适当的异常处理,她的导师希望他们无论如何都要做,即使直到很晚的课程才真正进入。

现在,当然,我反对所有形式的“货物崇拜编程”教学——除非明确指出,以使基本概念能够被教授,但需要注意的是,这不是全部,我们将回到这个以后。(比如上面的异常处理)。

我的观点是,“安全编程”与“编程”没有什么不同
然而,就像整本编程书不能一口气教完,而是逐渐引入概念——编程概念的“安全”方面可以等待,而基本概念被教授和理解,明确的请注意“我们还没有在这里完成”。也期望至少更好的学生会找出一些不安全的方面。

TL;博士

  1. 一个新的编程概念需要逐步学习,某些方面(包括安全性)可以比其他方面晚一些;
  2. 在所有方面都被学习和理解之前,所述编程概念是不完整的,包括安全方面(在此之前应该注意);
  3. 程序员对自己的代码有完全的控制权,要成为一名程序员,就需要知道自己的代码是如何被滥用的;
  4. 练习批判性思维的学生应该尽早自己解决这个问题(不一定是所有的安全性,但缺少上下文,以及代码滥用的很大一部分);
  5. 练习批判性思维的学生不应该真正学习编程......