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