gpt4 book ai didi

regex - 有邪恶的球体吗?

转载 作者:IT王子 更新时间:2023-10-29 02:13:41 26 4
gpt4 key购买 nike

我读过有关 Evil RegExp 的资料,并且在处理与 RegExp 相关的用户输入时通常会确保基本的安全级别到位。

我不确定这个问题是否也存在于 Glob 中。我想这将归结为 Glob'ing' 的各个实现,在我的特定实例中,我正在使用 https://github.com/gobwas/glob/

对于如何测试此问题以及可能如何缓解此问题的任何建议,我将不胜感激。

最佳答案

我认为“邪恶的正则表达式”是指成为灾难性回溯受害者的正则表达式。

根据您的描述,您似乎正在使用 glob 库来避免这些“邪恶的正则表达式”。 Glob 本质上是正则表达式的弱化版本。

您在这里遗漏的事实是正则表达式不一定是邪恶的。这可以在没有外部库的普通 Go 中证明。

尝试运行这个 Go 程序:

package main

import (
"fmt"; "regexp"
)

func main() {
reg := regexp.MustCompile(`^([^z]*?,){11}P`)

txt := `1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18zP`

fmt.Println(reg.ReplaceAllString(txt, ""))
}

您可能想知道为什么这段代码不测量执行所花费的时间。因为不需要(也因为我对 Go 了解不多)。

正则表达式几乎适用于所有正则表达式风格。您可以尝试在 Java、Perl 或其他类似风格中运行它(我喜欢在 https://regex101.com/#pcre 上使用 PCRE),但结果将是以下两种情况之一:

  • 超时
  • 你受够了它花了多长时间并停止了程序

是的,这种组合会在大多数正则表达式中导致灾难性的回溯。但是不是 Go。为什么?

Go 的正则表达式根本不使用回溯,所以它甚至是不可能的。根据this site :

In Go, we find an optimized regular expression engine. This runs in linear time, making complex patterns faster. It is located in the regexp package.

阅读更多关于回溯和非回溯引擎之间差异的信息 here .


考虑到 glob 库(根据 GitHub 链接)似乎比 Go 的正则表达式更快,性能应该不是问题。

关于regex - 有邪恶的球体吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38393367/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com