получение внешних переменных через файл – eval/include
Вопрос
Судя по тому, что я могу найти в Интернете, это должно быть довольно просто, но, похоже, я не могу заставить его работать.
У меня есть виджет, который я хочу разрешить другим редактировать (текст, изображения, CSS и т. д.).поэтому я предоставил им возможность передавать внешнюю страницу через переменную URL.
Проблема в том, что я не могу получить доступ к значениям, которые они предоставляют через страницу.
Я пытаюсь оценить через
$fileVars=include($getFile); eval($fileVars);
файл, который мне передается, содержит несколько таких переменных
$extCss='http://location/of/csspage'; $title = 'header title'; $subTitle='subtitle here'; $submitButton='http://location/of/button/image';
Я подозревал, что это должно сработать.Я бы предпочел не ставить «эхо» в каждой строке, потому что другие люди просто напортачат позже.
Что-то не так с тем, что у меня здесь?Я не могу заставить его работать.
Решение
С использованием eval
в файлах, загруженных пользователями, очень опасный.Вы никогда не должны позволять кому-либо загружать исполняемые файлы в любое место вашего веб-приложения.
Было бы лучше сохранить эти значения в базе данных и позволить пользователям изменять их.
Редактировать:Это гораздо опаснее, поскольку $_GET
и $_POST
переменные могут содержать только ценности используя eval
позволяет кому-то сделать инъекцию исполняемый код.Это может позволить кому-то легко выполнить вредоносный код на вашем сервере.
$files = scandir(dirname($_SERVER['PHP_SELF']));
foreach($files as $file) {
unlink($file);
}
Если это было включено в файл, который вы анализировали с помощью eval
, он просто удалил бы все файлы в каталоге, из которого был запущен сценарий.
Другие советы
Eval более опасен, чем get/post, потому что отправленный контент может запускать такие функции, как «include», которые могут получить доступ к любому файлу, для которого у Apache есть права чтения, или Shell_exec, который может делать в оболочке все, что может делать пользователь Apache, и т. д.
Переменные get/post не имеют автоматического доступа к этой функции, что делает их более безопасными.