Авторские статьи Ajax и [без]опасность. Сравнительный обзор и анализ

Discussion in 'Статьи' started by Helios, 29 Mar 2007.

  1. Helios

    Helios Elder - Старейшина

    Joined:
    14 Jan 2007
    Messages:
    414
    Likes Received:
    180
    Reputations:
    103
    AJAX и [без]опасность. Сравнительный обзор и анализ​

    Архитектура web-приложений
    В традиционных web-приложениях (не использующих AJAX) основная нагрузка на клиентской стороне ложится на браузер: он и данные от пользователя принимает, и HTTP-запросы отправляет/обрабатывает. JavaScript используется только для простой логики и оптимизации: проверить равенство одинаковых паролей, etc…

    Запросы браузера обрабатываются на сервере: внутренняя логистика (PHP, PERL, ASP, ASPX, JSP, etc) проверяет данные пользователя, обрабатывает их (возможно, используя базы данных) и отправляет ответ пользователю.

    Схема работы традиционного web-приложения:
    [​IMG]
    http://heliosart.info/images/others/image001.gif

    Минусы традиционной структуры:
    • Большая пауза между запросом пользователя и ответом сервера
    • Традиционные приложения не работают с пользователем на клиентской стороне
    Основные факторы, влияющие на задержку:
    • Время запроса
    • Время ответа
    • Ширина канала связи
    • Время обработки на сервере

    Что такое AJAX?
    AJAX (Asynchronous JavaScript and XML, асинхронный JavaScript и XML) – это не какая-то отдельная технология или язык, а принцип разработки интерактивных web-страниц и приложений. Ее датой рождения принято считать 18 февраля 2005 года – день выхода в свет статьи Джесси Джеймса Гарретта «Новый подход к web-приложениям». Технология эта довольно молодая, поэтому освоить ее в полной мере смогли не многие сайты.

    Впервые этот принцип начала использовать компания Microsoft, реализовав в своем браузере класс XMLHttpRequest для работы с web-версией Outlook. Затем последовали реализации в браузерах Mozilla, Apple Safari и Opera.

    Сейчас технология AJAX применяется на многих сайтах, особенно в этом усердствует компания Google, использующая ее в значительной части своих сервисов. К примеру: gmail.com, maps.google.com, Google Suggest, Google Spell-check.

    Архитектура AJAX-приложений
    В клиентской части AJAX-приложения главную роль играет JavaScript:
    • Отправляет HTTP-запрос
    • Производит моментальный отзыв на действия пользователя
    • Страница продолжает реагировать на события, действия пользователя
    • По событию обрабатывает ответ сервера и манипулирует DOM согласно результату запроса

    [​IMG]
    http://heliosart.info/images/others/image002.gif

    Вся технология AJAX основана на объекте XmlHttpRequest, при помощи которого и происходит отправка запроса и получение ответа от сервера.

    Вот пример реализации:
    Code:
    function LoadXMLDoc(url)
    {
    	req = new XmlHttpRequest();
    	req.onreadystatechange = processReqChange;
    	req.open('get', url, true);
    	req.send(null);
    }
    
    function processReqChange()
    {
    	if(req.readyState == 4)
    {
    	if(req.readyStatus == 200)
    	{
    	//process response…
    	}
    	else
    	{
    	//handle error…
    	}
    }
    }
    
    Объект XmlHttpRequest позволяет отправлять любые HTTP запросы:
    • GET
    • POST
    • HEAD
    • WebDav COPY
    • WebDav DELETE

    С помощью XmlHttpRequest можно загружать любые типы ресурсов: XML, HTML, простой текст, графику, Flash-ролики, скрипты и другой медиа-контент.

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

    Сама технология AJAX безобидна и безопасна, но ее реализация может сделать из нее опасного зверя.

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

    Приложение на сервере возвращает целую страницу с ответом.

    Атака состоит в отправке специально сформированного запроса:
    • Отправка сообщения с HTML-кодом (XSS)
    • Загрузка неправильной картинки с целью взлома (загрузка Shell'а)
    • Вставка служебных символов в запрос (SQL Injection, php injection, pipe)
    • Запрос ресурсов, к которым нет доступа

    Методы защиты:
    • Проверка всех(!) поступающих данных
    • Распределение полномочий в проверке между клиентской и серверной стороной:
    клиент – удобство, сервер – безопасность.

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

    В теории все просто, но что мы видим на практике?
    Уязвимости web-приложений на каждом углу. Согласно последним данным, уязвимо 75% всех ресурсов в сети Internet. Большинство сообщений в почтовых рассылках посвящено web-уязвимостям.

    При использовании технологии AJAX при построении приложения логистика распределяется между клиентом и сервером. JavaScript реагирует на команды пользователя, делает функциональные запросы к серверу:
    • Получить цену для товара
    • Получить список городов для заданной области/штата
    • Получить последний правильный адрес для пользователя
    • Обновить данные о пользователе в базе

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

    При такой реализации взломщик находится ВНУТРИ приложения. Он может узнать имена функций и переменных, параметры функций, их типы и допустимые значения.

    Теперь он не ищет среди ограниченного числа параметров те, через которые можно произвести атаку, а исследует API приложения прямо изнутри его.
    Также при атаке он может использовать «доверие» серверной части приложения к данным, полученным от клиентской части.

    Методы защиты:
    Фильтрация данных, полученных из форм. Проверка типов файлов, загружаемых пользователем, особое внимание обратить на графические данные (WMF, многочисленные уязвимости в PNG/JPG).

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

    Под конец, пример из реального приложения Microsoft «Atlas» Framework:

    Code:
    [WebMethod]
    public string updatePassword(string custID, string newPassword)
    {
    	//connect to sql server (strCn defined earlier)
    SqlConnection conn = new SqlConnection(strCn);
    	//create query
    	string q = "UPDATE tblUser SET Password = '" + newPassword + "' WHERE CustomerID = '" + custID + "'";
    	SqlCommand cmd = new SqlCommand(q, conn);
    	cmd.ExecuteNonQuery();
    	
    	return "Password updated to " + newPassword;
    }
    
    Без комментариев, как говорится…
     
    #1 Helios, 29 Mar 2007
    Last edited: 2 Jun 2007
    4 people like this.
  2. Algol

    Algol New Member

    Joined:
    29 May 2002
    Messages:
    1,759
    Likes Received:
    4
    Reputations:
    0
    Написать глупость можно на любом языке и в любой технологии. Это вовсе не означает что технология плоха. Лично я не вижу особых отличий АЯКСа от обычного WEB, за исключением того, что обновляется не вся страница а только ее часть. Реализовывать же бизнес-логику на стороне клиента - никто не заставляет, она полюбому должна быть на стороне сервере и в web и в AJAX.
     
  3. guest3297

    guest3297 Banned

    Joined:
    27 Jun 2006
    Messages:
    1,246
    Likes Received:
    639
    Reputations:
    817
    Нету информативности.
    То что язык осваиваеться знаеют все и на начальной стадии все допускают ошибки.