理解不同编程语言类型安全的需求

本文涉及的产品
函数计算FC,每月15万CU 3个月
应用实时监控服务-可观测链路OpenTelemetry版,每月50GB免费额度
可观测监控 Prometheus 版,每月50GB免费额度
简介: 【7月更文挑战第12天】本文介绍编程语言类型系统与语言设计密不可分,影响编程习惯和语言安全。微服务架构允许跨语言技术栈,每个服务都能用最适合的平台构建,强调代码质量原则,以实现高效解决方案。

1 简介

编程安全关乎内存、类型和线程安全。静态类型如ML用类型推理减少注释,而C家族语言较冗长。
不同类型系统适应不同安全需求,如HIPAA和PCI合规。

内存安全防止CVE,类型安全确保数据正确处理,线程安全避免多线程冲突。设计良好的静态类型语言可通过类型推理减轻程序员负担。
在多语言环境中,每个服务可根据需求选择最适合的安全策略。

在静态语言中的静态类型如ML利用类型推理减少注释,而C家族更显冗长。不同语言满足不同安全需求,如HIPAA和PCI合规。

更广泛的安全定义为:

 编程安全 = 内存安全 + 类型安全 + 线程安全

安全问题可以分类为如下几个

编程安全

内存安全
类型安全
线程安全

本文也举例说明为什么这很重要?

内存安全问题
类型安全问题
线程安全问题

2 类型系统和语言设计

记住将类型系统改造成未设计类型检查的语言可能很棘手;理想情况下,语言设计应该与类型系统一起设计。

---Alf (Magnusson and Nordström, 1994) 直接基于类型论。Constable (1998) 和 Pfenning (1999) 讨论了这些系统的历史。

数据库社区对类型系统的兴趣也在增加,随着以文档类型定义(XML 1998)和其他类型的模式(例如新的 XML-Schema标准 [XS 2000]) 用于描述 XML 中的结构化数据。

新语言查询和操作 XML 提供了强大的基于静态类型系统直接针对这些模式语言

---(Hosoya 和 Pierce,2000;Hosoya、Vouil lon 和 Pierce,2001;Hosoya 和 Pierce,2001;Relax,2000;Shields,2001)。

类型系统的一个完全不同的应用出现在计算语言学领域,其中类型化的 lambda 演算构成了形式主义的基础例如分类语法

---(van Benthem,1995;van Benthem 和 Meulen,1997;兰塔,1995;等等。)。

造成这种情况的一个原因是,没有类型系统的语言——即使是安全的、动态检查的语言——往往会提供使类型检查变得困难或不可行的特性或鼓励编程习惯用法。

确实,在键入语言类型系统本身通常被视为设计和组织原则的基础,根据它的其他方面设计被考虑。

另一个因素是类型语言的具体语法往往是比无类型语言更复杂,因为类型注释必须考虑在内。做好清洁设计工作更容易当所有问题都可以一起解决时,语法可以理解。

类型应该是编程语言的一个组成部分的断言与程序员必须在哪里物理写下类型注释以及它们可以在哪里推断的问题是分开的由编译器。

设计良好的静态类型语言永远不需要由程序员显式且繁琐地维护大量类型信息。但是,对于多少有一些分歧显式类型信息太多。

ML 中的语言设计者努力将注释保持在最低限度,使用类型推理方法来恢复必要的信息。 C语言家族,包括 Java,都选择了更加冗长的风格。

3 内存安全,类型安全和线程安全:不同语言的不同要求

每个语言和应用程序在安全性方面都有不同的要求。
例如,与医疗保健相关的应用程序可能需要 HIPAA 合规性,或者金融应用程序可能需要 PCI 合规性。
在选择正确的堆栈时,我们还考虑了更一般的安全建议,例如 OWASP Top 10。
密切关注所选堆栈的安全公告将有助于应用程序更加健壮。

  • 内存安全

在内存安全语言中,当您访问数组中的变量或项时,您可以确定您确实正在访问您想要访问的内容或被允许访问的内容。换句话说,无论您在程序中执行什么操作,您都不会错误地读取或写入另一个变量或指针的内存

内存安全问题
内存安全问题是我们遇到的大多数安全 CVE(常见漏洞和暴露,在Microsoft的视窗系统70%的CVE为内存安全问题)的原因。

黑客可能会滥用未定义的行为来控制程序或泄露特权信息。如果您尝试使用内存安全语言访问越界数组元素,您只会因崩溃或错误而崩溃,这是可预测的行为。

这就是为什么 C/C++ 系统中与内存相关的错误通常会导致 CVE 和紧急补丁的原因。C/C++ 中还有其他内存不安全的行为,例如从已弹出的堆栈帧访问指针、已取消分配的内存、迭代器失效等。内存安全语言,即使不是最安全的语言,仍然可以防止此类安全问题。

  • 类型安全

在类型安全语言中,当您访问变量时,您可以根据变量的存储方式将其作为正确的数据类型进行访问。这让我们有信心处理数据,而无需在运行时手动检查数据类型。内存安全是语言类型安全的必要条件。

类型安全问题
虽然不像内存和线程安全那么重要,但缺乏类型安全也会导致安全问题,而类型安全对于确保内存安全非常重要。

