Версия для печати. Взято с сайта phpsql.ru

На главную   Назад   Вперед

Защита PHP

Когда вы разрабатываете интернет-сервис, вы всегда должны помнить о безопасности вашего кода. Может казаться, что большинство PHP-сценариев не чувствительны к требованиям безопасности, однако это заблуждение начинающих РНР-программистов.

Когда вы помещаете на сервере что-то, что может материально заинтересовать злоумышленников, они попытаются достать это. Создайте интернет-магазин, и вы сдвинете возможность атаки вашего сервера с мертвой точки.

Рассмотрим несколько основных положений безопасности.

Не доверяйте формам

Взломать форму элементарно просто. Да, вы можете написать JavaScript-код, ограничивающий ввод только чисел из диапазона от 1 до 5 для вашего рейтинга. Кто угодно может отключить JavaScript и передать собственное значение, обойдя таким способом проверку на стороне клиента.

Пользователи взаимодействуют с вашим сценарием преимущественно через параметры формы, и в этом кроется наибольший риск. В чем же урок? Всегда проверяйте данные, полученные извне, в вашем PHP-сценарии. Подробно об этом мы поговорим в разделе «Стратегии проверки» (см. ниже). В этой главе мы покажем, как противостоять XSS-атакам и как предотвращать атаки типа MySQL Injection, которые могут украсть или разрушить ваши данные.

Не доверяйте пользователям

Считайте, что каждая часть данных, загружаемая на ваш сайт, потенциально опасна. Проверяйте каждую часть, даже если на ваш сайт никто никогда не пытался напасть. Паранойя стоит того.

Выключите глобальные переменные

Наибольшая дыра в безопасности - это включенная директива register_globals. По умолчанию она выключена, начиная с версии РНР 4.2. Для более подробной информации обратитесь к п. #14.

Новички расценивают автоматическую регистрацию глобальных переменных как удобство, но они не понимают, насколько опасна данная опция. Сервер, на котором включена директива register_globals, автоматически назначает глобальные переменные по любым параметрам формы. Чтобы понять, насколько это опасно, давайте рассмотрим следующий пример.

Предположим, что наш сценарий называется process .php и вносит данные, полученные из формы, в базу данных. Форма выглядит так:

<input name="username" type="text" size="15" maxlength="64">
При запуске сценария process .php PHP (при условии, что автоматическая регистрация глобальных переменных включена) создаст переменную $username и присвоит ей значение этой переменной, значение параметра username. Однако по-прежнему мы можем обращаться к этому значению через $_POST [username ] или $_GET [username].

Проблемы с безопасностью возникают потому, что РНР создает переменные для каждого GET/POST-параметра, и это большая проблема; если вы забудете инициализировать переменную - кто угодно сможет манипулировать ею.

Рассмотрим сценарий ниже. Например, если переменная $authorized установлена в true, она покажет конфиденциальную информацию пользователю. В нормальных условиях переменная $authorized устанавливается в true гипотетической функцией authenticated_user (), только если пользователь был аутентифицирован. Но если register_globals включена, любой может передать GET-параметр authorized=l, чтобы таким образом обойти авторизацию:

<?php
// Устанавливаем $authorized = true только если 
// пользователь прошел аутентификацию 
if  (authenticated_user())   { $authorized = true;}
?>
О безопасном получении значений переменных формы мы поговорим в п. #25. Помимо дыры в системе безопасности, включенная register_globals может стать причиной более тонких ошибок в вашем коде.

 
Предыдущая   На главную   Следующая