Источник: http://www.webheim.com/
PHP и безопасность
(защищённость).
Я использую понятия безопасности и
защищённости как одинаковые, хотя это конечно не одно и
то же.
Важно понимать, что PHP не является
защищённым или не защищённым языком
программирования.
Защищённость или безопасность ваших
internet-программ определяется только их
кодом.
Глобальные переменные и
формуляры.
Основной вещью, на которую нужно
обращать внимание для обеспечения защищённости программ,
является принцип, что всё полученное из вне системы
является потенциально опасным.
В PHP очень легко
убедиться, является ли переменная опасной или нет. Если
в php.ini флаг register_globals установлен в on
(активирован), то PHP автоматически генерирует
переменные из параметров формуляра и куков (cockies).
Плохо разработанные программы исходят из того, что
переменные только тогда имеют значения, когда эти
значения явно заданы. В случае register_globals = on,
это предположение может быть
ошибочным.
Рассмотрим следующий
код:
КОД 1:
php
if
(methode_check()) {
$my_var = true;
}
//
...
?>
Очевидно, что в этом коде мы исходим
из того, что переменная $my_var принимает значение true
только в том случае, если функция methode_check() так же
возвращает true.
Однако в случае register_globals =
on, достаточно выполнить для этой страницы page.php?my_var=1 что бы обеспечить работу
программы со значением $my_var = true вне зависимости от
возвращаемого значения функцией
methode_check().
В настоящий момент в PHP существует три возможности решить
эту проблему:
- инициализация переменных;
-
установить значение флага register_globals в off
-
настроить значение variables_order и правильно
использовать в вашем коде глобальные
переменные
Инициализация переменных
Всегда
инициализируйте переменные. При этом дырка, показанная в
примере выше, была бы закрыта вот так просто:
КОД
2:
php
$my_var
= false;
if (methode_check()) {
$my_var =
true;
}
// ...
?>
В случае, если
конфигурационное значение error_reporting в php.ini установить в E_ALL, то будет
обеспечено сообщение о том, что сценарий содержит
переменные, которые не проинициализированы.
Так к
примеру это может выглядеть:
КОД 3:
php
echo
$a;
?>
Сообщение сценария (Код
3):
Notice: Undefined variable: a in c:\myserver\apache\htdocs\test.php on line 2
Конечно же
когда программа готова, открытые сообщения обо всех
ошибках и информационные сообщения должны быть
деактивированы, в противном случае эта информация можеть
открыть дополнительные возможности для снижения
безопасности, или попросту, для взлома
программы.
Следующие директивы php.ini рекомендуются для рабочих
программ:
КОД 4:
display_errors =
Off
log_errors = On
error_log = C:/myserver/apache/log/php_errors.log
Таким
образом можно быть уверенным, что сообщения PHP об ошибках никогда не будут
открыто показаны на вашем сайте. Однако вместо этого они
будут сохранены в файле протоколирования ошибок с целью
их анализа.
На этом первую статью о
безопасности я завершаю, так как время позднее.
Продолжение конечно будет.
А именно я расскажу
(исходя из возможных путей для повышения безопасности
программ) о variables_order, как выбирать имена файлов
для сценария, о проверке относительных путей, об
ограничении доступа к определённым папкам и многом
другом.
Замечание: Надеюсь, что это будет
полезно.
Gv