(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]", "恶意行为", $_SERVER['REMOTE_ADDR']." 可能正在尝试攻击。");
}