最近在做一個報名系統,需要開放由 Excel 格式報名表上傳報名資料。這項技術之前已有在別的系統上實作過了,是使用 \PhpOffice\PhpSpreadsheet 套件處理上傳的 Excel 檔案,所以把舊的程式套用過來修改即可。 但是在測試的時候,發現部份欄位取值後的資料有問題,一查原來是 Excel 儲存格(Cell)中有設定格式,此時這個儲存格變成 Richtext Cell,在 PhpSpreadsheet 中用 getValue() 取值時,會取出一堆格式的資訊。 在查閱了一些資料後,似乎沒有一個萬用的取值函數,必須要判斷取出的資料是否為 Richtext,若是 Richtext 格式,需要再用 getPlaintext() 函數去把文字內容取出。 如此,在取出每一個儲存格內容後,都有用一個 if 來判斷取出的資料類型後再處理,真的有夠麻煩。還好這次系統要取的欄位沒有很多,萬一未來遇到很多的資料時,一堆 IF 一定會 keyin 在累死,而且程式執行效率也一定會變慢。 有空再來研究看看,有沒有比較省力的方法吧。
現在自己寫程式都已經使用 CodeIgniter4 的 PHP 套件,系統會自動使用資安防護機制,如網路表單會使用 CSRF (cross-site request forgery)的機制保護,以防止不合法的資料輸入或程式機器人入侵。 但在之前未使用 CI4 之前的程式,如果要防止相關資訊安全漏洞的話,必要自己手工增加 CSRF 防護。 CSRF 產生: $_SESSION['token'] = md5(uniqid(mt_rand(), true)); 在表單添加 CSRF 隱藏欄位: <input type="hidden" name="token" value="<?php echo $_SESSION['token'] ?? '' ?>"> 在後續程序驗證 CSRF: $token = filter_input(INPUT_POST, 'token', FILTER_SANITIZE_STRING); if (!$token || $token !== $_SESSION['token']) { // return 405 http status code header($_SERVER['SERVER_PROTOCOL'] . ' 405 Method Not Allowed'); exit; } else { // process the form }