Что касается этого взломанного блога , я не решаюсь реализовать предложенные решения по борьбе с JSON GET, так как
Рекомендованные решения для уменьшения использования JSON.задействовать незаполненные REST JSON POST для получения данных
Альтернативное решение (обтекание объекта) вызывает проблемы со сторонними элементами управления, к которым у меня нет доступа к исходному коду.
Я не могу найти проверенную сообществом реализацию, которая реализует Альтернативное решение (приведенное ниже) о том, как создать токен безопасности или безопасно доставить его на веб-странице.Я также не буду утверждать, что мне достаточно эксперта, чтобы развернуть мою собственную реализацию.
На заголовки реферера нельзя положиться
Справочная информация
В этом блоге описывается проблема CSRF, связанная с перехватом JSON, и рекомендуется использовать JSON POST для получения данных.Поскольку использование HTTP POST для получения данных не очень полно REST, я бы искал более RESTfull решение, которое позволяет выполнять действия REST для сеанса или для страницы.
Еще один способ смягчения - это упаковка данных JSON.в объекте , как описано здесь .Боюсь, что это может просто отсрочить проблему, пока не будет найден другой метод.
Альтернативная реализация
Мне кажется естественным расширить использование AntiForgeryToken в ASP.NET MVC с jQuery HTTP GET для моего JSON.
Например, если я получаю некоторые конфиденциальные данные, в соответствии со ссылкой Haacked выше, следующий код уязвим:
$.getJSON('[url]', { [parameters] }, function(json) {
// callback function code
});
Я согласен, что НЕ ПОЛУЧИТЬ ПОЛУЧИТЬ данные, используя рекомендованный метод POST.Моя мысль состоит в том, чтобы отправить токен проверки в URL.Таким образом, злоумышленник в стиле CSRF не будет знать полный URL.Кэшированные или не кэшированные, они не смогут получить данные.
Ниже приведены два примера того, как можно выполнить запрос JSON GET.Я не уверен, какая реализация наиболее эффективна, но могу предположить, что первая из них более безопасна от ошибочных прокси-серверов, кэширующих эти данные, что делает ее уязвимой для злоумышленника.
http://localhost:54607/Home/AdminBalances/ENCODEDTOKEN-TOKEN-HERE
или
http://localhost:54607/Home/AdminBalances?ENCODEDTOKEN-TOKEN-HERE
... который также может быть AntiForgeryToken MVC3 или его вариант ( см. swt ).Этот токен будет установлен как встроенное значение для любого формата URL, выбранного выше.
Примеры вопросов, которые мешают мне использовать собственное решение
Какой формат URL (выше) вы бы использовали для проверки JSON GET (косая черта, вопросительный знак и т. Д.) Будет ли прокси отвечать на http://localhost:54607/Home/AdminBalances с http://localhost:54607/Home/AdminBalances?ENCODEDTOKEN-TOKEN-HERE данными?
Как бы вы доставили этот закодированный токен на веб-страницу?Встроенный или как переменная страницы?
Как бы вы составили токен?Встроенный AntiforgeryToken или каким-либо другим способом?
AntiForgeryToken использует cookie.Будет ли в этом случае использоваться резервный файл cookie?Только HTTP?А как насчет SSL в сочетании с HTTP Only?
Как бы вы установили заголовки кеша?Что-нибудь особенное для Google Web Accelerator (например)
Каковы последствия простого создания JSON-запроса SSL?
Должен ли возвращаемый результатМассив JSON все еще будет обернут в объект только ради безопасности?
Как это решение будет взаимодействовать с предлагаемыми Microsoft шаблонизацией и связыванием данных функциями
Приведенные выше вопросы являются причинами, по которым я не продвигаюсь вперед и делаю это сам.Не говоря уже о том, что, вероятно, есть еще вопросы, о которых я не задумывался, но все же есть риск.