ООП   PHP   web   4GL - визуальные среды

Практика пограммирования скриптов на PHP

Безопасное программирование веб-приложений на языке PHP

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

Основные сведения о языке.

PHP (аббревиатура PHP рекурсивно расшифровывается как "PHP Hypertext Preprocessor") — это язык написания скриптов, которые встраиваются непосредственно в гипертекстовые файлы и исполняются на Web-сервере. Программа на PHP заключается в теги <?, ?>, а интерпретатор обрабатывает команды между этой парой тегов и формирует окончательный файл, передающийся на локальную машину.

Одна из наиболее сильных сторон PHP является, одновременно, и его слабой стороной: PHP очень прост в изучении. Это привлекает многих людей; однако, несмотря на его кажущуюся простоту, не так-то просто научиться использовать этот язык правильно и эффективно.

Язык PHP был специально разработан для web-программирования, и вопросам безопасности приложений уделялось много внимания, однако некорректная настройка интерпретатора и собственные ошибки PHP-программиста могут поставить под угрозу ваши разработки.

PHP уже стал зрелым языком, легким в изучении и работающим на многих платформах. Однако за его гибкость и легкость использования приходится платить системными ресурсами. PHP, как все интерпретируемые языки, должен перед выполнением компилироваться в код, понятный платформе, на которой работает. Интерпретируемый код может сильно ухудшить производительность, особенно на слабой или перегруженной машине, потому что затрачивается много времени на обработку кода. PHP скрипт работает достаточно быстро, но не так быстро как заранее скомпилированная программа.

Интерпретируемый код может сильно ухудшить производительность, особенно на слабой или перегруженной машине, потому что затрачивается много времени на обработку кода. PHP скрипт работает достаточно быстро, но не так быстро как заранее скомпилированная программа.

Интерпретатор PHP4, который называется Zend Engine, имеет два компонента: компилятор и исполняющий модуль (как дополнительные модули существуют: сложная система буферизации, значительно ускоряющая частоповторяемые запросы, и многопроходный оптимизатор). Компилятор просматривает ваш скрипт за один проход (в PHP3 скрипт интерпретируется построчно), компилирует его и затем передает исполняющему модулю.

На рисунке представлена упрощенная структура выполнения запроса. Номерами отмечен порядок выполнения запроса.

Общие ошибки в разработке.

Неоправданное использование РНР (например, для ООП).

Использование PHP целесообразно при создании часто обновляемых либо громоздких в написании программ, скорость выполнения для которых не является критическим параметром (имеется в виду, что если разница между временем выполнения скрипта на С и скрипта на PHP составляет 10-20%, то вполне можно предпочесть скорость разработки скорости выполнения) и необходимости быстрого создания полнофункционального приложения.

Однако если вы задумываете ваше приложение как полностью объектно-ориентированное, то, возможно, вам следует обратиться к специализированным языкам, таким как Python и Ruby, или использовать связку PHP – Java. PHP хоть и поддерживает основные объектно-ориентированные конструкции, но далеко не в полном объеме (не поддерживаются защищенные члены класса, множественное наследие).

Если необходимо создание высокопроизводительных приложений, обрабатывающих много запросов в секунду (например, систему баннерной сети), то стоит использовать предкомпилируемые языки.

Плохо комментированный код.

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

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

Существует несколько основных принципов:

Неудобные для понимания имена переменных и функций.

Используйте единую систему именования переменных и функций во всех своих программах.

Наиболее типичные ошибки:

Пример удачного именования:

$username = 'sterling';
$password = 'secret';
$teachers = array ('Sadlon',
'Lane',
'Patterson',
'Perry',
'Sandler',
'Mendick',
'Zung');
foreach ($teachers as $teacher);

Пример плохого именования:

$username_for_database = 'sterling';
$guMbi = 'secret'; // for the $password
$thelastnamesofteachers = array ('Sadlon',
'Lane',
'Patterson',
'Perry',
'Sandler',
'Mendick',
'Zung');
foreach ($thelastnamesofteachers as $TeaChER);

Переписывание стандартных функций.

Не стоит писать свои функции вместо уже имеющихся стандартных.

Например, чтобы разбить строку на части используйте функцию:

array explode (string separator, string string [, int limit])

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

Нет корректной обработки ошибок.

