7.11. Функции include и require
Функции include и require в качестве аргумента принимают путь к файлу и имя файла. Синтаксис файла анализируется так, как если бы он был автономным PHP-сценарием. Работа этих функций аналогична директивам include языка C и require языка Perl. Но между двумя этими функциями есть и небольшое отличие. После обработки функция require замещается файлом, на который она указывает. Функция include действует аналогично вызову функции.
Более существенное различие между этими функциями проявляется внутри цикла. Пусть в нашем распоряжении имеются три файла, которые выполняются последовательно друг за другом. Функцию include можно разместить в цикле for, и если файлы имеют имена вроде includel.php, include2.php и include3.php, то проблем с программированием их обработки у разработчика никогда не возникнет. Эти имена можно задавать в цикле, пользуясь переменной счетчика.
Однако при использовании функции require первый файл будет обрабатываться все три раза. Так получается из-за того, что при первой итерации цикла вызов функции require будет раз и навсегда заменен содержимым первого файла. Как было сказано выше, разница незначительная, но она может иметь огромные последствия.
В листингах 7.7, 7.8 демонстрируется одно возможное применение функции include. Здесь мы вернемся к примеру, приведенному в одной из глав, посвященной массивам, и воспользуемся определением массива из главного файла и разместим его в отдельном файле. Весь программный код, который соответствует приемам работы с названиями имен, не обязательно должен быть представлен в главном сценарии. Достаточно знать, что массив перекодировки массивов мы включили. Это делает сценарий, представленный в листинге 7.8, более понятным. 
Листинг 7.7. Включаемый файл

** Создать массив для ссылок по месяцам */
$monthName = array(
1=>"январь", "февраль", "март", "апрель", "май", "июнь", "июль", "август", "сентябрь", "октябрь", "ноябрь", "декабрь", "Jan"=>"январь", "Feb"=>"февраль", "Mar"=>"март", "Apr"=>"апрель", "May"=>"май", "Jun"=>"июнь", "Jul"=>"июль", "Aug"=>"август", "Sep"=>"сентябрь", "Oct"=>"октябрь", "Nov"=>"ноябрь", "Dec"=>"декабрь", "January"=>"январь", "February"=>"февраль", "March"=>"март", "April"=>"апрель", "May"=>"май", "June"=>"июнь", "July"=>"июль", "August"=>"август", "September"=>"сентябрь", "October"=>"октябрь", "November"=>"ноябрь", "December"=>"декабрь"
);

Листинг 7.8. Включение файла

** Получить массив monthName */
include("7-7.php"),-
print("5-й месяц - " . $monthName[5] . "
n"); print("Месяц Aug - " . $monthName["Aug"] . "
n"); print("Месяц June - " .
$monthName["June"] . "
n");
?>

Такое разбиение на модули делает создаваемый программный код более удобочитаемым. Он позволяет читателю видеть прежде всего общую картину. Если необходимо получить более детальную картину, достаточно нескольких щелчков, чтобы открыть включаемый файл. Кроме того, такой стиль программирования позволяет создавать более удобный для повторного использования код. Массив перекодировки названий месяцев требовался нам для какой-то формы запроса, но через неделю, например, он может понадобиться для отображения данных из юридической базы данных. И вместо того чтобы дублировать определение массива, вы сможете просто включить его в новый программный код.
В главе 27, "Проектирование", проблемы разбиения на модули с помощью функции include обсуждаются более детально.

7.12. Не доверяйте пользовательскому вводу
В примерах, приведенных в этой главе, применяется достаточно наивный подход к пользовательскому вводу. При этом считается, что пользователь отправляет информацию сценариям только через HTML-формы. Кроме того, при этом также априори предполагается, что пользователи не будут вводить данные, выходящие за пределы ожидаемых значений. Но известно, что вводимые значения могут наносить вред. Ввод слова в том месте, где сценарий ожидает число, приведет к нулевому результату. Некоторые значения имеют свойство разрушать интерфейс пользователя. Например, длинное значение без каких-либо пробелов может растянуть HTML-страницу до ширины, выходящей за пределы экрана. Рэндал Шварц (Randal Schwartz) разработал метод "лилового динозавра" (purple dinosaur technique), который предполагает ввод изображения HTML-тега там, где приложение ожидает текст. Некоторые значения могут действительно наносить вред, как, например, включение в текстовые поля ко­манд оболочки.
При работе с вашими формами злоумышленники могут не ограничиться только интерфейсом HTML и могут непосредственно вводить свои собственные значения на Web-сервер. Они могут редактировать значения по размещению, или модифицировать ваши формы, или даже создавать свои собственные программы для отправки необходимых им значений. Если необходимо надежно защитить свой сервер, следует обязательно учитывать эти варианты.
Одна из предварительных мер, которые необходимо предпринять для того, чтобы обеспечить соответствие типа и размера вводимых данных, заключается в том, что, когда сценарий ожидает ввода числового идентификатора, можно воспользоваться оператором преобразования. Если сценарий ожидает ввода текстовых данных, длина которых не должна превышать определенного значения, можно воспользоваться функцией substr (подробнее об этом рассказывается в главе 12, "Кодирование и декодирование").
Важно помнить о возможности передачи особых данных во время ввода текста пользователем. Все HTML-теги берутся в угловые скобки. При передаче введенного пользователем ввода за пределы браузера следует помнить, что он может содержать HTML-код, который способен полностью изменить поведение вашего приложения. Так, данные, введенные пользователем, могут даже содержать код JavaScript или ссылки на другие Web-узлы. Такая методика называется cross-site scripting. Если вы не хотите, чтобы вводимые пользователем данные содержали какой-либо HTML-код, передайте эти данные сначала функции htmlentities. Аналогично, для некоторых командных оболочек отдельные символы имеют особое значение. Никогда не передавайте в неизменном виде пользовательский ввод на функции system, exec или им подобные. Есть еще одна довольно полезная функция - escapeshellcmd, - которая добавляет после специальных символов обратную косую черту.