(A) 最好不要使用使用者提供的名稱建立檔案或資料夾。如果您沒有充分驗證,可能會遇到麻煩。相反地,請使用隨機產生的名稱(例如 fg3754jk3h)建立檔案和資料夾,並將使用者名稱和此檔案或資料夾名稱儲存在一個名為 user_objects 的表格中。這樣可以確保無論使用者輸入什麼,傳送到 shell 的指令都只會包含特定集合的值,而不會造成任何損害。
(B) 這同樣適用於根據使用者選擇的操作而執行的指令。最好不要讓使用者輸入的任何部分傳送到您將執行的指令中。相反地,請保留一組固定的指令,並根據使用者輸入的內容,只執行這些指令。
例如,
(A) 保留一個名為 user_objects 的表格,其中包含以下值:
username|chosen_name |actual_name|file_or_dir
--------|--------------|-----------|-----------
jdoe |trekphotos |m5fg767h67 |D
jdoe |notes.txt |nm4b6jh756 |F
tim1997 |_imp_ folder |45jkh64j56 |D
並且在檔案系統操作中始終使用 actual_name,而不是使用者提供的名稱。
(B)
<?php
$op = $_POST['op'];//在經過大量的驗證後
$dir = $_POST['dirname'];//在經過大量的驗證後,或者您可以使用 (A) 的技巧
switch($op){
case "cd":
chdir($dir);
break;
case "rd":
rmdir($dir);
break;
.....
default:
mail("webmaster@example.com", "Mischief", $_SERVER['REMOTE_ADDR']." 很有可能正在嘗試攻擊。");
}