Я создал базовый CRUD API с помощью Dropwizard и Spring. В теле объекта ответа я получаю следующее:
)]}',
{
"id":10,
"initiator":2,
"target":1,
"statusId":1,
"created":"2018-04-30T14:45:01.173"
}
Я проверил API с помощью curl, postman и программно во время тестирования, будьте уверены, недопустимые символы )]}',
присутствуют всегда. Почтальон, кажется, способен игнорировать их и отображать довольно распечатанный вывод, однако будьте уверены, и я предполагаю, что большинство парсеров JSON не могут правильно его проанализировать.
Вопросов:
Я много лет писал REST API и никогда не видел ничего подобного. Я впервые использую dropwizard, поэтому я оптимистично надеюсь, что это некоторая конфигурация, которую я пропустил.
Помимо недопустимых символов, функционально API работает нормально.
Это унаследованная кодовая база, и другие API также возвращают эти символы. В целях тестирования, будьте уверены, недопустимые символы отфильтровываются перед обработкой ответа. Хотя в краткосрочной перспективе это кажется мне приемлемым обходным путем, в долгосрочной перспективе всем будущим потребителям API придется выполнять обходной путь, и в идеале это должно быть исправлено в самом API.
Не знаю о DropWizard, но он предназначен для предотвращения взлома json.
Весной есть класс MappingJackson2HttpMessageConverter.
который имеет ту же функцию, но другой префикс "{} &&"
/**
* Indicate whether the JSON output by this view should be prefixed with "{} &&". Default is false.
* <p>Prefixing the JSON string in this manner is used to help prevent JSON Hijacking.
* The prefix renders the string syntactically invalid as a script so that it cannot be hijacked.
* This prefix does not affect the evaluation of JSON, but if JSON validation is performed on the
* string, the prefix would need to be ignored.
*/
public void setPrefixJson(boolean prefixJson) {
this.prefixJson = prefixJson;
}
Вы можете относиться к этому.
Изменить 1: Spring версии 4.2.0.RELEASE и далее, префикс по умолчанию обновлен до )]} ',
Спасибо за это. Определенно указал мне в правильном направлении, чтобы понять, что происходит. Интересно, что в javadoc, с которым вы связались, говорится: «Укажите, должен ли вывод JSON этого представления иметь префикс«)]} ', ». По умолчанию - false». Так что, по крайней мере, в текущей версии документов префикс совпадает с тем, что было установлено моей кодовой базой! Интересно, почему Spring изменил его и является ли это новое значение стандартом. Удачи в поисках этого в Google (глаза).
Плохо, я на самом деле скопировал javadoc из моей рабочей области eclipse, в которой была версия spring 3.1.4, но я предоставил ссылку javadoc из Spring версии 5.0.5.
Итак, сегодня я узнал о неразборчивом беспорядочном соглашении, которое предотвращает захват JSON. Я действительно должен был знать об этом! Моя кодовая база специально добавляла эту строку, и все потребители API удаляли ее перед обработкой.