我读过有关 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 的正则表达式根本不使用回溯,所以这根本不可能。根据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/