Разделитель

редактировать
Символы, определяющие границу между областями в потоке данных Стилистическое изображение фрагмента из CSV -форматированный текстовый файл. Запятые (показаны красным) используются в качестве разделителей полей.

A разделитель - это последовательность из одного или нескольких символов для указания границы между отдельными независимыми областями в обычном тексте, математические выражения или другие потоки данных. Примером разделителя является символ запятой, который действует как разделитель полей в последовательности значений, разделенных запятыми. Другим примером разделителя является временной интервал, используемый для разделения букв и слов при передаче кода Морзе.

В математике разделители часто используются для определения объема операции ., и может встречаться как как отдельные символы (например, двоеточие в «1: 4 {\ displaystyle 1: 4}{\ displaystyle 1: 4} »), так и как пара противоположных -видящие символы (например, угловые скобки в ⟨a, b⟩ {\ displaystyle \ langle a, b \ rangle}{\ displaystyle \ langle a, b \ rangle} ).

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

Содержание
  • 1 Обзор
    • 1.1 Разделители полей и записей
    • 1.2 Разделители скобок
    • 1.3 Условные обозначения
  • 2 Коллизия разделителей
    • 2.1 Решения
      • 2.1.1 Текст с разделителями ASCII
      • 2.1. 2 escape-символ
      • 2.1.3 Escape-последовательность
      • 2.1.4 Dual разделители кавычек
      • 2.1.5 Разделители кавычек с заполнением
      • 2.1.6 Настраиваемые альтернативные разделители кавычек
      • 2.1.7 Граница содержимого
      • 2.1.8 Пробелы или отступы
      • 2.1.9 Синтаксис регулярного выражения
      • 2.1.10 Здесь документ
      • 2.1.11 ASCII armor
        • 2.1.11.1 Пример
  • 3 См. Также
  • 4 Ссылки
  • 5 Внешние ссылки
Обзор

Разделители могут быть описываются как разделители полей и записей или как разделители скобок.

Разделители полей и записей

Разделители полей разделяют поля данных. Разделители записей разделяют группы полей.

Например, в формате файла 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

Наборы символов ASCII и Unicode были разработаны для решения этой проблемы за счет предоставления непечатаемых символов, которые можно использовать в качестве разделителей. Это диапазон от ASCII 28 до 31.

ASCII Dec SymbolUnicode NameCommon NameUsage
28РАЗДЕЛЕНИЕ ИНФОРМАЦИИ ЧЕТЫРЕразделитель файлов Конец файла. Или между объединением того, что в противном случае могло бы быть отдельными файлами.
29ТРИ РАЗДЕЛЕНИЯ ИНФОРМАЦИИразделитель групп Между разделами данных. Не требуется в простых файлах данных.
30РАЗДЕЛЕНИЕ ИНФОРМАЦИИ ВТОРОЙразделитель записей Конец записи или строки.
31ИНФОРМАЦИОННЫЙ РАЗДЕЛИТЕЛЬ ОДИНразделитель единиц Между полями записи или элементами строки.

Использование ASCII 31 разделителя единиц в качестве разделителя полей и ASCII 30 разделителя записей решает проблему разделителей полей и записей, которые появляются в потоке текстовых данных.

escape-символ

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

  • текст может быть нечитаемым, если он усеян многочисленными escape-символами, проблема, называемая синдромом наклонной зубочистки (из-за использования \ для экранирования / в Perl регулярных выражениях, приводящих к таким последовательностям, как «\ / \ /»);
  • текст становится трудно анализировать с помощью регулярного выражения
  • они требуют механизма для «выхода из escape-последовательности», если они не предназначены для использования в качестве escape-символов; и
  • , хотя их легко набрать, они могут быть непонятными для тех, кто не знаком с языком.
  • они не защищают от атак с помощью инъекций

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-кода, независимо от того, какие символы появляются в исходном ( декодированный) текст.

См. также
Ссылки
Внешние ссылки
Последняя правка сделана 2021-05-17 12:11:45
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте