У меня есть php-файл с именем gallery.php, который является страницей для конкретной галереи изображений. Для безопасности пользовательские изображения хранятся вне корневого каталога.PHP - Безопасность при доступе к файлам за пределами веб-корня
Чтобы получить соответствующие файлы для каждого пользователя, я использую файл getimage.php, который служит изображениям из их местоположения. В целом, структура каталогов выглядит следующим образом:
- UserImages
- пользователь user1
- Список изображений пользователя User1
- Пользователь 2
- Список изображений user2 в
- пользователь user1
- public_html
- gallery.php
- getimage.php
getimage.php записывается следующим образом:
$imgString = realpath('/UserImages/' . $_SESSION['username'] . '/' . $_GET['img']);
if (!startsWith($imgString, '/UserImages/' . $_SESSION['username'] . '/')
|| !(endsWith(strtolower($imgString), '.jpg') || endsWith(strtolower($imgString), '.jpeg')))
{
header('HTTP/1.0 403 Forbidden');
die();
}
$img = file_get_contents($imgString);
header("Content-type: image/jpeg");
echo($img);
exit();
Я полагаюсь на $ _GET [ 'IMG '], чтобы определить, какое изображение нужно извлечь, что является возможным дыром в безопасности (и одним из них является важное). Я мог предвидеть атаку обхода каталога, следовательно, использование realpath, хотя я уверен, что могут быть другие возможности атаки, которые я не содержал с этим скриптом.
По этой причине я бы предпочел, чтобы я мог перемещать getimage.php за пределы webroot или, по крайней мере, препятствовать тому, чтобы он был доступен напрямую (и только через gallery.php, где переданный параметр img строго под моим контролем).
Каждый раз, когда я пытаюсь переместить getimage.php oustide из public_html, я не могу больше назвать его, даже если я требую или включаю в gallery.php. Способ получить доступ к getimage.php делает это:
<img src=getimage.php?img=IMG_FILENAME.jpg />
Но getimage.php потерпит неудачу, если я когда-либо переместить его из директории public_html.
Итак, длинный рассказ: что мне нужно сделать, чтобы предотвратить заражение getimage.php?
Поскольку изображения должны быть поданы в Интернете, я не думаю, что их хранение за пределами веб-корня - хорошая идея, так как для их обслуживания вам все равно нужно создать дыру в безопасности. Вместо этого я бы подтвердил, что загруженные файлы - это действительно изображения, а затем сделать их доступными для Интернета. http://stackoverflow.com/questions/6755192/uploaded-file-type-check-by-php –
Мне не нужна проверка загрузки, так как файлы, которые будут поданы, все мои собственные. Пользователь просто должен уметь их видеть. Если бы я разместил пользовательские изображения внутри веб-корневого компьютера, как мне предотвратить доступ к файлам User1 от пользователя 1? – BurnerBoy
Я смущен тем, почему вам нужно будет закрепить некоторые изображения. Для меня, кажется, проблема здесь. Почему бы не переместить ваши изображения в субдомен (полностью отдельно от вашего приложения) и обслуживать их оттуда? – Piry