在类型不安全的语言中,低级别攻击是可能的,因为攻击者可以操纵数据结构并更改数据类型以获取对特权信息的访问权限。虽然这种类型的漏洞非常罕见,但并非闻所未闻。

  • 线程安全
    在线程安全语言中,您可以同时从多个线程访问或修改相同的内存,而不必担心数据争用。
    这通常是使用消息传递技术、互斥锁(互斥锁)和线程同步来实现的。
    线程安全是最佳内存和类型安全所必需的,因此通常,内存和类型安全语言也倾向于线程安全。

线程安全问题

虽然不像内存安全那样臭名昭著,但线程安全也是开发人员头疼的一个原因,并可能导致安全问题。

线程安全问题可能导致两种类型的漏洞:

一个线程覆盖另一个线程的信息导致的信息丢失
允许权限提升或远程执行的指针损坏
由于来自多个线程的信息交错而导致的完整性损失
这种类型的最著名的攻击称为 TOCTOU(检查时间到使用时间)攻击,它是检查条件(如安全凭证)和使用结果之间的竞争条件。

信息丢失和完整性丢失都可能被利用并导致安全问题。虽然与线程安全相关的漏洞比内存安全漏洞更难且不那么常见,但它们仍然是可能的。

4 小结

需要注意的是,在后单体软件世界中,技术决策在应用程序生态系统中并不相互排斥。
我们越来越多地实现微服务架构,因此我们可以运行基于不同编程语言和框架构建的单个服务。

通过这种方式,我们可以确保每个特定任务都由最佳平台提供服务。
凭借我们广泛的经验和专业知识,并坚持良好代码的标志 - 可维护性,简单性,YAGNI,干燥,固体和可测试性 - 我们能够始终如一地指导我们的客户找到最有效的技术解决方案。

目录
相关文章
|
开发者
氚云丨开发课— 05 后端代码调试与业务对象操作| 学习笔记
快速学习氚云丨开发课— 05 后端代码调试与业务对象操作。
|
11月前
|
安全 编译器 程序员
了解编程语言的安全
【7月更文挑战第11天】本文介绍编程语言中的类型的安全与效率:安全不仅关乎防止错误,也影响性能和可预测性。
146 0
了解编程语言的安全
|
8月前
|
安全 Android开发 数据安全/隐私保护
探索安卓与iOS的安全性差异:一场永无止境的较量
【10月更文挑战第3天】 本文旨在深入剖析安卓 (Android) 和iOS两大移动操作系统在安全性方面的显著差异,通过细致对比,揭示它们在隐私保护、数据加密、应用生态监管以及系统更新机制等关键领域的不同策略与实践。文章不仅从技术层面探讨了两者的设计理念差异,还结合了实际案例分析,展示了这些差异如何影响用户体验和数据安全。最终,旨在为读者提供一个全面的视角,理解在日益复杂的数字环境中,选择何种移动平台可能更符合其对安全性和隐私保护的需求。
|
消息中间件
RabbitMQ之死信队列
【1月更文挑战第10天】先从概念解释上搞清楚这个定义,死信,顾名思义就是无法被消费的消息,字面意思可以这样理解,一般来说,producer 将消息投递到 broker 或者直接到 queue 里了,consumer 从 queue 取出消息进行消费,但某些时候由于特定的原因导致 queue 中的某些消息无法被消费,这样的消息如果没有后续的处理,就变成了死信,有死信自然就有了死信队列。 应用场景:为了保证订单业务的消息数据不丢失,需要使用到 RabbitMQ 的死信队列机制,当消息消费发生异常时,将消息投入死信队列中.还有比如说: 用户在商城下单成功并点击去支付后在指定时间未支付时自动失效。
603 61
|
12月前
|
数据安全/隐私保护
【洛谷 P1928】外星密码 题解(递归+字符串)
外星密码挑战涉及解压缩由重复子串压缩的字符串,如`[3FUN]`代表`FUNFUNFUN`。输入是一行压缩过的字符串,输出是解压缩的结果。代码使用递归方法,遇到`[`读取重复次数并解压下一层,遇到`]`返回当前层结果,否则直接添加字符。样例输入`AC[3FUN]`输出`ACFUNFUNFUN`。处理的数据限制为解压后长度在20000内,最多十重压缩。
204 0
|
7月前
|
供应链 搜索推荐 API
探讨拼多多商品 API 接口:运用及收益
拼多多商品API接口为开发者和企业提供了一站式的商品数据交互解决方案,涵盖商品详情、价格、库存、评价等多元信息,助力电商平台拓展、数据分析、个性化推荐及营销推广,有效提升商业价值和用户体验,推动电商领域的创新与发展。
691 0
|
8月前
搭建一个普通的网站需要多少费用?
用户如果需要搭建一个普通的网站大概需要多少钱?网站搭建费用一般分为域名、服务器/虚拟主机、网站制作、设计和维护费用。费用在1000-3000是比较常见的,建站主要以PageAdmin CMS系统为主。
1017 2
|
8月前
|
数据可视化 关系型数据库 MySQL
【IDEA】配置mysql环境并创建mysql数据库
【IDEA】配置mysql环境并创建mysql数据库
1324 0
|
前端开发 JavaScript API
Vue.Draggable 和 React Beautiful DND 有什么区别
Vue.Draggable 和 React Beautiful DND 是两个用于 Vue.js 和 React 的拖拽排序库。Vue.Draggable 提供 Vue 指令,适合 Vue 应用,支持列表排序和自定义数据处理,具有多种事件回调和配置选项。React Beautiful DND 则为 React 提供组件,能处理复杂拖拽场景,通过回调函数更新状态,配置选项包括限制拖拽范围和自定义动画。