1

Silex/Symfony 2 フレームワークを使用しています。ユーザーは非公開 ( web/assets/uploads/*.*) または公開ドキュメント ( )app/uploads/*.*のいずれかをアップロードできます。アップロードされたファイルはサニタイズされた名前で適切なフォルダーに移動され、新しいレコードがuploadテーブルに作成されます。

+-app/
| +-.htaccess                 <-- Deny from all
| +-uploads/                  <-- private upload folder
|   +-private_upload.pdf      <-- private document
+-web/
  +-index.php                 <-- front controller
  +-assets/
  | +-img/
  | +-css/
  | +-js/
  | +-uploads/                <-- public upload folder
        +-public_document.pdf <-- public document

画像や CSS のアップロードなどのアセットは、通常どおり、つまりファイル名への直接リンクとして提供する必要があります。

<img src="/web/assets/img/logo.png" />

Apache 構成案 (本番環境)

プライベートまたはパブリック アップロード フォルダー内のファイルは、サニタイズされた名前を取得し、アクセス許可を確認するためのコントローラーを使用して提供する必要があります。

現在、(存在しないファイルに対する) すべてのリクエストはフロントコントローラーを通過しますindex.php:

<IfModule mod_rewrite.c>
    Options -MultiViews

    RewriteEngine On
    RewriteBase /web
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [QSA,L]
</IfModule>

ファイルを使用した要求app/*は拒否されました。.htaccessこれは正しく安全ですか?

PHP 5.4 Web サーバーの問題 (開発環境)

index.phpは次のコードを持っています:

$filename = __DIR__.preg_replace('#(\?.*)$#', '', $_SERVER['REQUEST_URI']);

if (php_sapi_name() === 'cli-server' && is_file($filename)) {
    return false;
}

リクエストがファイル名に対するもので、(ファイルが実際に存在する)をindex.php返すfalse場合、PHP 5.4 Web サーバーはファイルを静的に処理できます。

問題は、これらの行では、クラス/files/private_document.pdfで管理されている のようなルートをキャッチできないことです。FilesController

$controllers->get('/files/{file}', 'file_controller:serveAction')
    ->assert('file', '.*')
    ->bind('file_serve');
4

1 に答える 1