PHP и безопасность программ.

Я использую понятия безопасности и защищённости как одинаковые, хотя это конечно не одно и то же.

Важно понимать, что 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 об ошибках никогда не будут открыто показаны на вашем сайте. Однако вместо этого они будут сохранены в файле протоколирования ошибок с целью их анализа.