Рекомендации по безопасности JSON? - PullRequest
73 голосов
/ 28 декабря 2008

Исследуя проблему JSON против XML , я столкнулся с этим вопросом . Теперь одной из причин предпочитать JSON была названа простота преобразования в Javascript, а именно с eval(). Теперь это сразу показалось мне потенциально проблематичным с точки зрения безопасности.

Итак, я начал изучать аспекты безопасности JSON и в этом посте в блоге о том, что JSON не так безопасен, как думают люди, . Эта часть торчала:

Обновление: Если вы делаете JSON 100% правильно, тогда у вас будет только объекты на верхнем уровне. Массивы, Строки, числа и т. Д. Все будут завернуты. Объект JSON тогда потерпит неудачу в eval (), потому что JavaScript переводчик будет думать, что смотрит на блок, а не объект. это имеет большое значение для защиты от эти атаки, однако это все еще лучше чтобы защитить ваши безопасные данные с непредсказуемые URL.

Хорошо, вот хорошее правило для начала: объекты JSON на верхнем уровне всегда должны быть объектами, а не массивами, числами или строками. Звучит как хорошее правило для меня.

Есть ли что-то еще, что можно сделать или избежать, когда речь идет о безопасности, связанной с JSON и AJAX?

В последней части приведенной выше цитаты упоминаются непредсказуемые URL-адреса. У кого-нибудь есть больше информации об этом, особенно, как вы делаете это в PHP? Я гораздо более опытен в Java, чем в PHP, и в Java это легко (в том смысле, что вы можете отобразить весь диапазон URL-адресов на один сервлет), тогда как весь PHP, который я сделал, сопоставил один URL-адрес с PHP-скриптом.

Кроме того, как именно вы используете непредсказуемые URL-адреса для повышения безопасности?

Ответы [ 3 ]

53 голосов
/ 10 января 2009

Существует несколько атак безопасности на JSON, особенно XSRF.

Уязвимость возникает, когда веб-служба использует файлы cookie для проверки подлинности и отвечает массивом JSON, содержащим конфиденциальные данные, в ответ на запрос GET.

Если злоумышленник может обмануть пользователя, вошедшего в службу naive-webapp.com, при посещении его сайта (или любого сайта, который встраивает IFRAME, которым он управляет, например, с помощью встроенной рекламы), он может вставить <script> тег с SRC на naive-webapp.com, и, возможно, украсть данные пользователя. Это зависит от причуды JavaScript с конструктором JavaScript Array, например:

 <script>
   // Overload the Array constructor so we can intercept data
   var stolenArrays = [];
   var RealArray = Array;
   Array = function () {
     var arr = RealArray.apply(arguments);
     stolenArrays.push(arr);
     return arr;
   }
 </script>
 <!-- even though the attacker can't access the cookies,
   - he can cause the browser to send them to naive-webapp.com -->
 <script src="//naive-webapp.com/..."></script>
 <script>
   // now stolenArrays contains any data from the parsed JSON
 </script>

В EcmaScript 5 исправлено сбивающее с толку поведение, из-за которого [] просматривал Array на глобальном объекте, и многие современные браузеры больше не подвержены этой атаке.

Кстати, Oil ошибается насчет непредсказуемых URL. Криптографически безопасные случайные идентификаторы в URL-адресах - прекрасный способ защитить ресурсы. Безопасность, основанная на идентичности, не является панацеей, как предполагает нефть. См. http://waterken.sourceforge.net/ для примера схемы защищенного распределенного приложения, основанной на криптографически безопасных идентификаторах в URL, которая не требует понятия идентичности.

EDIT:

Рассматривая JSON против XML, вы должны также знать о специфических векторах атаки XML.

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

<!DOCTYPE root 
[
<!ENTITY foo SYSTEM "file:///c:/winnt/win.ini">
]>
...
<in>&foo;</in>

Приложение встраивает входные данные (параметр "in", содержащий файл win.ini) в ответ веб-службы.

18 голосов
/ 28 декабря 2008

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

Когда люди говорят об уникальных URL-адресах, они обычно НЕ означают http://yourbank.com/json-api/your-name/big-long-key-unique-to-you/statement. Вместо этого более распространено делать что-то еще в запросе уникальным; а именно значение в сообщении FORM или параметр URL.

Обычно это случайный токен, вставленный в ФОРМУ на стороне сервера и проверенный при выполнении запроса.

Массив / объект для меня новость:

Script-Tags: злоумышленник может вставить тег script, указывающий на удаленный сервер и браузер будет эффективно eval () ответ для вас, однако это выбрасывает ответ и с тех пор JSON - это все ответы, вы в безопасности.

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

3 голосов
/ 28 декабря 2008

все еще лучше для защиты ваших безопасных данных с помощью непредсказуемых URL.

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

Если вы используете JSON для экспорта данных анонимной третьей стороне (например, веб-сервис). Одним из примеров является API различных веб-сервисов Google, где анонимные пользователи получают доступ к Google-данным через другие веб-сайты. Они используют домен-реферер и ключи API, чтобы убедиться, что веб-сайт посредника может предоставлять данные Gooogle.

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


Редактировать: чтобы продемонстрировать, что они имеют в виду, подумайте об этом. Представьте, что ваш банк предоставил JSON API для получения выписок. Если бы я мог просто набрать http://yourbank.com/json-api/your-name/statement, вы, вероятно, были бы не в восторге.

Они могут генерировать уникальную строку для вашей учетной записи, которая требуется в любом запросе JSON, например: http://yourbank.com/json-api/your-name/big-long-key-unique-to-you/statement

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...