Теоретические основы веб-программирования PHP

Автор: Пользователь скрыл имя, 01 Февраля 2013 в 09:00, статья

Краткое описание

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

Файлы: 1 файл

Отчет по практике HTML_1.docx

— 62.12 Кб (Скачать)

Теоретические основы веб-программирования PHP

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

Узкими местами веб-приложения являются места обработки приходящих извне данных. Давайте подумаем, какие данные скрипт может получать из внешних по отношению к себе источников:

  • GET и POST-данные. Конечно же, данные передаваемые пользователем в виде GET и POST-параметров. Это самый распространенный источник внешних данных, соответственно, самая большая доля уязвимостей приходится на него;
  • Куки. Те же пользовательские данные, другой метод их передачи;
  • Данные из БД. Запрашиваемые скриптом данные из базы данных;
  • Внешний контент. Внешний контент, который скрипт загружает в процессе работы. Например, сторонняя RSS-лента новостей и тому подобное.

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

База данных

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

$user = $_POST['user'];

$password = $_POST['password']; 

 

$sql = "SELECT Count(*) FROM users WHERE user = '$user' AND password = '$password' LIMIT 1"; 

 

//--Выполнение запроса и анализ  результата

Все предельно просто, но настораживает  отсутствие какой-либо обработки внешних  данных. Так, злоумышленник может  в качестве имени передать следующую  конструкцию:

admin'/*

и пустой пароль. В результате обработчик сформирует SQL-запрос:

