有邪恶的球吗?

时间:2016-07-15 10:05:43

标签: regex security go glob

我已经阅读过Evil RegExp,并且在处理有关RegExp的用户输入时,通常会确保基本的安全级别。

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

我很感激有任何关于如何测试此问题的建议以及如何减轻它的可能性。

1 个答案:

答案 0 :(得分:1)

邪恶的正则表达式"我认为你的意思是正则表达式会成为灾难性回溯的牺牲品。

根据您的描述,您似乎正在使用glob库来避免这些"邪恶的正则表达式"。 Globs本质上是一种较弱的正则表达式。

你在这里失踪的事实是,正则表达不是邪恶的。这可以在普通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并没有在所有中使用回溯作为其正则表达式,因此它甚至都不可能。根据{{​​3}}:

  

在Go中,我们找到了一个优化的正则表达式引擎。这在线性时间内运行,使复杂模式更快。它位于regexp包中。

详细了解回溯引擎和非回溯引擎之间的差异this site

考虑到glob库(根据GitHub链接)看起来比Go的regexp更快,性能不应该是一个问题。