Ruby 3.2.0 RC 1 发布,引入针对 ReDoS 的正则表达式改进


Ruby 3.2.0 RC 1 发布了,3.2.0 预览版引入基于 WASI 的 WebAssembly 支持和正则表达式超时退出机制3.2.0 RC 1 则引入两项可显著缓解 ReDoS 攻击的改进,以及一些语言功能和性能改进。

改进的正则表达式匹配算法

从 Ruby 3.2 开始,Regexp 的匹配算法通过使用记忆技术得到了极大的改进。

# This match takes 10 sec. in Ruby 3.1, and 0.003 sec. in Ruby 3.2 /^a*b?a*$/ =~ "a" * 50000 + "x"

改进后的匹配算法使得大多数 Regexp 匹配(实验中大约为 90%)在线性时间内完成。

对于 3.2.0 预览版本的用户:此优化可能会消耗与每个匹配的输入长度成比例的内存。预计不会出现实际问题,因为此内存分配通常会延迟,并且正常的 Regexp 匹配最多应消耗 10 倍的内存输入长度。

该功能最初的提议是 https://bugs.ruby-lang.org/issues/19104

其他值得注意的新功能

语法建议

  • syntax_suggest(以前的 dead_end)的功能已集成到 Ruby 中,可以帮助找到错误的位置,例如丢失或多余的 end 。
Unmatched `end', missing keyword (`do', `def`, `if`, etc.) ?

1class Dog
> 2defbark
> 4end
5end

