regex - 有邪恶的球体吗?

标签 regex security go glob

我读过有关 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/

相关文章:

python - 这个 HTTP 请求有效吗?

javascript - 负面展望中的字符串被部分捕获

regex - Google Analytics 正则表达式包含和排除字符串而没有负面前瞻

java - 如何使用java正则表达式来匹配一行

java - 阻止java桌面应用程序的分发

flash - 将 flash crossdomain.xml 设置为仅允许 SSL 连接?

python - 使用python正则表达式解析文本文件中的相关行组

windows - 如何调用 LogonUser() 以在启用 UAC 的 Windows 服务中获取不受限制的完整 token ?

string - slice 起始位置大于字符串的长度

go - 如何在 GO 中访问另一个文件