Введение

Символы, определяющие границу между областями в потоке данных.

Разделитель — это последовательность из одного или нескольких символов, используемая для обозначения границы между отдельными, независимыми областями в обычном тексте, математических выражениях или других потоках данных. Примером разделителя является символ запятой, который выступает в качестве разделителя полей в последовательности значений, разделенных запятыми. Другим примером разделителя является временной интервал, используемый для разделения букв и слов при передаче кода Морзе. В математике разделители часто используются для указания области действия операции и могут встречаться как в виде отдельных символов (например, двоеточие в "") так и в виде пар символов, зеркально отражающих друг друга (например, угловые скобки в ). Разделители представляют собой один из способов определения границ в потоке данных. Декларативное обозначение, например, является альтернативным методом (не использующим разделители), который применяет поле длины в начале потока данных для указания количества символов, содержащихся в этом потоке данных.

Обзор

Делимитеры могут быть представлены как разделители полей и записей, или как разделители в скобках.

Столкновение с ограничителем

Столкновение разделителей — это проблема, возникающая, когда автор или программист вводит разделители в текст, не предполагая, что они будут интерпретированы как границы между отдельными областями. Например, в случае XML это может произойти, когда автор пытается ввести символ угловой скобки. В большинстве типов файлов существуют как разделитель полей, так и разделитель записей, оба из которых подвержены столкновению. Например, в файлах со значениями, разделёнными запятыми, столкновение полей может произойти, когда автор пытается включить запятую в значение поля (например, зарплата = "$30,000"), а столкновение разделителей записей — когда поле содержит несколько строк. Столкновение разделителей полей и записей часто встречается в текстовых файлах. В некоторых случаях злоумышленник может намеренно использовать эту проблему. Следовательно, столкновение разделителей может быть источником уязвимостей и эксплойтов безопасности. Злоумышленники могут использовать столкновение разделителей в таких языках, как SQL и HTML, для осуществления известных атак, таких как SQL-инъекция и межсайтовый скриптинг соответственно.

Решение

Поскольку столкновение разделителей — очень распространенная проблема, были изобретены различные методы её предотвращения. Некоторые авторы могут попытаться избежать этой проблемы, выбирая символ (или последовательность символов) в качестве разделителя, который вряд ли встретится в самом потоке данных. Такой подход может быть приемлемым, но он неизбежно зависит от верного предположения о содержимом потока данных и не обеспечивает защиты от преднамеренных столкновений. Поэтому применяются и другие, более формализованные соглашения.

Текст с разграничением по ASCII

Набор символов ASCII и Unicode был разработан для решения этой проблемы путем предоставления непечатаемых символов, которые могут использоваться в качестве разделителей. Это диапазон от 28 до 31 в ASCII. ASCII Dec Символ Название Unicode Общее название Использование 28 INFORMATION SEPARATOR FOUR файловый разделитель Конец файла. Или между объединением файлов, которые в противном случае могли бы быть отдельными. 29 INFORMATION SEPARATOR THREE групповой разделитель Между разделами данных. Не требуется в простых файлах данных. 30 INFORMATION SEPARATOR TWO разделитель записи Конец записи или строки. 31 INFORMATION SEPARATOR ONE разделитель единиц Между полями записи или элементами строки. Использование разделителя единиц ASCII 31 и разделителя записей ASCII 30 решает проблему разграничения полей и записей, которые встречаются в потоке текстовых данных.

Двойные делиттеры котировок

В отличие от экранирующих последовательностей и экранирующих символов, двойные ограничители предоставляют еще один способ избежать конфликта ограничителей. Некоторые языки, например, позволяют использовать либо одинарную кавычку (') или двойную кавычку (") для определения строкового литерала. Например, в Perl:

print 'Нэнси сказала "Привет, мир!" толпе.';

выводит ожидаемый результат без необходимости использования экранирования. Однако этот подход работает только в том случае, если строка не содержит оба типа кавычек.

Конфигурируемые альтернативные делиттеры котировок

В отличие от двойных разделителей, множественные разделители ещё более гибки в плане предотвращения конфликта разделителей.

Граница содержания

Контентная граница — это специальный тип разделителя, разработанный для предотвращения коллизий разделителей. Она позволяет автору указать последовательность символов, которая гарантированно всегда обозначает границу между частями многокомпонентного сообщения, исключая любую другую интерпретацию. Разделитель часто генерируется из случайной последовательности символов, статистическая вероятность появления которой в содержимом крайне мала. За ней может следовать идентификатор, такой как UUID, временная метка или другой уникальный маркер. Альтернативно, содержимое может быть просканировано для гарантии отсутствия разделителя в тексте. Это может позволить использовать более короткий или простой разделитель и повысить удобочитаемость документа. (См., например, MIME, Here-документы).

Белое пространство или вмятина

Некоторые языки программирования и компьютерные языки позволяют использовать пробелы или отступы для определения границ между независимыми блоками текста.