0

好的,搜索了一下,找不到与此相似的东西,所以这里......

我正在编写一个 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

提前致谢!:)

4

1 回答 1

1

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

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

例如,看看这个网址:

download.php?file=..././some/file

../用空字符串替换后(就像您所做的那样),文件的路径是../some/file并且您的脚本已经损坏,因为它会使您的下载根目录之外的文件可以访问。

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

于 2013-07-09T22:02:32.040 回答