0

わかりました、検索しましたが、これに近いものは見つかりませんでしたので、ここに行きます...

/home/sites/example.com/data など、www、htdocs、public_html などの外部のディレクトリとサブディレクトリからファイルを提供する PHP 5.3+ プロキシ スクリプトを作成しています。

これは 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

これは非常に安全ではありません。このスクリプトをどのサーバーにも公開しないでください。

../スクリプト内で気に入らないと思われるパターンや./その他のパタ​​ーンをいじらないでください。また、それらを置き換えるだけでは、攻撃者が置き換えられたパターンをスクリプトに挿入することを防ぐことはできません。

たとえば、次の URL を見てください。

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

../(あなたがしたように)空の文字列に置き換えた後、ファイルのパスは に../some/fileなり、スクリプトはダウンロードルート外のファイルにアクセスできるようになるため、すでに壊れています。

これを回避する 1 つの解決策は、 を使用することrealpath()です。ただし、この目的のために既存の安全なスクリプトを使用することを強くお勧めします。

于 2013-07-09T22:02:32.040 に答える