Я храню php-функции в базе данных mySQL с пользовательского ввода, эти функции должны быть выполнены.
Как мы знаем, это может и позволит г-ну хакеру превратить красивый веб-сайт в швейцарский сыр!
Эти функции призваны быть простыми и не требуют какого-либо расширенного кодирования php. Они больше касаются обработки одного массива данных.
Поэтому, если г-н хакер попадает в id раздела администратора, чтобы отфильтровать любые функции php, которые могут нанести серьезный ущерб, прежде чем сохранять в базе данных.
Такие вещи, как «exec, shell_exec, system, passthru, popen, proc_open, proc_close», могут быть удалены все, что может разрешить внешние входные данные, такие как завиток.
Так что еще может быть опасно и должно быть удалено?
Я тоже нашел этот список: http://blog.eukhost.com/webhosting/dangerous-php-functions-must-be-disabled/
apache_child_terminate apache_setenv define_syslog_variables escapeshellarg escapeshellcmd eval exec fp fput ftp_connect ftp_exec ftp_get ftp_login ftp_nb_fput ftp_put ftp_raw ftp_rawlist highlight_file ini_alter ini_get_all ini_restore inject_code mysql_pconnect openlog passthru php_uname phpAds_remoteInfo phpAds_XmlRpc phpAds_xmlrpcDecode phpAds_xmlrpcEncode popen posix_getpwuid posix_kill posix_mkfifo posix_setpgid posix_setsid posix_setuid posix_setuid posix_uname proc_close proc_get_status proc_nice proc_open proc_terminate shell_exec syslog system xmlrpc_entity_decode
Вы НИКОГДА не должны запускать функцию, определяемую пользователем. Есть миллионы способов, которыми пользователь может маскировать имя функции, которую вы не можете остановить. Например, вы можете сохранить имя функции в переменной и запустить функцию с переменной.
<?php $test = "readfile"; $test("somePageWithDatabasePassword.php"); ?>
Это совершенно верно. И если вы считаете, что можете тестировать функции, запускаемые из переменных, есть способы обойти это с помощью chr (), конкатенации, hex … и т. Д.
Я храню php-функции в базе данных mySQL с пользовательского ввода, эти функции должны быть выполнены.
Это ужасная идея. Будет очень сложно составить список «безопасных» функций, и PHP будет обладать локальными уязвимостями, которые могут быть использованы кем-либо достаточно осведомленным.
Даже белый список будет очень сложным; было бы трудно обнаружить код типа $a = 'exe'; $a .= 'c'; $a('echo foo');
$a = 'exe'; $a .= 'c'; $a('echo foo');
будет вызывать exec
. Рассмотрим альтернативную стратегию, которая не предполагает сохранение исполняемого кода.
Я решил пойти на что-то вроде этого:
http://mustache.github.com/#demo
Это позволит моим пользователям форматировать туда свои данные без прямого PHP-кода.