Ответы JSON могут быть использованы с помощью переопределения конструкторов Array или если враждебные значения не являются бегущими по строкам JavaScript.
Предположим, что оба этих вектора адресованы обычным образом. Google лихо захватывает прямой ответ JSON, предварительно прикрывая все JSON чем-то вроде:
throw 1; < don't be evil' >
И затем следуют остальные JSON. Поэтому д-р Зел не может, используя описанный здесь эксплойт http://sla.ckers.org/forum/read.php?2,25788, получит ваш файл cookie (при условии, что вы вошли в систему), поставив следующие на его сайте:
<script src="http://yourbank.com/accountStatus.json">
Что касается правил экранирования строк, хорошо, если мы используем двойные кавычки, нам нужно префикс каждого с обратной косой чертой и каждый обратный слэш с другой обратной косой чертой и т.д.
Но мой вопрос: что, если вы все это делаете?
Burpsuite (автоматизированный инструмент безопасности) обнаруживает встроенные попытки XSS, которые возвращаются unHTML-экранированным в ответ JSON и сообщает об этом как уязвимость XSS. У меня есть отчет о том, что мое приложение содержит уязвимости такого рода, но я не уверен. Я пробовал это, и я не могу выполнить работу эксплойта.
Поэтому я не думаю, что это правильно, но я прошу сообщество StackOverflow взвесить.
Существует один конкретный случай, когда я использую sniffing типа IE MIME, который, как я думаю, может привести к эксплойту. В конце концов, в IE 7 по-прежнему была "функция", в которой теги script, встроенные в комментарии к изображениям, выполнялись независимо от заголовка Content-Type. Пусть сначала оставить такое явно глупое поведение.
Разумеется, JSON будет анализироваться либо на основе собственного парсера JavaScript (Window.JSON в Firefox), либо на eval() в соответствии со старым поведением jQuery по умолчанию. В любом случае это не приведет к выполнению следующего предупреждения:
{"myJSON": "legit", "someParam": "12345<script>alert(1)</script>"}
Я прав, или я не прав?