2013-10-08 3 views
0

Я многому научился в Stackoverflow, это мой любимый сайт программирования, и здесь я нашел ответы на многие из моих вопросов. Теперь, когда я закончил код, мне нужно знать: есть ли у него какой-то недостаток безопасности?Безопасность в том числе файла даже с использованием is_file

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

Было бы достаточно, если бы я санировал HTTP_HOST с помощью htmlspecialchars и preg_replace? Использование strip_tags было бы излишним, не так ли? Удаление этих специальных символов из массива также избыточно, не так ли?

Edit:

я изменить код, а также добавить защиту самих включаемых файлов. Большое спасибо!

+3

Вы никогда не должны позволять EVER любые пользовательские данные при условии получения какой-либо операции, которая имеет дело с файловой системой , особенно в чем-то столь же опасном, как 'include'. Это было бы нелегко использовать, но я уверен, что кто-то может понять, как это сделать. –

+2

Зачем вам проверять наличие файла доменного имени? Вы знаете, что HTTP_HOST - это предоставленный пользователем var, который может содержать почти все? –

+0

Для меня это была дилемма, но мне действительно нужно получить домен от HTTP_HOST. Если бы я мог удалить не только расширения домена, но и «/», «.». знак равно и т. д., не решит ли проблема? – echolearning

ответ

1

Нет. Вы должны использовать белый список разрешенных выражений. Для чего-то такого же опасного, как include, вы определенно не хотите полагаться на черный список и простую санитацию.

Вы также можете указать, какой каталог содержит ваши файлы PHP.

+0

+1: белого списка нельзя избежать! – geomagas

+0

Если белый список содержит тысячи записей, это не будет очень сложно на сервере? – echolearning

+0

не означает, что у вас будут тысячи '* var.php 'файлы? Я что-то упустил? – geomagas

0

Предположив вы храните все *var.php файлы в специальном каталоге (скажем /var/www/include/vars/) вы могли читать их в массив, и ограничить выбор в пределах границ этого массива, а не только is_file() Инг:

$vardir='/var/www/include/vars/'; 
$varfiles=array(); 
foreach(scandir($vardir) as $fn) 
    if(($fn!='.')&&($fn!='..')) 
    $varfiles[]="$vardir$fn"; 

/* Next, do whatever sanitizing you see fit */ 

if(array_find($fnvar)) include_once $fnvar; 

Обратите внимание, что это, по существу, - это белый список, упомянутый в комментариях: если вы создаете новый {xyz}var.php в каталоге $vardir, вы фактически вставляете новую запись в белый список.

Итак, как @ack__ указывает, что и вы не можете избежать белый список, так или иначе ...

+0

Большое спасибо за подробный ответ. Моя проблема - время обработки/загрузка для этой проверки:/ – echolearning

+0

Ну, ваш вопрос был специфичным для безопасности. Если вы решите пойти этим путем, я уверен, что в вашем распоряжении будет множество методов оптимизации. – geomagas

+0

Я действительно ценю это. – echolearning

 Смежные вопросы

  • Нет связанных вопросов^_^