Достаточно ли безопасно добавление "http://" к имени файла для PHP fopen (), чтобы предотвратить чтение локальных файлов? - PullRequest
1 голос
/ 13 февраля 2011

У меня есть скрипт PHP, который принимает URL-адрес файла с помощью GET и открывает его с помощью fopen.
Это решение достаточно безопасно или это брешь в безопасности?

$filename = $_GET['file'];
if( substr( $filename, 0, 7 ) !== 'http://' )
    $filename = 'http://'.$filename;

fopen( $filename, 'r' );
// etc...

Таким образом, вы не можете заставить локальный путь к скрипту читать из него.

Ответы [ 4 ]

4 голосов
/ 13 февраля 2011

То, что должно работать, но вот еще две вещи, о которых стоит подумать:

  • Предоставление доступа к другим серверам.Если ваш сервер находится за брандмауэром, кто-то может использовать его для извлечения данных с другого сервера за вашим брандмауэром (или с помощью службы и т. Д.), Используя HTTP, FTP и т. Д.

  • Рекурсивноотказ в обслуживании.Убедитесь, что у вас нет возможности дать вам URL-адрес самого скрипта для извлечения таким способом, который делает цикл рекурсии.

1 голос
/ 14 февраля 2011

Это довольно хрупко, так как безопасность зависит от регистрируемого обработчика http.Что если в будущей версии PHP он будет удален или необязателен?

Вот в чем проблема.Это на самом деле работает (после предупреждения):

stream_wrapper_unregister('http');
file_get_contents('http://../../../../../etc/passwd');
1 голос
/ 13 февраля 2011

Не совсем уверен, но вам может понадобиться избежать его, чтобы быть в безопасности.

$filename=escapeshellarg ( $filename );

См .: http://php.net/manual/en/function.escapeshellarg.php

0 голосов
/ 13 февраля 2011

другая мера безопасности / опция заключается в использовании chroot() http://php.net/manual/en/function.chroot.php

...