Никогда не забывайте об исключительных ситуациях: если во время тестирования все работает нормально, это не значит, что когда-нибудь не произойдет ошибка.

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

Например, подключение к базе данных:

$conn = @sql_connect ($host, $user, $pass);
if (!$conn) {
die (sprintf ("Error [%d]: %s", sql_errno (), sql_error ()));
}

Причем вместо die() лучше вызвать собственную функцию обработчик ошибки, которая выдаст пользователю внятное объяснения проблемы в виде HTML странички.

Смешан PHP и HTML код.

Попробуйте сделать код как можно более модульным. Потом вам (и другим тоже) можно будет сменить дизайн страницы без изменения кода PHP.

Многие рекомендуют объединять код HTML (интерпретируемый на стороне клиента) и код PHP (выполняемый сервером) в один большой файл. Для маленьких сайтов это, возможно, неплохо. Но, когда ваш сайт начнет расти, вы можете столкнуться с проблемами при необходимости добавить какие-либо новые функции. Такой стиль программирования приводит к очень «непослушному» и громоздкому коду.

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

Например, так:

<?php include_once ("site.lib"); ?>
<html>
<head>
<title><?php print_header (); ?></title>
</head>
<body>
<h1><?php print_header (); ?></h1>
<p><?php print_text (); ?></p>
</body>
</html>

Или использовать шаблоны: некоторые элементы дизайна заменяются пользовательскими тегами, а сама программа сканирует файл на предмет их наличия и заменяет их необходимой информацией.

Пример использования шаблонов:

<html>
<head>
<title>%%PAGE_TITLE%%</title>
</head>
<body %%BODY_PROPERTIES%%>
<h1>%%PAGE_TITLE%%</h1>
<p>%%MAIN_TEXT%%</p>
</body>
</html>

Применение шаблонов более логично, к тому же редактирование дизайна документа не требует знаний PHP, однако это все же более медленный способ – ведь надо сканировать весь шаблон, и лишь потом выводить данные (естественно этот процесс автоматизирован – существует несколько готовых библиотек, самая известная из которых fasttemplate).

Использование чужого кода, не разобравшись в нем.

Использование чужих разработок, несомненно, ускоряет создание приложений, однако не стоит слепо копировать чужой код - он может повести себя не совсем так, как вы предполагали вначале. Возможно, это будет совершенно незаметная на первый взгляд деталь.

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

