Вопрос по php, image, mysql, database – Как безопасно хранить файлы на сервере

8

What I'm Doing:

Мне в основном нужно создать сайт, защищенный страницей входа, написанной на PHP, которая после входа в систему, у вас есть строка поиска, которая читает целые числа, и данные отправляются в сценарий PHP, который получает изображение с номером в качестве его имени.

(Я буду хранить несколько тысяч изображений на этом сервере для поиска - инвентаризация изображений)

-

What I need help with:

Из моего исследования я понимаю, что вы не делаете этого. использовать базы данных, такие как MySQL, для хранения реальных изображений из-за скорости и неэффективности. Если вы не сохраните его в базе данных и оставите его в файловой системе сервера в соответствии с предложением, если кто-то введет прямой URL-адрес в адресную строку, не приведет ли он к переносу их в файлы на моем сервере?

Как вы защищаетесь от этого. Я не хочу, чтобы на моем сервере отображались файлы без возможности успешного просмотра страницы входа.

Спасибо за любую помощь, любые идеи или предложения будут оценены. Это важно для меня, потому что в будущем будет добавлена более сложная информация.

У вас может быть каталог, который недоступен через HTTP, и вы можете использовать php-скрипт, который проверяет, вошел ли пользователь в систему и, если да, читает файл из указанного каталога и выводит его. N.B.
php имеет доступ к любому файлу на сервере (в зависимости от разрешений), он не ограничен веб-корнем user557846
Я прочитал, чтобы оставить файл вне папки public_html. Будет ли это сделать его полностью недоступным с http? Как мой php-скрипт получит доступ к файлам? DMor
public_html обычно это каталог, из которого обслуживаются файлы, при использовании Apache с cPanel. Это означает, что когда вы печатаетеhttp://yoursite.com, данные извлекаются из/var/www/username/public_html. Это также означает, что независимо от того, что вы вводите в URL,/var/www/username являетсян доступно. Это также означает, что каталог, который вы бы там создали, например,/var/www/username/files также не будет доступен. Из вашего PHP-скрипта вы получите к нему что-то вродеfile_get_contents('/var/www/username/files/imagename.extension);. N.B.
Хорошо, спасибо вам обоим, теперь я знаю, как хранить мои файлы. Должен ли я использовать базу данных для хранения путей к файлам или я просто должен полностью игнорировать базы данных? жесткое кодирование пути с переменным местом хранения для ввода (имя изображения)? DMor

Ваш Ответ

3   ответа
6

угой скрипт) - использовать так называемый заголовок ответа «X-Sendfile».

PHP-скрипт обрабатывает аутентификацию, и после проверки он установит несколько заголовков ответа вместе с X-Sendfile, который сообщает веб-серверу о необходимости доставки файла; сценарий заканчивается, и веб-сервер вступает во владение.

Смотрите простой пример:

http: //www.jasny.net/articles/how-i-php-x-sendfile

Я посмотрю на это, спасибо. DMor
1

но вот как я думаю об этом в приложении, которое я разрабатываю:

Во-первых, есть 4 сервера, веб-сервер, сервер промежуточного программного обеспечения и сервер данных

Когда кто-то отправляет запрос на веб-сервер, веб-сервер подключается к серверу промежуточного программного обеспечения и запрашивает файл, передавая учетные данные пользователя, такие как ключ сеанса и запрошенный файл. промежуточное программное обеспечение подключается к базе данных и проверяет сеанс и привилегии пользователей на этот файл. он вернет либо ошибку, либо двоичные данные, если у них есть доступ. если вы отключите буферизацию вывода как на веб-сервере, так и на сервере промежуточного программного обеспечения, вы можете отправить 100 тыс. блоков с сервера промежуточного программного обеспечения на веб-сервер, и веб-сервер будет выводить первый блок при получении второго блока.

сам файл может быть сохранен на сервере базы данных через ftp, sftp или другой файлообменник

он определенно не так эффективен, как использование x-sendfile, но если кто-то сможет подключить ваш веб-сервер, у него все равно не будет доступа к файлу - в приведенных выше сценариях он будет. веб-сервер является единственным общедоступным сервером, поэтому остальные серверы должны быть подключены к частной сети.

Вы также можете отправить данные на сервер шифрования, который будет шифровать / дешифровать фактические данные файла

если у кого-то есть идеи, как это улучшить, мне интересно.

папка с изображениями защищена .htaccess («DENY FROM ALL»). Я также использую SSL и храню другую информацию об изображении в базе данных MySQ DMor
Интересно, но это определенно сложнее, чем мне нужно (но интересно читать). Честно говоря, я тогда не знал о .htaccess и о том, что он может блокировать просмотр всей папки. Я уже реализовал это. У меня есть HTML-форма входа в систему, которая принимает данные, отправляет их в сценарий обработки, который проверяет пользователя, который при проверке отправляет пользователя на страницу поиска. пользователь вводит № элемента и отправляется в другой сценарий обработки, который обращается к базе данных с номером в качестве первичного ключа, содержащим путь к файлу и другую информацию. Если он существует, он тянет путь к файлу DMor
0

напиши ресурсную подачу в php вот так

image.php?requestid=.....

В этом файле вы получаете requesttid и читаете фактическую ссылку (локальную ссылку) из базы данных, читаете файл изображения, затем выводите данные в браузер

$id = $_GET['requestid'];
$link = get_local_link_from_id($id);  // return /images/file1.png......
$data = file_get_contents($link);
header('Content-Type', 'image/png');
echo $data;

Но я думаю, тебе не следует этого делать, просто переименуй файл случайным образом и создай их много ....

GET никогда не бывает безопасным, даже POST тоже может быть недостаточно для безопасности. ilhnctn
Им нужно сохранить исходный номер, это не моя система, а по просьбе человека, который меня нанял. И это достаточно безопасно? пока мой PHP-скрипт фильтрует запросы, верно? DMor
@ ilis - какой смысл в твоем комментарии? GET и POST - это методы, используемые HTTP, они «небезопасны» только в случае неправильного использования при интерпретации ввода пользователя. N.B.
@ N.B. я думаю, что мне не хватит, чтобы объяснить момент их ненадежности. но я вернусь сюда через некоторое время с полной информацией (через несколько дней) ilhnctn
Что тут обсуждать? Единственный способ передачи данных с использованием HTTP - это использование GET / POST (в текущем контексте). Вы говорите, что они небезопасны. Нет, они не небезопасны. Что небезопасно это как ты интерпретируешь эти данные, как и любой другой протокол там. Нет ничего плохого в протоколе или двух упомянутых методах. Пожалуйста, не оставляйте вводящих в заблуждение комментариев. N.B.

Похожие вопросы