SELECT COUNT(*) FROM users WHERE USER = 'admin'/*' AND password = '' LIMIT 1

(последовательность /* в SQL считается началом комментария, текст после него не учитывается) который авторизует его под администраторским аккаунтом без указания пароля. Данная уязвимость называется SQL-инъекция. Почему это произошло? Еще раз внимательно посмотрите на конструкцию. В ней передается символ ', который преждевременно закрывает строковый параметр в SQL-запросе, что дает возможность изменять конструкцию запроса. Чтобы избежать этого необходимо экранировать кавычки в строковых данных, которые используются в SQL-запросах. При экранировании в строке перед каждым управляющим символом ставится символ \, который подавляет управляющие функции символа. Для экранирования строковых данных, используемых для работы с MySQL используйте функцию mysql_real_escape_string. Модифицированный обработчик выглядит следующим образом:

$user = mysql_real_escape_string( $_POST['user'] );

$password = mysql_real_escape_string( $_POST['password'] ); 

 

$sql = "SELECT Count(*) FROM users WHERE user = '$user' AND password = '$password' LIMIT 1"; 

 

//--Выполнение запроса и анализ  результата

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

Нужно быть не менее бдительным с  работой с числовыми данными. Предположим, что на сайте существуют URL вида product.php?id=[число]. В скрипте product.php данные о продукте из базы данных получаются следующим образом:

$id = $_GET['id']; 

 

$sql = "SELECT * FROM products WHERE id = $id LIMIT 1"; 

 

//--Выполнение запроса и анализ  результата

И снова уязвимость. id никоим образом не обрабатывается, поэтому вместо числового идентификатора можно передать часть SQL-кода, который передастся на выполнение MySQL-серверу. Экранирование в данном случае не поможет, так как параметр в SQL-запросе не обрамлен кавычками (кстати, числовые значения можно также брать в кавычки для повышения надежности). Поэтому последуем следующему правилу: число должно быть обязательно числом в SQL-запросе. id во всех штатных ситуациях всегда будет числом, и только при вмешательстве злоумышленника там могут появиться какие-то строковые данные. Поэтому принудительно приводим входящий параметр id к числовому типу. Для этого в PHP существуют функция intval:

$id = intval( $_GET['id'] ); 

 

$sql = "SELECT * FROM products WHERE id = $id LIMIT 1"; 

 

//--Выполнение запроса и анализ  результата

Пример работы функции intval (вход — выход):

3 — 3

126 — 126

43hack — 43

hacked — 0

 

Контент

Следующий случай — когда внешние  данные используются для формирования контента страницы. Основная потенциальная проблема в этом случае — нежелательный HTML-код. Рассмотрим пример. На сайте имеется скрипт поиска search.php со следующим кодом:

//--Если передан парам. query, используем его, иначе пустую строку

$search = isset($_GET['query']) ? $_GET['query'] : '';

...

echo '<input type="text" name="query" value="' . $search . '" />';

...

То есть имеется форма с текстовым  полем для ввода поисковой  фразы. При поиске (GET-запросе) поисковая  фраза пользователя остается в поле. Все работает нормально пока в поле вводится обычный текст. Но если ввести:

" /><em>hacked!</em>

то после подстановки значения в поле получаем:

<input type="text" name="query" value="" /><em>hacked!</em>" />

Злоумышленником был закрыт HTML-тег  input и на страницу попал HTML-код. Такая уязвимость позволяет организовать пассивную XSS-атаку на сайт. Предотвратить это просто, достаточно фильтровать HTML-код там, где он не нужен. Для этого я рекомендую использовать функцию htmlspecialchars, которая преобразовывает управляющие HTML-символы в безопасные последовательности. В результате браузером HTML-код не интерпретируется, а отображается как есть. Использование:

//--Если передан парам. query, используем его, иначе пустую строку

$search = isset($_GET['query']) ? $_GET['query'] : '';

...

echo '<input type="text" name="query" value="' . htmlspecialchars($search) . '" />';

...

Теперь в случае ввода атакующего кода сформированное поле будет выглядеть  так:

<input type="text" name="query" value="&quot; /&gt;&lt;em&gt;hacked!&lt;/em&gt;" />

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

Файловая система

Иногда внешние данные используются для доступа к файловой системе. Допустим, на сайте существуют URL index.php?page=board, index.php?page=glory, index.php?page=contacts, в скрипте index.php обрабатывается это следующим образом:

$page = $_GET['page']; 

 

echo file_get_contents($page . '.txt');

Такой код уязвим. Злоумышленник  может в параметре передать путь к постороннему файлу и увидеть  его содержимое. Допустим, конфигурационного  файла:

/index.php?page=../config.php%00

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

$page = $_GET['page']; 

 

switch ($page)

{

    case 'board' : echo file_get_contents('board.txt'); break;

    case 'glory' : echo file_get_contents('glory.txt'); break;

    case 'contacts' : echo file_get_contents('contacts.txt'); break;

    default : ... ;

}

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

/etc/passwd — passwd

/home/joker/test.txt — test

Общие рекомендации

Помимо конкретных приемов, часть  которых мы рассмотрели выше, существуют и общие рекомендации, которые  повышают надежность сайта. К таким  можно отнести отключение вывода PHP-ошибок. В рабочей версии сайта  они совершенно ни к чему, а злоумышленнику будет намного сложнее вслепую  искать уязвимости, если даже таковые существуют. Отключить вывод ошибок можно параметром display_errors в конфигурационном файле PHP. Это также можно сделать в файле .htaccess:

php_flag display_errors off

или даже в самом PHP-скрипте:

ini_set('display_errors', 0);

При этом желательно включить логирование ошибок параметром log_errors, параметру error_reporting выставить значение E_ALL и регулярно просматривать error.log. В штатном режиме работы сайта этот файл должен оставаться пустым, в идеале. Советую придерживаться этого при разработке сайта.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Основные этапы разработки сайтов

Разработку  сайтов можно сравнить со строительством корабля! Не нужно иметь глубоких познаний в судостроении, чтобы понять, что корабль — это не просто огромный ящик, который не тонет  на воде.

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

Похожая ситуация складывается и при  разработке сайтов! Чтобы сайт мог  выдержать все трудности «дальнего  плавания в бушующем океане Интернета», при этом оставаясь удобным для  людей, ему требуется ни только хороший дизайн, но и грамотная структура, а так же надежная система управления.

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

  • Определение целей разработки сайта
  • Определение возможностей сайта
  • Создание макета и компановка
  • Создание внешней оболочки сайта

Определение целей  разработки сайта

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

Определение возможностей сайта

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

Например, если Вы решили создать небольшой  сайт-визитку (3-5 страничек), с целью  помочь потенциальным клиентам найти  вашу фирму в большом городе, совсем необязательно добавлять форум, ленту новостей, рассылку и поиск  по сайту. А вот Flash анимация с картой города могла бы быть очень кстати.

Создание макета и компановка

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

Рисунок 1 — Каркас сайта

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

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

 
Рисунок 2 — Каркас сайта с компановкой

На данном этапе уже предполагается иметь хотя бы «сырой» контент (информацию, наполняющую сайт). Контент — это самое главное! И поэтому, к этому вопросу мы подходим особенно скурпулёзно. Только тогда, когда информация на сайте отображается правильно, мы считаем что пол дела сделано и можно работать дальше.

Конечно, информация на сайте —  это не только работа Веб-студии, многое зависит и от клиента (особенно в дальнейшем), однако нельзя считать, что, например, размер шрифта на сайте или его цвет — это всего лишь особенность дизайна и дело вкуса. Нет! Грамотно подобрать шрифт и его размер — это целое искусство.

Создание внешней  оболочки сайта

Только  когда завершены все предыдущие этапы, в том числе и разработка контента, можно довести до конца и внешний облик сайта. Здесь уже работает и дизайнер, и тестировщики. Что касается тестировщиков — это тоже очень важный этап, позволяющий устранить недоработки и понять насколько удобен и понятен сайт в использование. И если все замечания устранены — можно считать разработку сайта законченным.

Рисунок 3 — Упрощенный вариант  внешней оболочки сайта

После того как пройдены все четыре основных этапа, включая тестирование, сайт размещается в Интернете, под  выбранным заранее именем (доменное имя, например intrnetshop.kz). Заказчик может увидеть свой сайт просто набрав его «имя» в своем браузере.

 

 

 

 

 

 

Pазработка дизайна сайта

Вёрстка

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

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

Мы выполняем поставленную задачу на профессиональном уровне. Четкое разделение обязанностей обеспечивает выполнение каждого этапа специалистами в своей области. Это позволяет нам повышать скорость работы и, самое главное, обеспечивать высокое качество web-сайтов.

Программирование

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

Информация о работе Теоретические основы веб-программирования PHP