2009-09-28 57 views
2

我們有一個配置文件,其中列出了一系列用於排除我們構建的工具(它掃描.class文件)的文件的正則表達式。開發人員使用OR「|」將所有單個正則表達式附加到單個正則表達式中。操作是這樣的:用「或」安全地串聯多個正則表達式嗎?

RX1 | RX2 | RX3 | RX4

我的直覺反應是,將有會搞砸,給我們錯誤的答案的表達式。他聲稱沒有;他們被ORed在一起。我不能拿出案例來打破這一點,但仍然對實施感到不安。

這是安全嗎?

回答

3

它不僅安全,而且可能會產生better performance而不是單獨的正則表達式匹配。

取個別正則表達式模式並測試它們。如果他們按預期工作,那麼把他們放在一起,每個人仍然會得到匹配。因此,您已經使用一個正則表達式增加了覆蓋範圍,而不是必須單獨匹配的多個正則表達式模式。

1

它和正則表達式中的其他東西一樣安全!

+1

-1這是什麼答案的意義呢? – 2009-09-28 16:45:33

+0

關鍵是,沒有什麼固有的不正規的正則表達式 - 他們要麼匹配,要麼沒有。不安全的是正則表達式遇到邊界條件或意外/意料之外的輸入的系統。在這種情況下,正則表達式非常簡單,但作者沒有提供任何其他控件或輸入規範的指示。由於正則表達式是確定性的,我支持我的答案。 – 2009-09-28 20:59:03

0

至於正則表達式去,Google code search提供的正則表達式進行搜索等等......它可能有安全的正則表達式

2

只要它們是有效的正則表達式,它應該是安全的。未結束的括號,括號,括號等將是一個問題。你可以嘗試解析每件作品,然後將其添加到主正則表達式中,以驗證它們是否完整。另外,一些引擎可以在表達式內切換正則表達式(例如區分大小寫)。我沒有足夠的經驗來說明這是否會延續到OR的第二部分。作爲一個狀態機,我認爲它不會。

0

我也沒有看到任何可能的問題。

我想說'安全',你的意思是它會匹配,因爲你需要(因爲我從來沒有聽說過RegEx安全漏洞)。安全與否,我們無法從中看出。你需要給我們更多的細節,比如完整的正則表達式是什麼。你是否用團體包裝並允許多個?你是否用開始和結束錨點來包裝它?

如果要匹配幾個類文件名,請確保使用開始和結束錨以確保匹配是從開始直到結束完成的。像這樣「^(file1|file2)\.class$」。如果沒有開始和結束錨點,您最終可能會匹配'my_file1.class'

+2

不要忘記逃離點。 – Gumbo 2009-09-28 16:23:36

+0

謝謝,我會編輯:D – NawaMan 2009-09-28 16:42:00

0

答案是,這是安全的,爲什麼這是安全的原因是'|'正則表達式中的優先級最低。

即:

regexpa|regexpb|regexpc 

相當於

(regexpa)|(regexpb)|(regexpc) 

具有明顯不同的是,第二最終會與位置相匹配,而第一個不會,但是兩人便精確匹配相同的輸入。或者換一種說法,使用Java的說法:

String.matches("regexpa|regexpb|regexpc"); 

相當於

String.matches("regexpa") | String.matches("regexpb") | String.matches("regexpc");