хранение слишком большого количества файлов в одном каталоге может привести к проблемам. в определенный момент пострадает не только производительность, но друг (с большим опытом, чем я) сказал мне, что с некоторыми программами резервного копирования возникают проблемы.
поэтому, когда мне приходилось хранить тысячи изображений, я всегда создавал 256 подкаталогов и сохранял файлы в каталоге files/{id mod 256}/{myfile_id}.jpg
Чтобы защитить себя от хакеров, есть много вещей, которые нужно сделать, и ничего не будет безопасным (потому что хакеры, скорее всего, попытаются получить root-доступ, и тогда ваши данные все равно не будут в безопасности).
1) так что ... обычные резервные копии. период.
2) файлы журнала аудита (кто что когда). это не безопасность как таковая, но она может помочь вам обнаружить дыры в безопасности и исправить ошибки
3) соответственно установите права доступа к файлу (важно на общих серверах без хромирования)
4) перепроверьте, действительно ли действие сделано правильным пользователем. Должно быть невозможно причинить вред, угадав URL.
есть еще кое-что, если вы хотите сделать секретными имена файлов и -paths. например можно напрямую не ссылаться на изображение, а на скрипт, который обслуживает это изображение. в этом случае вы можете хранить файлы вне webroot (кроме того, вы более независимы от имен файлов) (см. код в конце).
еще один шаг - избегать значений идентификатора auto_increment для идентификации изображений. Лучше использовать уникальный хэш (md5(mt_rand());
) без корреляции с идентификатором и сохранить его в базе данных (afaik youtube и flickr делают это).
уродливый php-псевдокод для прохождения будет выглядеть примерно так:
<?php
if (isset($_REQUEST['img'])) {
$hash = $_REQUEST['img']);
if (($res = getImageByHash($hash)) !== false) {
list($id, $name, $mimetype) = $res;
$path = '../images/' . ($id % 256) . '/' . $name;
if (file_exists($path)) {
header('Content-type: ' . $mimetype); // e.g. image/png
readfile($path);
exit();
}
}
}
// if any error happened, then 404 - it's dirty
header("HTTP/1.0 404 Not Found");
echo 'sorry, we couldn\'t find this image';
?>
getImageByHash () будет запрашивать БД.
Это решение медленнее, поскольку веб-сервер больше не может напрямую обслуживать изображения.
и: я бы не хотел хранить изображения в базе данных. экспорт станет огромным, резервные копии - боль.