Представьте себе следующее:
<img src="/image.php?image=5.jpg" />
Теперь, в image.php
:
header('content-type: image/jpeg'); $image = imagecreatefromjpeg($_GET['image']); imagejpeg($image,NULL,100);
Это работает, но таким образом сценарий загружает изображение, обрабатывает его, а затем повторяет его. Можно ли это сделать без обработки изображения?
Причина, по которой я хочу это сделать, заключается в том, что я не хочу, чтобы люди знали, где находятся изображения, поэтому я не хочу писать полный путь в атрибут img
src.
Мне просто нужно отправить необработанные изображения в браузер, но не показывая их истинное местоположение.
Да, ты можешь. Просто readfile
вместо imagecreatefromXXX
+ imagejpeg
.
header('Content-Type: image/jpeg'); $src = /* process $_GET['image'] to recover the path */; readfile($src);
Процесс /* process $_GET['images'] to recover the path */
part подразумевает любую дезинфекцию, которую вам нужно делать на входе, чтобы избежать того, что кто-то запрашивает запрещенный файл. Если ваш ввод скрипта является файловым путем, это может означать проверку из предопределенного списка, удаление возможных разделителей каталогов, проверку на регулярное выражение и т. Д. Другим способом было бы хранить пути внутри базы данных и передавать сценарию простой идентификатор и восстановите путь к файлу. Это может быть лучшей идеей, так как пользователи не будут упоминать о каком-либо пути к файлу на URL-адресе сценария (если вы просто передаете путь, люди могут фактически угадать, где находятся файлы, и это то, что вы пытаетесь предотвратить).
Конечно, используя readfile
. Не забудьте ограничить имена разрешенных изображений. В противном случае вы создадите уязвимость обхода каталога .
header('content-type: image/jpeg'); $img = preg_replace('/[^0-9a-z\._\-]/', '_', $_GET['image']); readfile($img);
Что-то вроде http://www.php.net/manual/en/function.readfile.php
Из примера
<?php $file = 'monkey.gif'; if (file_exists($file)) { header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename='.basename($file)); header('Content-Transfer-Encoding: binary'); header('Expires: 0'); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Pragma: public'); header('Content-Length: ' . filesize($file)); ob_clean(); flush(); readfile($file); exit; } ?>