В серии статей "Ten Security Checks for PHP" кратко рассматриваются 10
наиболее часто совершаемых PHP программистами ошибок, приводящих к
проблемам с безопасностью скриптов.
Избегайте
использования переменных сформированных на основании данных
пользователя в функции включения файла (include, require) или доступа к
файлу (readfile, fopen, file). Например: include($lib_dir .
"functions.inc"); include($page); переменные $lib_dir и $page перед
этим нужно проверить либо на предмет наличия запрещенных символов, либо
сопоставить с заранее определенным массивом допустимых значений:
if (!(eregi("^[a-z_./]*$", $page) && !eregi("\.\.", $page))) { die("Invalid request"); }
Необходимо экранировать опасные символы
(" и ') в переменных участвующих в SQL запросах.Например, злоумышленник
может передать переменную вида "password=a%27+OR+1%3Di%271" которая
будет использована в SQL запросе как "Password='a' or 1='1'". Решение:
включить magic_quotes_gpc в php.ini или экранировать переменные
самостоятельно через addslashes();
Никогда не нужно доверять
глобальным переменным, при включенном в php.ini режиме register_globals
злоумышленник может подменить значение глобальной переменной.
Используйте ассоциативные массивы $HTTP_GET_VARS и $HTTP_POST_VARS с
выключенным register_globals и в начале скрипта явно инициализируйте
все глобальные переменные.
Определяйте местонахождение
закаченного файла только через is_uploaded_file() или используя
move_uploaded_file(), но не доверяйте глобальной переменной с путем к
закаченному файлу, значение которой злоумышленник может подменить.
Используйте
функции htmlspecialchars(), htmlentities() для экранирования HTML тэгов
присутствующих в данных полученных от пользователя.
Защищайте
библиотеки функций от просмотра их исходных текстов пользователем
(расширения .inc, .class). Решение: снабжайте библиотеки расширением
.php, помещайте в закрытую директорию или настройте хэндлер для
парсинга расширения файлов с вашими библиотеками.
Помещайте
файлы данных вне дерева файловой системы доступной через web (уровнем
ниже htdocs, или "document root") или защищайте директории через
.htaccess.
mod_php запускайте в режиме safe_mode.
Проверяйте
наличие запрещенных символов в переменные используемых в функциях eval,
preg_replace, exec, passthru, system, popen, ``.
При
использовании не mod_php, а CGI варианта php.cgi не забывайте, что
через php.cgi можно получить доступ к любому файлу в директориях
защищенных через .htaccess, так как доступ в этом случае ограничен
только для прямых запросов, но не для запросов через CGI скрипт php.cgi.