[php程式] 用戶從網頁上傳的圖片 要以怎樣的狀態存在 server 才好?

未分類
其實這篇之前有寫在草稿
但是只寫了標題

過了一兩個禮拜之後
只看標題 就想不起來這篇要寫什麼了 T_T
剛好最近又遇到一個案例

用戶從網頁上傳的圖片/檔案
要以怎樣的狀態存在 server 才好?



一開始我也跟其他寫網站的菜鳥一樣
開個目錄
把上傳的檔案用 mv 搬到這個目錄

然後開始有人亂搞了
把 php 或是一些 script 傳上去
做一些壞事
感覺很可怕

所以除了上傳的時候做一些檔案類別(file type)檢查以外
也開始把圖片/檔案存到資料庫裡面



然後又因為不是很熟 mysql 怎麼存 binary file
所以又把檔案內容先用 base64_encode 以後
再塞資料庫
mime_type 也在上傳的時候順便塞入資料庫
以便顯示的時候搭配 header 使用

這樣既然可以避免掉有人塞惡意程式到圖檔裡面上傳之類的問題
圖片/檔案透過 php 管理
可以計算下載次數
也可以跟 ckeditor 一類的 html editor 配合
(因為 ckeditor 如果要用它的圖片上傳功能 是要另外付費的)



但是最近遇到一些不老實的主機
資源卡的很緊
(應該說之前租的主機都太好心 資源放很寬)

有的頁面一次開超多圖片的時候
所有的圖片都透過 php 去開
主機的 連線數量又有限
(主機商只開 Entry Process 我覺得很少)
(Entry Process 可以大概當成同時可以跑幾個php程式)
所以只要同時有兩三個人開首頁
就爆炸了



後來沒辦法
只好改 code, 把存在資料庫的圖片存到目錄裡面
第一個遇到的問題是

假設上傳機制有漏洞
有人把php偽裝成圖片塞到這個目錄裡面怎麼辦?

可以設定 .htaccess
讓這個目錄只能開特定附檔名的圖片檔


SetEnvIfNoCase Request_URI ".(gif|jpe?g|png|bmp)$" picture
Order Deny,Allow

Deny from All
Allow from env=picture


這樣就行了




另外
原本可以動態透過php去決定縮圖大小的功能
也沒辦法做了

只能在上傳的時候決定要縮小的縮圖大小
在上傳的時候做完

如果改變縮圖尺寸
可能就要再用程式批次修改了


由這次的經驗也了解
很多主機商都是非常不老實 "穩賺不賠" 的經營主機生意

例如一個月流量給你開幾百G, 甚至 "無限流量"
但是連線數只給你開10個 或是 Entry Process
(通常規格上都不會寫)
或是 CPU 給你 3% 上限

就像小時候我們玩那種貼紙的蒐集遊戲
總共有九張
最後一角那張永遠都集不到

主機商只要卡住一個重要的資源
其他資源開再多你也用不完/吃不到

當然主機商的挑選還有很多面相
不過主機商真的要慎選
好的主機商讓你每天都可以安心睡覺
不好的主機商讓你每天都看晨星