Чому безпечний тип XML?


30

Чому вони кажуть, що XML забезпечує безпеку типу і як це виражається в самому XML?

Чим він відрізняється від JSON (наприклад), який (наскільки я розумію) не безпечний?

Відповіді:


36

Через визначення схеми XML (XSD).

З XML ви можете мати додатковий файл, який описує схему. Він вказує, наприклад, що елемент /a/bє масивом і містить від 1 до 10 елементів, або що елемент /a/cє цілим числом. Ви можете знайти приклад XSD тут .

Перевірка даного файлу XML через XSD підтримується багатьма мовами . Наприклад, програма .NET може запросити XML-файл з ненадійного джерела і перевірити , чи відповідає він XSD ; тоді він може зберегти його до бази даних Microsoft SQL Server, яка може, в свою чергу, містити XSD і зробити перевірку ще раз (щоб гарантувати, що будь-який клієнт, який має доступ до бази даних, відповідає).

XSD - не єдина мова.

  • Якщо ви зайнялися веб-розробкою, ви, звичайно, чули про визначення типу документа (DTD) - мова розмітки, яка визначає структуру XML і використовується особливо для перевірки вмісту, пов’язаного з HTML. Хоча він не може зробити все, що може XSD, наприклад, забезпечити, що елемент або атрибут містить ціле число, він все одно може виконувати купу перевірок структури.

  • Перевага RELAX NG є порівняно простою порівняно з іншими мовами і може бути написана у більш компактній формі, ніж XML.

  • Schematron - це ще одна «мова підтвердження на основі правил для тверджень про наявність чи відсутність шаблонів у XML-деревах» ( Wikipedia ) і представляє дещо інший підхід, заснований на твердженнях XPath.

Подібні ініціативи для JSON не настільки популярні (особливо, я вважаю, у корпоративному світі, орієнтованому на Microsoft). Однією з причин є те, що JSON призначений для ситуацій, коли структура даних є досить базовою (тобто може бути виражена як дерево, наприклад, без необхідності атрибутів) і не обов'язково потрібно перевіряти. Прекрасний приклад - API REST, що використовується мовою, що динамічно набирається:

  • клієнт дуже легко і швидко реалізувати,
  • API довіряється не змінюватися,
  • клієнт може легко мати справу з конкретними листами, коли необхідна перевірка (наприклад, перевірка, що /something/percentageце дійсна кількість і знаходиться в діапазоні 0..100).

20

XML може бути безпечним для типу, оскільки за допомогою XSD-схем можна оголошувати тип даних елементів. Документ, затверджений на схемі XSD, гарантовано відповідає очікуваним типам. Але формат XML не повинен мати схему, тому документ не вводиться автоматично безпечно, лише будучи XML.

Насправді існує мова схеми для JSON , тому введіть безпечний JSON. Але він використовується рідко, тому зазвичай JSON не є безпечним.


2
Ваша відповідь була б кращою з іменем або посиланням на JSON, еквівалентному XSD.
DougM

1
BTW: Схема XML на сьогоднішній день не є єдиною мовою визначення схеми для XML. Також є Schematron, RelaxNG, і звичайно хороший ol 'SGML DTD.
Йорг W Міттаг

Також майте на увазі, що навіть за допомогою схеми XML може не бути безпечним для типу. Можна вказати елемент, який має "будь-який" тип вмісту. Хоча можна стверджувати, що це форма безпеки типу (мені байдуже, що все справедливо), в той же час жодна перевірка не може бути виконана: це, по суті, тип "варіант".

3

В інформатиці безпека типу - це те, наскільки мова програмування відлякує або запобігає помилкам типу.

Безпека типу не є абсолютним атрибутом. Це не буле. Мови (а XML і JSON - це мови) дозволяють і запобігають різного роду помилок і помилок. Наприклад, ви можете неправильно називати елементи. Але ви не можете пропустити необхідні синтаксичні елементи, такі як закривання тегів і дужок.

Прості XML та JSON майже однаково безпечні для типу (або небезпечні для типу). Дійсний рядок XML / JSON має певну синтаксичну та семантичну структуру, але цього майже ніколи не вистачає, щоб програма працювала з ним. Додатки не тільки який - або на структуру , але конкретний один.

XML сяє з визначенням схеми XML (XSD), що є гнучким та потужним способом перевірки даного документа XML щодо схеми. Це забезпечує велику безпеку типу відповідно до наведеного вище визначення.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.