JSON и безопасность браузеров

January 9, 2009 | By admin | Filed in: Javascript, JSON.

Перевод статьи с YUI Blog.

==

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

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

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

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

Никогда не доверяйте браузеру

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

Следите за чистотой данных

JSON является подмножеством JavaScript, что позволяет легко применять его в веб-приложениях. Текст, полученный от XMLHttpRequest, можно мгновенно превратить в структуру данных при помощи функции eval(). В то же время, ее использование крайне небезопасно. Если есть хоть малейшая вероятность того, что сервер неправильно кодирует JSON, нужно применять функцию parseJSON(), использующую регулярные выражения, чтобы гарантировать отсутствие в тексте опасных элементов. Данная функция будет встроена в следующую версию JavaScript. Пока же для ее использования понадобится файл http://www.JSON.org/json.js.

На сервере всегда используйте хорошие (де)кодировщики JSON.

Теги скриптов

Same Origin Policy не распространяется на теги скриптов. Это означает, что любой скрипт с любого сайта потенциально может быть загружен на любую страницу. Это может иметь весьма серьезные последствия.

Любая страница, подключающая скрипты с других сайтов, небезопасна. Внешние скрипты могут быть использованы для показа рекламы, настройки результатов поиска, ведения логов, а также многих других полезных вещей. К сожалению, при создании JavaScript и DOM подобное их использование не предусматривалось, поэтому никаких средств обеспечения безопасности в этом плане также не предусмотрено. Любой скрипт на странице имеет доступ ко всему ее содержимому. Когда вы загружаете на странице скрипт, вы даете ему доступ ко всей конфиденциальной информации пользователя. Вы также разрешаете скрипту делать запросы к серверу от лица пользователя. Невозможно отличить запросы, отправляемые пользователем, от запросов подключаемого скрипта. Будем надеяться, что в скором будущем браузеры будут содержать средства, сокращающие связанные с этим риски. А пока тэги скриптов являются чрезвычайно опасными.

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

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

Не отправляйте данные посторонним

Если ваш сервер отправляет важные данные странице злоумышленника, с большой вероятностью браузер эти данные доставит. В некоторых случаях Same Origin Policy может заблокировать такие попытки, но браузер – вещь дырявая, и в некоторых случаях данные будут переданы. В этом случае винить браузер бесполезно. Ответственность за передачу конфиденциальной информации лежит на сервере, и эту ответственность нельзя доверять браузеру.

Все запросы должны быть аутентифицированы. Должен существовать какой-то “секрет”, известный только странице, для того, чтобы только она могла получить важную информацию. Куки не являются достаточным средством аутентификации, поэтому в качестве “секрета” их использовать не стоит. В случае с JSON лучше всего использовать следующую схему работы: POST-запрос с “секретом” для получения JSON, и JSON-ответ сервера с новым “секретом”.

Поскольку теги скриптов не подчиняются Same Origin Policy, то они могут быть использованы на любой странице для отправки GET-запроса к вашему серверу. Такой запрос будет включать и ваши куки. Если ответ сервера подразумевает наличие конфиденциальной информации, сервер должен отклонить подобный запрос.

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

Ну и напоследок – всегда используйте SSL для передачи конфиденциальной информации или запросов для ее получения.


Tags: , , ,

2 comments on “JSON и безопасность браузеров

  1. Прок says:

    ссылки по теме…

    Развитие модели безопасности браузера связано со множеством предсказуемых и весьма неприятных[…]…

Leave a Reply