iT邦幫忙

1

PHP 如何判斷 base64 是否為圖檔

  • 分享至 

  • xImage

$source = imagecreatefromstring($data_upload); PHP 如何判斷 base64 是否為圖檔
https://ithelp.ithome.com.tw/upload/images/20220503/20117940xn0mE7NYTF.jpg

如題:
網路上有提到可以使用 imagecreatefromstring 判斷
https://ithelp.ithome.com.tw/upload/images/20220503/20117940Rxiy2fVS6O.jpg
但是它不是只回傳false,會回傳warning,有方法比較好判斷base64 是否為土黨的方法嗎? 謝謝

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

0
Felix
iT邦研究生 2 級 ‧ 2022-05-03 16:54:24

Validating base64 encoded images - Stack Overflow

您看到的是這個吧!
照理說 imagecreatefromstring 應該只會回傳資源和 false 才對。

看更多先前的回應...收起先前的回應...
豬豬人 iT邦新手 4 級 ‧ 2022-05-03 16:58:23 檢舉

對 但是 imagecreatefromstring 會印出錯誤訊息,並非單純回傳fasle

Felix iT邦研究生 2 級 ‧ 2022-05-03 17:16:15 檢舉

豬豬人

能提供出現的警告嗎?

豬豬人 iT邦新手 4 級 ‧ 2022-05-03 17:31:00 檢舉

Felix
Notice: imagecreatefromstring(): gd-jpeg, libjpeg: recoverable error: Corrupt JPEG data: premature end of data segment in D:\website\packagerent\test\ttt.php on line 6

Notice: imagecreatefromstring(): gd-jpeg, libjpeg: recoverable error: Corrupt JPEG data: 5888 extraneous bytes before marker 0xd9 in D:\website\packagerent\test\ttt.php on line 5

Warning: imagecreatefromstring(): gd-jpeg: JPEG library reports unrecoverable error: in D:\website\packagerent\test\ttt.php on line 5

Warning: imagecreatefromstring(): Passed data is not in 'JPEG' format in D:\website\packagerent\test\ttt.php on line 5

Warning: imagecreatefromstring(): Couldn't create GD Image Stream out of Data in D:\website\packagerent\test\ttt.php on line 5

您好 類似這個 我放入imagecreatefromstring()的值是隨便key的
謝謝

Felix iT邦研究生 2 級 ‧ 2022-05-03 17:41:06 檢舉

豬豬人

於程式碼最上方加入此行:

ini_set('gd.jpeg_ignore_warning', 1);

並將原本的 $source 改為下列所示:

$source = @imagecreatefromstring($data_upload);

也請回覆結果,謝謝!

先說一件事,在運行策略程式中跑INI函式,是很不好的行為。

Felix iT邦研究生 2 級 ‧ 2022-05-03 23:39:07 檢舉

㊣浩瀚星空㊣

謝謝指教!

這確實是不好的行為,因此我能不使用就不會使用。

然而,如果必須選擇執行或錯誤時,就要考驗開發者的錯誤處理了,畢竟抑制錯誤只是自欺欺人,問題依舊存在。

你或許誤會我說的意思。不是不能用ini函式。
而是不要在運行策略程式內使用。

這很容易造成除錯問題。找BUG的問題。
ini函式最好能在類似global或是config上這一類的初始化程式使用。
比較容易一目了然。

平常要養好習慣,因為人大多是惰性。(我自已也一樣)
不要說是為了測試先放沒關係。
但忙昏頭的時候,就會忘了他的存在了。

Felix iT邦研究生 2 級 ‧ 2022-05-03 23:55:06 檢舉

㊣浩瀚星空㊣

原來如此!這是一個很重要的經驗呢!

我自己也是最怕在除錯時沒有顯示警告或錯誤,真的超級不方便。

豬豬人 iT邦新手 4 級 ‧ 2022-05-04 08:37:07 檢舉

㊣浩瀚星空㊣
Felix
感謝兩位大大的建議 小弟試試看

3

基本有很多判斷的方式。

就目前而言,finfo_open這個函式會對你來說比較好用。
如果是運行在8.1版的話,已經可允許空資源了。

GD函式其實我現在比較少用了。最多只拿來生成驗証圖。

Felix iT邦研究生 2 級 ‧ 2022-05-03 23:41:12 檢舉

學到一課了呢!

豬豬人 iT邦新手 4 級 ‧ 2022-05-04 09:01:30 檢舉

㊣浩瀚星空㊣
你好 我使用
https://ithelp.ithome.com.tw/upload/images/20220504/201179404Npz7swy1V.jpg
$a是base64字串
可以印出檔案資訊,但是我試著將base64破壞後,他還是顯是圖檔(執行imagecreatefromstring會錯誤),好像沒辦法很正確的判斷base64檔案的正確性 謝謝

是的,其實認真來說。這並不是BASE64的問題。
正規安全的做法是將其檔案建檔生成後。再用檔案方式來判斷讀取。
早期還會搭配exif的特性。這樣是最好驗証的方式。
只是這樣子做很操主機效能。一般並不建議這樣子處理。

畢竟,只是為了判斷。

如果是為了注入,一般只會去檢查base64的資料格式正不正確。
GD函式其實要用來建立不確定的圖片格式。都很容易報錯。
這也是我為何不期望你用GD的函式處理。
畢竟你光目前的類型都無法確定了。使用GD函式一定是死一片的。

另外 finfo 只是幫你驗証帶進來的資料 mime 格式的正確性。
並無法幫你驗証內容。
基本上來說mime正確就大致上OK了。

你還是得利用 finfo 的方式去生成檔案並處理的。

如果你真的想要完整的處理,你可能也只剩下生成 temp 檔後再做判斷了。(很操機器喔!!)

我要發表回答

立即登入回答