RegEx解析或驗(yàn)證Base64數(shù)據(jù)是否可以使用RegEx來(lái)驗(yàn)證或清理Base64數(shù)據(jù)?這是一個(gè)簡(jiǎn)單的問(wèn)題,但推動(dòng)這個(gè)問(wèn)題的因素是讓它變得困難的因素。我有一個(gè)Base64解碼器,不能完全依賴輸入數(shù)據(jù)來(lái)遵循RFC規(guī)范。所以,我面臨的問(wèn)題可能是Base64數(shù)據(jù)可能沒有被分解成78個(gè)問(wèn)題(我認(rèn)為它是78,我必須仔細(xì)檢查RFC,所以如果確切的數(shù)字是錯(cuò)誤的話,請(qǐng)不要告訴我)線條,或線條可能不以CRLF結(jié)尾; 因?yàn)樗赡苤挥蠧R,或LF,或者兩者都沒有。所以,我有一段時(shí)間解析Base64數(shù)據(jù)格式。因此,以下示例變得不可能可靠地解碼。為簡(jiǎn)潔起見,我只會(huì)顯示部分MIME標(biāo)頭。Content-Transfer-Encoding: base64VGhpcyBpcyBzaW1wbGUgQVNDSUkgQmFzZTY0IGZvciBTdGFja092ZXJmbG93IGV4YW1wbGUu好的,所以解析沒問(wèn)題,這正是我們所期望的結(jié)果。在99%的情況下,使用任何代碼來(lái)至少驗(yàn)證緩沖區(qū)中的每個(gè)字符都是有效的base64字符,完美地運(yùn)行。但是,下一個(gè)例子會(huì)給混合物帶來(lái)麻煩。Content-Transfer-Encoding: base64
http://www.stackoverflow.comVGhpcyBpcyBzaW1wbGUgQVNDSUkgQmFzZTY0IGZvciBTdGFja092ZXJmbG93IGV4YW1wbGUu我在一些病毒和其他試圖利用某些郵件閱讀器的東西中看到的Base64編碼版本希望不惜一切代價(jià)解析mime,而不是嚴(yán)格按照本書,或者說(shuō)RFC; 如果你愿意的話。我的Base64解碼器將第二個(gè)示例解碼為以下數(shù)據(jù)流。請(qǐng)記住,原始流是所有ASCII數(shù)據(jù)![0x]86DB69FFFC30C2CB5A724A2F7AB7E5A307289951A1A5CC81A5CC81CDA5B5C1B19481054D0D2524810985CD94D8D08199BDC8814DD1858DAD3DD995C999B1BDDC8195E1B585C1B194B8任何人都有一個(gè)很好的方法來(lái)解決這兩個(gè)問(wèn)題?我不確定它是否可能,除了對(duì)應(yīng)用了不同規(guī)則的數(shù)據(jù)進(jìn)行兩次轉(zhuǎn)換,并比較結(jié)果之外。但是,如果采用這種方法,您信任哪個(gè)輸出?似乎ASCII啟發(fā)式算法是最好的解決方案,但是代碼,執(zhí)行時(shí)間和復(fù)雜性會(huì)增加多少像病毒掃描程序一樣復(fù)雜的東西,這個(gè)代碼實(shí)際上涉及到什么?您如何訓(xùn)練啟發(fā)式引擎以了解什么是可接受的Base64,什么不是?更新:對(duì)于這個(gè)問(wèn)題繼續(xù)得到的觀點(diǎn)數(shù)量,我已經(jīng)決定發(fā)布我已經(jīng)在C#應(yīng)用程序中使用的簡(jiǎn)單RegEx 3年了,有數(shù)十萬(wàn)個(gè)事務(wù)。老實(shí)說(shuō),我喜歡Gumbo給出的最好的答案,這就是我選擇它作為選定答案的原因。但是對(duì)于任何使用C#的人來(lái)說(shuō),并且尋找一種非??焖俚姆椒▉?lái)至少檢測(cè)字符串或byte []是否包含有效的Base64數(shù)據(jù),我發(fā)現(xiàn)以下內(nèi)容對(duì)我來(lái)說(shuō)非常有用。[^-A-Za-z0-9+/=]|=[^=]|={3,}$是的,這僅適用于Base64數(shù)據(jù)的STRING,而不是格式正確的RFC1341消息。因此,如果您正在處理此類數(shù)據(jù),請(qǐng)?jiān)趪L試使用上述RegEx之前將其考慮在內(nèi)。如果您正在處理Base16,Base32,Radix甚至Base64用于其他目的(URL,文件名,XML編碼等),那么強(qiáng)烈建議您閱讀Gumbo在其答案中提到的RFC4648,因?yàn)槟枰龅煤迷趪L試使用此問(wèn)題/答案集中的建議之前,請(qǐng)了解實(shí)現(xiàn)所使用的字符集和終止符。
3 回答

紅顏莎娜
TA貢獻(xiàn)1842條經(jīng)驗(yàn) 獲得超13個(gè)贊
來(lái)自RFC 4648:
在許多情況下,數(shù)據(jù)的基本編碼用于在環(huán)境中存儲(chǔ)或傳輸數(shù)據(jù),這些環(huán)境可能由于傳統(tǒng)原因而限于US-ASCII數(shù)據(jù)。
因此,如果數(shù)據(jù)應(yīng)被視為危險(xiǎn),則取決于編碼數(shù)據(jù)的使用目的。
但是,如果您只是尋找匹配Base64編碼單詞的正則表達(dá)式,則可以使用以下內(nèi)容:
^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$

慕的地6264312
TA貢獻(xiàn)1817條經(jīng)驗(yàn) 獲得超6個(gè)贊
^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$
這個(gè)很好,但會(huì)匹配一個(gè)空字符串
這個(gè)與空字符串不匹配:
^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{4})$
- 3 回答
- 0 關(guān)注
- 815 瀏覽
添加回答
舉報(bào)
0/150
提交
取消