2016-07-15 6 views
1

私はEvil RegExpについて読んだことがあります。通常、RegExpに関してユーザーの入力を処理する際の基本的な安全性が確保されていることを確認します。邪悪なグロブはありますか?

私はこの問題がGlobにも存在するかどうかは不明です。私はそれがGlob'ingの個々の実装に来ると思います。私が使用している特定のインスタンスでhttps://github.com/gobwas/glob/

+0

グロブのサイズを制限してください。 – Bergi

+0

FYI「悪い正規表現」は、無限に再帰的なバックトラックを引き起こす可能性のあるものを意味する場合、あなたはそれを心配する気にはなりません。標準ライブラリのregexpパッケージは、正規表現を有限状態オートマトンで正しく実装しているので、バックトラックする必要はありません(おそらく実際には必要ない機能をサポートしていないという代償を払って)。詳細については、https:// swtchを参照してください。 –

答えて

1

"悪い正規表現"とは、あなたは惨事の後戻りに遭う正規表現を意味します。

あなたが説明していることから、これらの「邪悪な正規表現」を避けるためにグロブライブラリを使用しているようです。 Globは本質的に正規表現の弱いバージョンです。

あなたがここで紛失していることは、正規表現が邪悪である必要はないという事実です。これは外部のライブラリを持たない単純な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, "")) 
} 

このコードは、時間の実行がかかったどのくらい測定していない理由を不思議に思うかもしれません。それは必要ではないからです(そして私も多くのことを知らないからです)。

正規表現はほぼすべての正規表現のフレーバーで動作します。あなたはのJava、Perlや他の似た味(私はhttps://regex101.com/#pcreにPCREを使用して好き)でそれを実行しているを試すことができますが、結果は2つのいずれかになります:あなたはうんざり取得

  • タイムアウト
  • どのくらいの時間を取って、プログラムを停止している

はい、その組み合わせは大抵の正規表現フレーバーで致命的なバックトラッキングを引き起こします。しかし、ではなく、になります。どうして?

Goはバックトラックを使用しませんは正規表現ではありません。 this siteによる:

私たちは最適化された正規表現エンジンを見つけました。これは線形時間で実行され、複雑なパターンをより速くします。 regexpパッケージに含まれています。

バックトラックエンジンと非バックトラックエンジンの違いについては、hereを参照してください。 (そのGitHubのリンクによる)

グロブライブラリを考慮

が行くの正規表現よりも速く表示され、パフォーマンスが問題になることはありません。

+0

ステートマシンに変換するのが難しい大規模な正規表現を使用してオプティマイザを攻撃する方法はありませんか? – Bergi

+0

@Bergiあなたが何を求めているのか分かりません。正規表現のサイズが可変であれば(通常はそうではありません)、1つは正規表現の長さで、もう1つは入力の長さであるO(m * n)です。正規表現コンパイラが正規表現をコンパイルするのに問題があるかどうか聞いているなら、私はそれを疑うでしょう(それはGoのバグでしょう)。正規表現が有効である限り、エンジンはうまくいくはずです。 – Laurel

+0

@Laurelは素晴らしいニュースで、GoLangボックスにはもう1つのティックです。私は実際にGlobをUXのために使用していますが、パターンは技術者以外の人たちによって追加される必要があります。私が参照を読んでみましょう、私は答えを受け入れるでしょう。ありがとう!! – Illizian

関連する問題