不要相信用户提供的文件名或者文件路径!当你编写一个模块时,你的代码期望能够收到somefile.txt,实际上它可能得到了其它文件,比如
../somefile.txt // File in a parent directory.
../settings.php // Targeted file.
somefile.txt; cp ../settings.php ../settings.txt // Hoping this runs in shell.
前面的两个例子,里面包含了两个.号,这意味着想操作当前目录的上一级目录。后面的一个,就是希望程序员执行一个shell命令,它包含了一个分号,这样该shell命令运行以后,将会运行一个额外的命令,以将settings.php文件设为可读,从而获取数据库用户名和密码。在前面的所有的例子中,都希望web服务器对文件系统路径以外的目录具有写权限。
无论你什么时候使用文件路径,都须调用file_check_location(),就像这样:
if (!file_check_location($path, 'mydirectory') {
// Abort! File path is not what was expected!
}
file_check_location()函数将找出文件的实际位置,并将其与你期望的目录进行对比。如果文件路径为OK,那么就返回文件的实际路径;否则,返回0。
一般来讲,你可能不会开始就想编写一个了不起的文件管理模块供大家使用。实际上你会,先学习现有的相关模块,熟悉了以后,再编写自己的文件模块。