已知限制
本頁整理目前程式碼中會影響部署與使用的行為限制與缺陷,每項附上所在位置。
錯誤處理缺陷
| 位置 | 行為 | 影響 |
|---|---|---|
handlers/PostToPath.go 類型檢查 |
不支援的類型只設定 errMessage,err 為 nil;HandleError 呼叫 err.Error() 觸發 panic |
由 gin Recovery 回 500,而非預期的 400 |
handlers/GetFromPath.go 解碼 |
vips.NewImageFromBuffer 失敗後送出錯誤但沒有 return,接著存取 nil 的影像 |
panic 發生在 goroutine 內,gin Recovery 攔不到,整個程序結束 |
handlers/GetFromPath.go streamImage |
ResponseWriter 不支援 http.Flusher 時遞迴呼叫自己 |
無限遞迴;Gin 預設的 ResponseWriter 支援 Flusher,一般部署不會觸發 |
並行與逾時
三個處理器的結果 channel 皆無緩衝。逾時回 408 後沒有人接收結果,背景 goroutine 會永久阻塞在送出那一行;上傳與讀圖的 goroutine 也會在處理器返回後繼續存取 gin.Context。
快取
| 限制 | 說明 |
|---|---|
| 刪除不清快取 | 原檔移入回收桶後,storage/image/cache/ 的轉檔結果仍會被回傳(見 快取分層) |
| 快取 key 未正規化 | q=75 與不帶 q 輸出相同,卻產生兩個快取檔 |
| 副檔名衝突 | 快取檔名去掉原副檔名,同資料夾的 photo.jpg 與 photo.png 以相同參數讀取時共用同一個快取檔 |
| 無容量上限 | 本地快取檔不會過期或淘汰 |
安全與部署
| 限制 | 說明 |
|---|---|
| 無驗證 | Go 服務不驗證上傳與刪除請求;Nginx 白名單預設為註解狀態 |
| 路徑未限制 | 上傳與刪除以 filepath.Join 組合路徑,未檢查結果仍位於 storage/image/upload/ 內 |
| 類型只看標頭 | 上傳類型依 part 的 Content-Type 判斷,不檢查檔案內容 |
| 佔位圖不在 repo | .gitignore 的 **/image/ 排除了 app/internal/assets/image/,需自行提供 404-light.svg/404-dark.svg |
| 錯誤時狀態碼 | 讀圖失敗以 c.File 回傳佔位圖,HTTP 狀態碼為 200 而非 404 |