Используйте источники, которые вызывают доверие, например архив PEAR (http://pear.php.net/)

Дублирование функций базы данных.

Многие начинающие программисты вместо того, что бы воспользоваться базой данных пытаются создать свою реализацию программы хранения, поиска и сортировки данных – в большинстве случаев гораздо удобнее и быстрее воспользоваться базой данных (например, MySQL).

Например, вместо сортировки средствами PHP:

$statement = "SELECT name, email, phone FROM some_table ";
$statement .= "WHERE name IS LIKE '%baggins'";
$result = @sql_db_query ($statement, "samp_db", $conn);
if (!$result) {
die (sprintf ("Error [%d]: %s", sql_errno (),sql_error ()));
}
while ($row = @sql_fetch_array ($result)){
$matches[ $row[name] ] = array ($row[email],
$row[phone]);
}
ksort ($matches);

Лучше использовать сортировку на стороне сервера БД:

$statement = "SELECT name, email, phone FROM some_table ";
$statement .= "WHERE name IS LIKE '%baggins' ORDER BY name";

Хотя стоит оговориться, что иногда стоит взять часть нагрузки БД на сторону собственной программы, если БД сильно перегружена.

Ошибки, понижающие производительность системы.

Использование старых версий интерпретатора.

Старайтесь использовать новые версии программных инструментов, как правило, они работаю быстрее и надежнее (так компания Zend Technologies, имеющая в своем составе много разработчиков и архитекторов языка PHP, утверждает, что скорость интерпретации кода в PHP4 увеличилась на 20-100% по сравнению с PHP3).

Это не означает, что при появлении первой альфа версии нужно ее тут же устанавливать (в ней еще могут быть недоработки и еще не найденные разработчиками ошибки), однако постарайтесь не отставать от прогресса.

Необоснованное применение функций.

Не следует использовать сложные функции там, где можно использовать простые и более быстрые.

Например, функцию printf() следует использовать только для вывода форматированных данных (при необходимости вывода переменной в формате с плавающей запятой с определенной точностью, либо в любом другом случае, когда возникает необходимость изменения формата выводимых данных). Вызов функции printf() зачастую используется там, где следовало бы использовать print(). В следующем примере функция printf() используется для вывода четырех переменных:

$name = 'Sterling Hughes';
$job = 'Senior Engineer';
$company = 'DesignMultimedia';
$email = 'shughes@designmultimedia.com';
printf ( "Меня зовут %s\n<br>\n
Я работаю %s, %s\n<br>\n
Мой адрес E-mail:%s\n<br>\n",
$name, $job, $company, $email );

В данном случае возможно (и желательно!) применение print():

print "Меня зовут $name\n<br>\n
Я работаю в $company, $job\n<br>\n
Мой адрес E-mail: $email\n<br>\n";

Функция printf() форматирует свои аргументы перед выводом. Таким образом, время ее выполнения больше, чем для функций print() или echo().

Медленная работа с регулярными выражениями.

Старайтесь при работе с регулярными выражениями всегда, когда это возможно, использовать preg, эта функция выполняется на порядок быстрее ereg.

Опять же, если вам нужно только произвести замену в какой-то строке – для повышения быстродействия лучше использовать специализированную функцию str_replace.

Слишком много временных переменных

Многие используют временные переменные там, где без них вполне можно было бы вполне обойтись.

Типичный пример лишней переменной:

<?php
$tmp = date ("F d, h:i a"); // т.е. формат даты February 23, 2:30 pm
print $tmp;
?>

Когда можно написать просто:

<?php
print date ("F d, h:i a");
?>

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

ООП   PHP   web   4GL - визуальные среды

Знаете ли Вы, что, как ни тужатся релятивисты, CMB (космическое микроволновое излучение) - прямое доказательство существования эфира, системы абсолютного отсчета в космосе, и, следовательно, опровержение Пуанкаре-эйнштейновского релятивизма, утверждающего, что все ИСО равноправны, а эфира нет. Это фоновое излучение пространства имеет свою абсолютную систему отсчета, а значит никакого релятивизма быть не может. Подробнее читайте в FAQ по эфирной физике.

НОВОСТИ ФОРУМАФорум Рыцари теории эфира
Рыцари теории эфира
 20.09.2019 - 04:36: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от Вячеслава Осиевского - Карим_Хайдаров.
18.09.2019 - 12:08: НОВЫЕ ТЕХНОЛОГИИ - New Technologies -> ПРОБЛЕМА ИСКУССТВЕННОГО ИНТЕЛЛЕКТА - Карим_Хайдаров.
18.09.2019 - 06:01: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от Л.Г. Ивашова - Карим_Хайдаров.
17.09.2019 - 05:51: ВОЙНА, ПОЛИТИКА И НАУКА - War, Politics and Science -> ФАЛЬСИФИКАЦИЯ ИСТОРИИ - Карим_Хайдаров.
17.09.2019 - 05:41: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от Андрея Тиртхи - Карим_Хайдаров.
16.09.2019 - 18:21: ЭКОНОМИКА И ФИНАНСЫ - Economy and Finances -> ПРОБЛЕМА КРИМИНАЛИЗАЦИИ ЭКОНОМИКИ - Карим_Хайдаров.
16.09.2019 - 03:11: СОВЕСТЬ - Conscience -> РУССКИЙ МИР - Карим_Хайдаров.
14.09.2019 - 18:23: ПЕРСОНАЛИИ - Personalias -> WHO IS WHO - КТО ЕСТЬ КТО - Карим_Хайдаров.
13.09.2019 - 09:08: ЭКОЛОГИЯ - Ecology -> Биологическая безопасность населения - Карим_Хайдаров.
12.09.2019 - 17:47: ВОЙНА, ПОЛИТИКА И НАУКА - War, Politics and Science -> РАСЧЕЛОВЕЧИВАНИЕ ЧЕЛОВЕКА. КОМУ ЭТО НАДО? - Карим_Хайдаров.
08.09.2019 - 03:42: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от О.Н. Четвериковой - Карим_Хайдаров.
07.09.2019 - 07:36: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Декларация Академической Свободы - Карим_Хайдаров.
Bourabai Research Institution home page

Bourabai Research - Технологии XXI века Bourabai Research Institution