为htdocs/public\u html之外的文件提供服务的PHP代理脚本有多安全?

为htdocs/public\u html之外的文件提供服务的PHP代理脚本有多安全?,php,security,proxy,moodle,Php,Security,Proxy,Moodle,好的,做了一次搜索,找不到任何接近这个的东西,所以这里是 我正在编写一个PHP5.3+代理脚本,为来自www、htdocs、public_html等外部目录和子目录的文件提供服务,例如/home/sites/example.com/data 这是一个Moodle插件模块,所以如果您熟悉Moodle代码,那就太好了,如果不是,我已经尽我所能对它进行了注释。到目前为止,一切正常,但我还没有运行更多的测试 问题是:这有多安全?我主要关心的是用户在指定目录之外获得访问权限。如果您发现任何明显的安全漏洞,

好的,做了一次搜索,找不到任何接近这个的东西,所以这里是

我正在编写一个PHP5.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
提前感谢!:)

这是非常不安全的,请不要在任何服务器上发布此脚本

不要修补
。/
/
或脚本中您似乎不喜欢的其他模式。此外,仅仅替换它们并不能阻止攻击者将替换的模式插入到脚本中

例如,请查看以下url:

download.php?file=..././some/file
。/
替换为空字符串(就像您所做的那样)后,文件路径为
。/some/file
,并且您的脚本已被破坏,因为它将使您的下载根目录之外的文件可访问


避免这种情况的一个解决方案是使用。但是,我强烈建议为此使用现有的安全脚本。

谢谢str。最后,我使用了现有的Moodle函数。脚本如下: