2

サイトのアプリdata内に、Web ルート内にないフォルダがあります。これはセキュリティを強化するために行われるため、特定のユーザーのみがアクセスできます。CakePHPのドキュメントを見て、私が使用したコードは次のとおりです。

foreach($ImageToSort as $FileDisplayKey => $FileDisplayData) {
    $FileName = $ImageToSort[$FileDisplayKey]['Fileinfo']['filename'];
    $WholePathName = 'data/'.$FileName;
}

$this->response->file($WholePathName);
return $this->response;

ファイルをロードしますが、ビュー内にはロードしません (上記のコードはビュー$ImageToSort内にあり、コントローラー内の検索呼び出しから設定されます)。

では、何らかのループを使用して webroot 内に存在しないファイルをロードするにはどうすればよいでしょうか。それにより、ファイルを表示して、選択した方法で自分のサイトに配置できます。

PS。誰かがファイルを取得できるようにするためにファイルの名前を知るだけでよいため、ファイルを webroot フォルダー内に配置することはできません。これらのファイルへのアクセスは、選択した少数に限定する必要があります。

与えられた助けに感謝します。

グレン

アップデート:

私は2.4を使用していますが、メディアビューを読んだところ、使用すべきものではありませんが、「ファイルの送信」はそれらを置き換えた呼び出しです。私は次のコードでそれらを使用しようとしました:

$this->viewClass = 'Media';

$params = array(
    'id'        => $FileName,
    'name'      => 'example',
    'extension' => 'jpg',
    'path'      => APP . 'uploads/test' . DS
);

$this->set($params);

debug($params['id']);
$name = $params['id'];
$path = $params['path'];
$filename = $path.$name;


//echo 'name::' .$name;
echo "<img src=";
echo $filename;
echo ">";

ファイルを に配置しない限り、ファイルを見つけることができず、/webroot/data/test正常に表示されます。しかし、それはまったく無意味ですか?セキュリティ上の問題から、選択したファイルを表示するには、選択したユーザーのみが必要です。

次のコードは、/app/data/testパス内のファイルを表示する際に機能します。

$this->autoRender = false;
$this->response->file(Configure::read('uploads').$WholePathName);

ただし、このコードをコントローラーまたはビューで使用しても違いはありません。ファイルのみを表示し、レイアウト、スタイル、タイトルなどは表示しません。繰り返しますが、これは完全に無意味です。

ファイルへのアクセスを維持し、必要なファイル/フォルダーを読み取る方法が必要です。

グレン

4

1 に答える 1

1

パス フラグメント (たとえば、クエリを介して渡される) を受け入れ、現在のユーザーがファイルへのアクセスを許可されているかどうかを確認し、パス フラグメントをベース パスと組み合わせて、ファイルの内容を出力する適切なコントローラー/アクションを作成します。

img次に、ビューの要素src属性に対応する URL を使用します。つまり、次のようなものです。

<img src='/files/read/?file=foo/bar.jpg'>

そうすれば、許可されたユーザーだけがファイルにアクセスできます。

これは非常に基本的なコントローラー/アクションの例です。401ユーザーがファイルへのアクセスを許可されていない場合は a で応答し404、ファイルが見つからない、ファイルではない、またはベース パス内にない場合は a で応答します。すべてがうまくいけば、ファイルを提供します。

class FilesController extends AppController
{
    public function read()
    {
        // you'd probably use auth component checks and stuff here
        if(testWhetherUserIsAllowedToAccessFiles() !== true)
        {
            throw new ForbiddenException();
        }

        // make sure that the base path points to a folder that only
        // holds the files that should be accessible!
        $base = ROOT . DS . 'files' . DS;
        $fragment = $this->request->query('file');

        // expand to a canonicalized absolute path, it's way easier to
        // test for validity using the real path
        $path = realpath($base . $fragment);

        // just a basic sanity check, you may want to implement some more
        // security checks to make sure there's really no way to access
        // files outside of the base directory! After all this is just
        // some example code.
        if(
            !!preg_match('~\.\.(\\\\|/)~', $fragment) ||
            $path === false || !is_file($path) ||
            mb_strpos($path, $base) !== 0)
        {
            throw new NotFoundException();
        }

        $this->response->file($base . $fragment);
        return $this->response;
    }
}

CakePHP 2.4.8 の時点で、レスポンス オブジェクトは可能なパス トラバーサル フラグメントのチェックを行うため、理論的には、この例の追加のチェックは必要ないかもしれません。連結したもの!

于 2013-09-26T11:51:54.310 に答える