PHP безопасный root

Мой друг обнаружил проблему в моем скрипте, он дает доступ к корневым файлам.

Этот URL дает файл passwd:

http://site.com/attachment.php?file=../../../../../../etc/passwd

Как избежать этой дыры в безопасности?

6
задан James 22 August 2010 в 07:48
поделиться

3 ответа

Не загружайте файлы, используя строку URL .... Определите уникальные идентификаторы для обозначения файла, а не пути.

Вы могли видеть такие загрузки http://www.mysite.com/download.php?id=23423 что они делают, используйте этот идентификатор, чтобы извлечь имя файла и путь из БД, а затем загрузите его.

14
ответ дан 8 December 2019 в 05:52
поделиться

Вы можете использовать realpath () и dirname () для проверки URL-адресов на $ _ SERVER ['DOCUMENT_ROOT'] (или любой другой каталог, который является «безопасным» для скачивания).

Если результат realpath () указывает за пределы безопасного каталога, вы можете отклонить запрос на загрузку.

Также есть директива безопасности open_basedir (и параметр времени выполнения, начиная с версии 5.3).

3
ответ дан 8 December 2019 в 05:52
поделиться

Полагаю, у вас есть каталог, в котором хранятся все вложения.

Просто проверьте, находится ли файл в вашем каталоге.

 // http://www.php.net/manual/en/function.basename.php
 // http://cz.php.net/manual/en/function.file-exists.php 
 if (file_exists($attachments_path . "/" . basename($_GET['file'])) {
  // do work
 }

Starx опубликовал решение, которое выглядит нормально. Однако это можно сделать и без базы данных. Если кто-то загружает файл, вы можете сохранить его как md5($filename).$extension и использовать свой скрипт.

1
ответ дан 8 December 2019 в 05:52
поделиться
Другие вопросы по тегам:

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