我知道有幾十個問題已經以各種形式出現。我的問題稍微更直接。使用Free Pascal和DecodeStringBase64驗證Base64輸入
使用免費Pascal和s:= DecodeStringBase64(s);函數,無論如何要驗證傳遞爲s的解碼字符串是否真正從合適的Base64輸入數據解碼,以避免解碼垃圾?
我所做的最好的是使用reg exp來識別潛在的Base64數據(from the accepted answer here)。然後我使用mod檢查它是否可以被4整除。如果它可以被4整除,我將它傳遞給DecodeStringBase64。但是,儘管與reg exp匹配,但我仍然得到很多誤報,並返回了「已解碼」但顯然不是Base64的數據。例如「WindowsXP =」與表達式匹配,但不是Base64編碼的數據。同樣,名字'Ted'編碼爲VGVk,它甚至沒有通常的'='填充(這可以幫助將其標記爲頁腳),但它仍然是我想要的潛在Base64片段找到並解碼。
在PHP中,有base64_decode(),其中可以傳遞true參數以幫助驗證。
AFAIK,免費Pascal沒有這與DecodeStringBase64,我需要一些驗證方式。周圍的解碼和編碼的主題
其他有用的回覆,如果讀者碰巧尋找它,因爲我是昨天,是here
Afaik最後還有關於= chars的要求。 –
@Marco,如果在編碼字符串的末尾有超過2個'='字符,你應該忽略它們,但是我猜'DecodeStringBase64'沒有這樣做......我還要添加檢查if末尾的'='字符數不超過2個字符。感謝您指出了這一點!無論如何,當在字符串結尾之前找到'='char時,它應該也被視爲無效... – TLama
My Reg Exp是:Base64StringPattern.Expression:='([A-Za-z0-9 +/] {4})*([A-ZA-Z0-9 +/{2} == | [A-ZA-Z0-9 + /] {3} =)';所以,傳遞給你寫TLama函數的字符串在理論上只會在它們的末尾有一個或兩個=符號。雖然我認爲要在FPC中實施(正如Marco在下面所述),但在整個字符串中進行檢查是必要的。非常感謝您的幫助。 –