A разделитель - это последовательность из одного или нескольких символов для указания границы между отдельными независимыми областями в обычном тексте, математические выражения или другие потоки данных. Примером разделителя является символ запятой, который действует как разделитель полей в последовательности значений, разделенных запятыми. Другим примером разделителя является временной интервал, используемый для разделения букв и слов при передаче кода Морзе.
В математике разделители часто используются для определения объема операции ., и может встречаться как как отдельные символы (например, двоеточие в «»), так и как пара противоположных -видящие символы (например, угловые скобки в ).
Разделители представляют собой один из различных способов указания границ в поток данных. Декларативная нотация, например, является альтернативным методом, который использует поле длины в начале потока данных для указания количества символов, содержащихся в потоке данных.
Разделители могут быть описываются как разделители полей и записей или как разделители скобок.
Разделители полей разделяют поля данных. Разделители записей разделяют группы полей.
Например, в формате файла CSV в качестве разделителя между полями используется запятая, а в качестве индикатора конца строки используется запятая. разделитель между записями :
fname, lname, age, salary nancy, davolio, 33, 30000 $ erin, borakova, 28, 25250 $ tony, raphael, 35, 28700 $
Здесь указывается простой база данных плоских файлов таблица с использованием формата файла CSV.
Разделители скобок, также называемые разделителями блоков, разделителями областей или сбалансированными разделителями, отмечают начало и конец области текста.
Распространенные примеры разделители скобок включают:
разделители | Описание |
---|---|
( ) | круглые скобки. Синтаксис языка программирования Lisp упоминается как узнаваемый, прежде всего, благодаря использованию круглых скобок. |
{ } | Фигурные скобки (также называемые фигурными скобками.) |
[ ] | Скобки (обычно используются для обозначения нижнего индекса) |
< > | Угловые скобки. |
" " | обычно используются для обозначения строковых литералов. |
' ' | , обычно используемых для обозначения символьных литералов. |
?> | используются для обозначения инструкций обработки XML . |
/* */ | , используемых для обозначения комментариев в некоторых языках программирования. |
<% %> | используется в некоторых веб-шаблонах для указания языковых границ. Их также называют разделителями шаблонов. |
Исторически, вычислительные платформы использовали определенные разделители по соглашению. В следующих таблицах для сравнения приведено несколько примеров.
Языки программирования (см. Также, Сравнение языков программирования (синтаксис) ).
Строковый литерал | Конец оператора | |
---|---|---|
Паскаль | одинарная кавычка | точка с запятой |
Python | двойная кавычка, одинарная кавычка | конец строка (EOL) |
Разделители полей и записей (см. также, ASCII, Управляющий символ ).
Конец поля | Конец записи | Конец файла | |
---|---|---|---|
Unix-подобные системы, включая macOS, AmigaOS | Вкладка | LF | нет |
Windows, MS-DOS, OS / 2, CP / M | Вкладка | CRLF | нет (кроме CP / M), Control-Z |
Classic Mac OS, Apple DOS, ProDOS, GS / OS | Tab | CR | нет |
ASCII / Unicode | РАЗДЕЛИТЕЛЬ ЕДИНИЦ. Позиция 31 (U + 001F) | РАЗДЕЛИТЕЛЬ ЗАПИСИ. Позиция 30 (U + 001E) | РАЗДЕЛИТЕЛЬ ФАЙЛОВ. Позиция 28 (U + 001C) |
Столкновение разделителей - это проблема, которая возникает, когда автор или программист вводит разделители в текст, не имея фактического намерения их интерпретировать как границы между отдельными регионами. В случае XML, например, это может происходить всякий раз, когда автор пытается указать символ угловой скобки.
В большинстве типов файлов есть и разделитель полей, и разделитель записей, оба из которых могут конфликтовать. В случае файлов значений, разделенных запятыми,, например, конфликт полей может происходить всякий раз, когда автор пытается включить запятую как часть значения поля (например, зарплата = "30 000 долларов США") и разделителя записей. коллизия будет происходить всякий раз, когда поле содержит несколько строк. Конфликты разделителей записей и полей часто возникают в текстовых файлах.
В некоторых случаях злоумышленник или злоумышленник могут намеренно попытаться использовать эту проблему. Следовательно, конфликт разделителей может быть источником уязвимостей системы безопасности и эксплойтов. Злоумышленники могут воспользоваться коллизией разделителей в таких языках, как SQL и HTML, для развертывания таких широко известных атак, как SQL-инъекция и межсайтовый скриптинг соответственно.
Поскольку коллизия разделителей - очень распространенная проблема, были изобретены различные методы ее предотвращения. Некоторые авторы могут попытаться избежать проблемы, выбрав символ-разделитель (или последовательность символов), который вряд ли появится в самом потоке данных. Этот специальный подход может быть подходящим, но он обязательно зависит от правильного предположения о том, что будет отображаться в потоке данных, и не обеспечивает защиты от злонамеренных конфликтов. Поэтому применяются и другие, более формальные соглашения.
Наборы символов ASCII и Unicode были разработаны для решения этой проблемы за счет предоставления непечатаемых символов, которые можно использовать в качестве разделителей. Это диапазон от ASCII 28 до 31.
ASCII Dec | Symbol | Unicode Name | Common Name | Usage |
---|---|---|---|---|
28 | ␜ | РАЗДЕЛЕНИЕ ИНФОРМАЦИИ ЧЕТЫРЕ | разделитель файлов | Конец файла. Или между объединением того, что в противном случае могло бы быть отдельными файлами. |
29 | ␝ | ТРИ РАЗДЕЛЕНИЯ ИНФОРМАЦИИ | разделитель групп | Между разделами данных. Не требуется в простых файлах данных. |
30 | ␞ | РАЗДЕЛЕНИЕ ИНФОРМАЦИИ ВТОРОЙ | разделитель записей | Конец записи или строки. |
31 | ␟ | ИНФОРМАЦИОННЫЙ РАЗДЕЛИТЕЛЬ ОДИН | разделитель единиц | Между полями записи или элементами строки. |
Использование ASCII 31 разделителя единиц в качестве разделителя полей и ASCII 30 разделителя записей решает проблему разделителей полей и записей, которые появляются в потоке текстовых данных.
Один из способов избежать коллизии разделителей - использовать escape-символы. С точки зрения языкового дизайна это приемлемо, но у них есть недостатки:
Escape-последовательности - это похожи на escape-символы, за исключением того, что они обычно состоят из какой-то мнемоники, а не только из одного символа. Одно использование - в строковых литералах , которые включают символ двойных кавычек ("). Например, в Perl код:
print" Нэнси сказала \ x22Hello World! \ X22 толпа. "; ### use \ x22
производит тот же результат, что и:
print" Нэнси сказала \ "Hello World! \" толпе. "; ### use escape char
Один недостаток управляющих последовательностей, когда они используются людьми, заключается в необходимости запоминать коды, представляющие отдельные символы (см. также: ссылка на символьный объект, ссылка на числовой символ ).
В отличие от управляющих последовательностей и управляющих символов двойные разделители предоставляют еще один способ избежать коллизии разделителей. Некоторые языки, например, позволяют использовать одинарные кавычки (') или двойные quote ("), чтобы указать строковый литерал. Например, в Perl :
print 'Нэнси сказала: «Привет, мир!» толпе. ';
производит желаемый результат без необходимости экранирования. Однако этот подход работает только тогда, когда строка не содержит оба типа кавычек.
В отличие от управляющих последовательностей и управляющих символов разделители с заполнением предоставляют еще один способ избежать столкновения разделителей. Visual Basic, например, использует двойные кавычки в качестве разделителей. Это похоже на экранирование разделителя.
print «Нэнси сказала« Привет, мир! »« Толпе ».
производит желаемый результат без необходимости экранирования. Однако, как и при обычном экранировании, при использовании большого количества кавычек он может сбивать с толку. Код для печати вышеприведенного исходного кода выглядел бы более запутанным:
print "print" "Нэнси сказала" "" "Hello World!" "" "Толпе." ""
В отличие от двойных разделителей, несколько разделителей еще более гибки, чтобы избежать столкновения разделителей.
Например, в Perl :
print qq ^ Нэнси не хочет говорить «Привет Мир!" больше. ^; print qq @ Нэнси не хочет говорить «Привет, мир!» больше. @; print qq (Нэнси больше не хочет говорить «Hello World!».);
все производят желаемый результат за счет использования операторов кавычек, которые позволяют любому удобному символу выступать в качестве разделителя. Хотя этот метод более гибкий, его поддерживают несколько языков. Perl и Ruby - два, которые делают.
A граница содержимого - это особый тип разделителя, который специально разработан для предотвращения столкновения разделителей. Он работает, позволяя автору указывать последовательность символов, которая гарантированно всегда указывает границу между частями в сообщении, состоящем из нескольких частей, без другой возможной интерпретации.
Разделитель часто генерируется из случайной последовательности символов, появление которых в контенте невозможно со статистической точки зрения. За ним может следовать опознавательный знак, такой как UUID, отметка времени или какой-либо другой отличительный знак. В качестве альтернативы содержимое может быть отсканировано, чтобы гарантировать, что разделитель не появится в тексте. Это может позволить сделать ограничитель короче или проще и повысить удобочитаемость документа. (См., Например, MIME, Здесь документы ).
Некоторые языки программирования и компьютерные языки позволяют использовать разделители пробелов или отступ как средство определения границ между независимыми областями в текст.
При указании регулярного выражения можно также использовать альтернативные разделители для упрощения синтаксиса для соответствия и операции подстановки в Perl.
Например, простая операция сопоставления может быть указана в Perl со следующим синтаксисом:
$ string1 = 'Нэнси сказала: «Привет, мир!» толпе. '; # указать целевую строку print $ string1 = ~ m / [aeiou] + /; # сопоставить одну или несколько гласных
Синтаксис достаточно гибкий, чтобы указать операции сопоставления с альтернативными разделителями, что позволяет легко избежать коллизии разделителей:
$ string1 = 'Нэнси сказала: «http: //Hello/World.htm» не действительный адрес. '; # целевая строка print $ string1 = ~ m @ http: // @; # сопоставление с использованием альтернативного разделителя регулярного выражения print $ string1 = ~ m {http: //}; # то же, что и предыдущий, но с другим разделителем print $ string1 = ~ m! http: // !; # то же, что и предыдущий, но с другим разделителем.
A Здесь документ позволяет включать произвольный контент, описывая специальную конечную последовательность. Многие языки поддерживают это, включая PHP, сценарии bash, ruby и perl. Документ здесь начинается с описания конечной последовательности и продолжается до тех пор, пока эта последовательность не появится в начале новой строки.
Вот пример на perl:
print <Этот код будет print:
Очень сложно закодировать строку с "определенными символами". Новые строки, запятые и другие символы могут вызывать конфликты разделителей.Использование специальной конечной последовательности позволяет использовать в строке любые символы.
ASCII-защита
Хотя в основном используется как механизм для текстового кодирования двоичных данных, ASCII-защита - это метод программирования и системного администрирования, который также помогает избежать столкновения разделителей в некоторые обстоятельства. Этот метод отличается от других подходов, описанных выше, поскольку он более сложен и поэтому не подходит для небольших приложений и простых форматов хранения данных. В этом методе используется специальная схема кодирования, например base64, чтобы гарантировать, что разделитель или другие значимые символы не появляются в передаваемых данных. Цель состоит в том, чтобы предотвратить многоуровневое экранирование , т.е. для двойных кавычек.
. Этот метод используется, например, в Microsoft ASP.NET технология веб-разработки и тесно связана с компонентом «VIEWSTATE» этой системы.
Пример
Следующий упрощенный пример демонстрирует, как этот метод работает на практике.
Первый фрагмент кода показывает простой тег HTML, в котором значение VIEWSTATE содержит символы, несовместимые с разделителями самого тега HTML:
Этот первый фрагмент кода не правильно сформирован и поэтому не будет работать должным образом в развернутой системе "реального мира".
Напротив, второй фрагмент кода показывает тот же тег HTML, за исключением того, что на этот раз несовместимые символы в значении VIEWSTATE удаляются с помощью применения кодировки base64:
Третий фрагмент кода показывает тот же тег HTML, за исключением того, что на этот раз несовместимые символы в значении VIEWSTATE удаляются с помощью применения процентного кодирования :
. Это предотвращает коллизию разделителей и гарантирует, что несовместимые символы не появятся внутри HTML-кода, независимо от того, какие символы появляются в исходном ( декодированный) текст.
См. также
- CDATA
- Десятичный разделитель
- Значения, разделенные разделителями
- Управляющая последовательность
- Строковый литерал
- Значения, разделенные табуляцией
СсылкиВнешние ссылки
- Метаформаты файлов данных из Искусство программирования Unix от Эрик Стивен Рэймонд
- Что такое разделитель Маргарет Роуз.