学生应该在编程入门课程中学习什么安全知识?

信息安全 职业教育
2021-09-09 04:38:30

有些人主张在整个课程中将安全性整合到计算机科学课程中。假设我们要在关于编程的第一门课程中添加一个关于安全性的讲座。(请记住,这是一门非常基础的入门课程,因此不适合使用高级主题。)在这种情况下,学生应该了解哪些最重要的安全知识?

4个回答

安全教育应该是情境化的。在研究红黑树或归并排序时,关于安全性没有太多可说的。但是,作为学生所做的一切事情的一部分,安全应该是一个持续且普遍的因素。

当然,任何与安全相关的项目都应被要求;例如,边界检查和输入清理应该在所有分配中都是绝对需要的。如果考官可以通过提供无效输入来破坏作业申请,则应扣分。如果没有正确检查数组边界(假设像 C 这样的不安全语言),则指出。仅仅让事物通过指定的测试用例是不够的,它还必须写得足够好,在现实世界的场景中它不会造成灾难。

学生需要习惯于总是担心稳定性和安全性,就像化学学生总是应该担心实验室安全一样。安全性不是你学习一个学期然后继续学习的东西。

如果您要在开始时进行一次关于安全的讲座,那么它应该主要涵盖学生将面临的与安全相关的期望。这些期望应该是现实世界对编码实践的期望,并且应该反映对优秀程序员始终保持警惕的那种警惕性。

这分为几个主要领域,并非所有领域都适用于每种语言和每种编程环境,这里有一些我想到的:

  • 语言安全:对于 C/C++ 来说非常重要,对于其他大多数事情来说都不是那么重要。指针、缓冲区和诸如此类的东西都属于这一类。

  • 输入消毒:巨大。绝对巨大。我想不出一个不适用的领域。

  • 代码清晰和文档:比听起来更有价值。许多安全漏洞来自简单的错误,这些错误源于对代码本身的误解。即使在安全方面,您犯的错误越少越好。

    另外,我会在这种组合中加入诸如“DRY”之类的原则,因为安全漏洞有时是代码中假设不同步的结果。您指定单个值的位置越多,您就越有可能忘记更改其中一个,这可能会导致安全漏洞。我记得在学习 CS 时有一条“没有魔法数字”的作业规则,其中所有数字常量都必须指定一个名称。这是一个很好的政策,有很多原因。

  • 特权隔离:有点深奥,但在某些情况下很重要。最小特权原则是学生至少需要熟悉的东西,例如但是很难参与到您的日常活动中。

  • 特定于安全的项目:例如密码存储、加密和类似的东西。这比直接适用于学校作业更具信息性,因此我不确定它在课程安排方面的适用性。

    从更抽象的意义上了解诸如 CSRF 和令牌窃取攻击之类的攻击很重要,但可能不是在入门课程中,因为它有点高级。

如果这只是一个讲座并且这是他们的第一堂编程课,我认为输入验证是最可行的话题。您的一些学生已经在努力理解 x = x + 1(x 等于 x + 1)时 x = 1 就在前一行......直到他们意识到这是一个赋值语句。

加密、ssl、sql注入等主题需要在有相关项目的课程中整合,以便实际应用。

然而,输入验证是他们将在其工程职业生涯的其余部分随身携带的东西。这将帮助他们减少代码易受缓冲区溢出、XSS 和(可能)sql 注入影响的可能性。

我是大学生,我有这样的课程,首先他们应该教如何在编码中不犯错误,比如防止 SQL 注入,或者教如何建立自己的 SSL 连接和授权,还有一点关于密码学的知识,我大约有 7 节课,所有主题都得到了很好的解释......(我的意思是这些主题不仅仅是基础......)现在我认为应该有一个关于如何防止 sql 注入的课程,以及一些东西关于名为 PARI 的程序之类的密码学...,这些应该是基本的

无论在教育中使用哪种语言,都有许多原则是正确的,所以我要从这里窃取它们Security Ninja

  1. 输入验证 - 始终检查来自不受信任来源的输入
  2. 输出验证 - 确保您的输出适合目的地(例如转义 HTML 字符...)
  3. 错误处理——不要向攻击者泄露太多信息
  4. 身份验证和授权 - 知道如何正确执行此操作
  5. 会话管理
  6. 安全通信
  7. 安全资源管理
  8. 安全存储

学习并应用这些原则,之后开发的任何软件都将具有更好的质量。