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');