PmWiki 有一個
upload.php
的檔案提供從瀏覽器上傳檔案的功能,在 PmWiki 中可以很簡單地利用上傳語法,本頁是說明如何打開 PmWiki 預設安裝時未開啟的上傳功能。
注意安全
1. 顯而易見,讓任何人都能夠上傳檔案是有相當的危險性,
upload.php
檔案已經預防了一些危險,但是
WikiAdministrators (英文)應該明瞭開放上傳功能潛在的危險性,如果不善加設定上傳功能很容易造成對伺服器的危害。
2. 預設的設定中,允許具備上傳權限的用戶得以覆蓋網站中的檔案(無法回復),如果不希望上傳檔案會被覆蓋,可以在
config.php 中設定:
$EnableUploadOverwrite = 0;
基礎安裝
如果
config.php 中設定上傳功能的變數 $EnableUpload 設定為 1,則
upload.php 檔案就會被
stdconfig.php 自動啟動。
在
config.php 中也能設定 $UploadDir 與 $UploadUrlFmt 這兩個變數來分別指定
上傳目錄(儲存由瀏覽器上傳的檔案),以及讀取上傳目錄所用的網址;$UploadDir 預設的目錄是
uploads(與網站的 pmwiki.php 在同一目錄中)。
為了安全緣故,
config.php 中也應該設定預設的上傳密碼(參見 PasswordsAdmin ).
一個開放上傳功能的 PmWiki,它的
config.php 中應該有下列設定:
<?php
$EnableUpload = 1;
$UploadDir = "/home/john/public_html/uploads";
$UploadUrlFmt = "http://www.john.com/~john/uploads";
$DefaultPasswords['upload'] = crypt('mysecret');
## more configuration entries here...
?>
$UploadDir 應該要具有可寫入的權限(執行web server程序的用戶);
WikiAdministrator 可以手動建立上傳目錄,不過當上傳功能被啟動時,PmWiki 會試著自己去建立需要的目錄;如果使用者希望 PmWiki 能自動產生必要的目錄,使用者必須依循下列程序來做:
#改變 PmWiki 的根目錄權限為 2777(例:chmod 2777 /home/john/public_html)
#執行已經開啟上傳功能的 PmWiki(用瀏覽器連結到 pmwiki.php)
#確認上傳目錄已經被自動建立(在終端機中執行 ls /home/john/public_html)
#再將 PmWiki 根目錄的權限改回來 (例:chmod 755 /home/john/public_html)。
使用上傳功能
只要在頁面中一般的網址最後加入 "?action=upload",使用者就會被要求輸入 upload 的密碼(參考
Passwords 和 PasswordsAdmin 的資訊來設定各層級的密碼權限)。
上傳檔案的另一種方法是在頁面中需要引用檔案(例如一張圖片)的位置輸入 "
Attach:檔案名稱.副檔名
"
(儲存頁面後,"
Attach:檔案名稱.副檔名
" 後面會出現一個
? 問號,按下它會導引到進行上傳檔案的頁面)
PmWiki 預設會替各群組分別出不同的次目錄來儲存上傳的檔案,如果想要更改此一設定,請修改 $UploadPrefixFmt 變數值。
如何限制上傳檔案
filenames - 檔案名稱僅能包含英文字、數字、底線、連字號和句點,開始與結束也僅能是文字或數字;變數$UploadNamePattern 是用來管理此一功能的。
file extension - 只有某些特定附檔名 ".gif"、".jpg"、".doc"等等的檔案才被接受;這是安全性的考量,避免被傳入 .php 或 .cgi 之類的可執行檔。
file size - 預設僅接受不超過 50K bytes 的檔案, $UploadMaxSize 變數可以更改這個限制,例如改為100K,只要這樣更改:
$UploadMaxSize = 100000;
事實上,管理者可以針對不同的檔案類型分別設定最大值限制,例如限制 ".gif" 和 ".jpeg" 檔案最大為 20K, ".doc" 檔案可到 200K, 然後其他檔案則遵守 $UploadMaxSize 的預設值。
$UploadExtSize 陣列可用附檔名來指定最大值,例如這樣設定:
$UploadExtSize['gif'] = 20000; # 限制 .gif 檔案最大值為 20K
設定最大值為
0 也就等同於限制此種檔案的上傳:
$UploadExtSize['zip'] = 0; # 不允許 .zip 壓縮檔上傳
也可以更方便的這樣設定:
$UploadExts = array('gif','jpeg','jpg','png','ppt');
$UploadMaxSize = 20000;
$UploadExtSize['ppt'] = 150000;
$UploadExtSize['doc'] = 150000;
僅允許 GIF、JPEG、PNG 檔案最大為 20K,PowerPoint 和 Word 檔可到 150K,其他檔案都不允許。
與上傳檔案限制有關的其他設置
- Apache 2.0 Web Server設定檔中的 LimitRequestBody(針對所有網頁,包含上傳)
Apache 的預設值應該是沒有限制,不過某些網站管理者會更改這個設置。
您可以編輯 httpd.conf 或是 php.conf(通常在 /etc/httpd/conf.d 目錄下)。
- PHP 本身也有兩個與上傳限制相關的設置
第一個是:upload_max_filesize 參數, 預設值通常是 2M。
第二個是:post_max_size, 預設值通常是 6M。
如果上面三種設定不相符(pmwiki、apache、php),相對最小的數值就是上傳的限制。
- 特別注意:可讀取上傳檔案的權限並不會被任何預設的權限管理所管控,即使頁面被 read 密碼管控住,上傳目錄中的檔案還是可以被讀取(例如有人直接用連結取用)。