[Feature #18159

错误高亮

  • 现在它指向 TypeError 和 ArgumentError 的相关参数
test.rb:2:in `+': nil can't be coerced into Integer (TypeError)

sum = ary[0] + ary[1]
 ^^^^^^

语言

  • 匿名 rest 和关键字 rest 参数可以作为参数传递,而不仅仅是在方法参数中使用。
def foo(*)
bar(*)
end
def baz(**)
quux(**)
end

[Feature #18351]

 

更多性能改进和细节变化可在发布公告中查阅。

 

回顾一下 3.2.0  预览版中引入的功能:

基于 WASI 的 WebAssembly 支持

这是基于 WASI 的 WebAssembly 支持的初始移植。此项特性使得 CRuby 二进制文件可在 Web 浏览器、Serverless Edge 环境和其他 WebAssembly/WASI 嵌入器上使用。目前,此移植可在不使用 Thread API 的前提下通过基本和引导测试套件的测试。

正则表达式超时退出机制

此版本引入了正则表达式超时退出机制。

Regexp.timeout = 1.0

/^a*b?a*$/ =~ "a" * 50000 + "x"
#=> Regexp::TimeoutError is raised in one second

由于正则表达式匹配会耗费不少时间,当代码试图向不受信任的输入匹配低效的正则表达式时,攻击者可能会利用它进行 DoS 攻击(即正则表达式 DoS,或称作 ReDoS)。

Regexp.timeout 根据 Ruby 应用程序的要求进行配置,可以防止或显着降低 DoS 的风险。请注意,Regexp.timeout 是全局配置项,如果希望对某些特殊的正则表达式使用不同的超时设置,需要使用 timeout 关键字 Regexp.new

Regexp.timeout = 1.0

# This regexp has no timeout
long_time_re = Regexp.new("^a*b?a*$", timeout: nil)

long_time_re =~ "a" * 50000 + "x" # never interrupted

此项特性的最初提案:https://bugs.ruby-lang.org/issues/17837

 


相關推薦

2022-12-26

)。 默认--yjit-call-threshold更改为 30。 针对 ReDoS 的正则表达式改进 由于正则表达式匹配会耗费不少时间,当代码试图向不受信任的输入匹配低效的正则表达式时,攻击者可能会利用它进行 DoS 攻击(即正则表达式 DoS,或称作

2023-01-11

项中使用 interpreter=1 ,从源代码编译。 带有 PCRE2 的正则表达式 #12790  Crystal 依赖 libpcre 作为在 Regex 中执行正则表达式的引擎,1.7.0 版本添加了对其后续版本 libpcre2 的支持。使用上没有重大差异,PCRE2 大部分是向后兼容

2022-10-23

ditor 的设置视图 将位置和列数改为从零开始 如果正则表达式模式无效,在模式排序对话框中显示错误信息 改进编码检测的算法 改进 VoiceOver 支持 取消在状态栏中隐藏文件大小的选项 删除文档检查器中的文本长度显示

2022-08-10

PEP 681  - Data Class 转换 bpo-433030 – 正则表达式现在支持原子分组 (Atomic grouping):((?>...)),以及占有型量词 (*+, ++, ?+, {m,n}+)  Faster Cpython Project 已经出现了一些令人振奋的结果:Python 3.11 比 Python 3.10

2022-07-28

PEP 681  - Data Class 转换 bpo-433030 – 正则表达式现在支持原子分组 (Atomic grouping):((?>...)),以及占有型量词 (*+, ++, ?+, {m,n}+)  Faster Cpython Project 已经出现了一些令人振奋的结果:Python 3.11 比 Python 3.10

2022-09-14

PEP 681  - Data Class 转换 bpo-433030 – 正则表达式现在支持原子分组 (Atomic grouping):((?>...)),以及占有型量词 (*+, ++, ?+, {m,n}+)  Faster Cpython Project 已经出现了一些令人振奋的结果:Python 3.11 比 Python 3.10

2023-04-16

决。  Crystal 1.8.0 已发布,此版本的一些修改: 正则表达式:PCRE2 此版本中一个重大且必要的更改是 PCRE2 成为 Regex ( #12978 ) 的默认引擎。 1.7 中添加了对 PCRE2 的支持,并在 1.7.3 中稳定下来。我们认为默认使用它是安全的。

2023-09-05

以将向量功能与各种 PostgreSQL 提供的功能组合使用:使用表达式索引只索引一部分感兴趣的内容,实时查看索引创建进度,不阻塞读写请求在线创建/重建索引,使用多个进程并发创建索引。 当然,也可以将 Vector 模糊搜索 / 语

2022-12-24

写方向选项未被应用的问题。 修正在特定条件下,正则表达式模式被错误地突出显示的问题。 修正在文档为空时,不执行正则表达式查找/替换的问题。 修正当重复点击按钮时,查找面板中的高级选项视图可能显示多次的

2022-07-06

的命令滚动编辑器,使移动线可见 改变文本搜索的正则表达式中元字符 \v 的行为,以确认当前的 ICU 规范。 更新 Swift 语法样式,增加关键词 修复 修复关闭文档时内存泄漏的问题 更多详情可查看:https://github

2022-06-02

引入 asyncio PEP 681  - Data Class 转换 bpo-433030 – 正则表达式现在支持原子分组(Atomic grouping):((?>...)),以及占有型量词 (*+, ++, ?+, {m,n}+)  Faster Cpython Project 已经出现了一些令人振奋的结果:Python 3.11 比 Python 3.10 快 10%~60% P

2022-07-13

PEP 681  - Data Class 转换 bpo-433030 – 正则表达式现在支持原子分组 (Atomic grouping):((?>...)),以及占有型量词 (*+, ++, ?+, {m,n}+)  Faster Cpython Project 已经出现了一些令人振奋的结果:Python 3.11 比 Python 3.10

2023-04-09

开发者现在可以用非标准库包运行 Scratch 文件,使用正则表达式来创建你自己的搜索和替换检查,并快速地将原始字符串文字转换成双引号文字等。 漏洞检查器 GoLand 现在可以突出显示 go.mod 中存在已知漏洞的软件包 有一

2023-02-18

型和文件名 支持在 Shell 中打开外部编辑器以编辑当前表达式 支持在 Shell 中定义(包含类型)的记录、函数、规范和类型 采用新的终端     该版本重写了 TTY/终端子系统。Windows 用户会注意到erl.exe具有与普