(A) 最好不要使用用户提供的名称创建文件或文件夹。如果您没有充分验证,就会遇到麻烦。相反,使用随机生成的名称创建文件和文件夹,例如 fg3754jk3h,并将用户名和此文件名存储在一个名为 user_objects 的表中。这将确保无论用户输入什么,发送到 shell 的命令将仅包含来自特定集合的值,并且不会造成任何破坏。
(B) 对基于用户选择的操作执行的命令也适用。最好不要让用户输入的任何部分进入要执行的命令。相反,保持一组固定的命令,并根据用户的输入来运行这些命令。
例如,
(A) 保持一个名为 user_objects 的表,其中包含以下值:
用户名 | 选择的名称 | 实际名称 | 文件或目录
--------|--------------|-----------|-----------
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("[email protected]", "Mischief", $_SERVER['REMOTE_ADDR']." is probably attempting an attack.");
}