好的,搜索了一下,找不到与此相似的东西,所以这里......
我正在编写一个 PHP 5.3+ 代理脚本来提供来自 www、htdocs、public_html 等之外的目录和子目录的文件,例如 /home/sites/example.com/data
这是一个 Moodle 插件模块,所以如果你熟悉 Moodle 代码,很好,如果不是,我已经尽我所能注释它。到目前为止,一切都按预期工作,但我还没有对其进行更多测试。
问题:这有多安全?我主要关心的是用户在指定目录之外获得访问权限。如果您发现任何明显的安全漏洞,请告诉我。
剧本:
require_once('../../config.php'); // conatains $CFG object
require_once('../../lib/filelib.php'); // contains mimeinfo() and send_file() definitions
// Don't use Moodle required_param() to avoid sending any HTML messages to Flash apps
require_login(); // Users must be logged in to access files
global $CFG;
$swf_relative_path = get_file_argument(); // gets the appended URL e.g. /dir/subdir/file.jpg
$swf_ok = false;
if(strrpos($swf_relative_path,'.') > strlen($swf_relative_path) - 6) {
// Strip out special characters, extra slashes, and parent directory stuff
$swf_disallowed = array('../','\'','\"',':','{','}','*','&','=','!','?','\\','//','///');
$swf_replace = array('','','','','','','','','','','','','/','/');
$swf_relative_path = str_replace($swf_disallowed,$swf_replace,$swf_relative_path);
$swf_full_path = $CFG->dataroot.$CFG->swf_content_dir.$swf_relative_path;
if(file_exists($swf_full_path) && is_readable($swf_full_path)) {
$swf_path_info = pathinfo($swf_full_path);
$swf_mime_type = mimeinfo('type', $swf_path_info['basename']);
send_file($swf_full_path,$swf_path_info['basename'],'default',0,false,false,$swf_mime_type,false);
exit;
}
}
header('HTTP/1.0 404 Not Found'); // Send back a 404 so that apps don't wait for a timeout
exit('404 Error: File not found'); // Pure text output - Flash app friendly
提前致谢!:)