私はチームメイトと画像ギャラリーのユーザーアップロード画像の場所について議論しました。私は、私たちが提案する方法についてより広範な洞察をしたいと思います。アップロードした画像をパブリックフォルダに配置するのは安全ですか?
私のチームメイトは、パブリックブラウジングでは利用できないフォルダ(つまり、サーバー上のpublic_html
)に置かれた画像ファイルにfile_get_contents
という名前のコントローラとアクションを書き込み、ヘッダーを介してエコーします。これは安全ですが、Zend Frameworkを使用しているので、画像コントローラの呼び出しごとにブートストラップのクエリが実行されるため、約500msの遅延が発生します。画像ギャラリービューは同時に20枚以上の画像を表示するので迷惑です。要するに
、関連するコードは次のようになります。
class ImageController extends Zend_Controller_Action {
public function showAction() {
$filename = addslashes($this->_getParam('filename'));
if(!is_file($filename)) {
$filename = APPLICATION_PATH.'/../public/img/nopicture.jpg';
}
$this->_helper->viewRenderer->setNoRender(true);
$this->view->layout()->disableLayout();
$img = file_get_contents($filename);
header('Content-Type: image/jpeg');
$modified = new Zend_Date(filemtime($filename));
$this->getResponse()
->setHeader('Last-Modified',$modified->toString(Zend_Date::RFC_1123))
->setHeader('Content-Type', 'image/jpeg')
->setHeader('Expires', '', true)
->setHeader('Cache-Control', 'public', true)
->setHeader('Cache-Control', 'max-age=3800')
->setHeader('Pragma', '', true);
echo $img;
}
}
次に、ビューで、私たちは呼ん:
<img src="<?php echo $this->url(array('controller' => 'image', 'action' => 'show', 'filename' => PATH_TO_HIDDEN_LOCATION.'/filename.jpg')); ?>" />
私は別のアプローチを持っている:私は、元の画像を維持することを好みます隠された場所にありますが、要求されるとすぐにそれらを公共の場所にコピーし、リンクを提供します(cronによって実行される特別な仕組みで、毎回公共画像のディレクトリを拭き取り、その後無駄にならないようにします)。スペースと、robots.txt
がGoogleにディレクトリのインデックスを作成しないように指示します)。解決策は、公的にアクセス可能なディレクトリ内のファイル(すべての与えられた瞬間で数)(提供される一つのファイル名を知っている)を置き、だけでなく、このように、ブートストラップ起動しない、唯一のビューヘルパーが必要ですの助けを借りて
class Zend_View_Helper_ShowImage extends Zend_View_Helper_Abstract {
public function showImage ($filename) {
if (!file_exists(PUBLIC_PATH."/img/{$filename}")) {
if (!copy(PATH_TO_HIDDEN_FILES."/{$filename}",PUBLIC_PATH."/img/{$filename}"))
$url = PUBLIC_PATH.'/img/nopicture.jpg';
else
$url = PUBLIC_PATH."/img/{$filename}";
} else {
$url = PUBLIC_PATH."/img/{$filename}"
}
return "{$url}";
}
}
をこのヘルパーは、コールは、ビューに非常に簡単です:
<img src="<?php echo $this->showImage('filename.jpg'); ?>" />
質問:は私のcoleague状態として、私のアプローチは、セキュリティ上の脅威をもたらすしていますか?これの潜在的なリスクは何ですか?そして、最も重要なのは、もしあれば、セキュリティ上の脅威がページ負荷の10秒間の利益を上回るのか?
重要な場合:私たちは約15,000人の登録ユーザーを持つコミュニティポータルに取り組んでおり、ギャラリーは非常に頻繁に使用されています。
*私が貼り付けたコードは、両方のアプローチの仕組みを示すために、私たち一人ひとりが何を思いついたかを編集して簡略化したものです。
+1明確な方法で複雑な質問を書く。 :)今、私はあなたのために良い答えを持っていた場合... – nickf