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

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

В математике , разделители часто используются для указания сферы действия операции , и может происходить как в виде изолированных символов (например, толстой кишки , в " «) и в виде пары противоположных вида символов (например, угловые скобки , в ). [1]

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

Обзор [ править ]

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

Разделители полей и записей [ править ]

Разделители полей разделяют поля данных. Запишите разделители отдельных групп полей. [5]

Например, формат CSV файл использует запятую в качестве разделителя между полями , и конца-линии индикатора в качестве разделителя между записями :

имя, имя, возраст, зарплатаНэнси, Даволио, 33 года, 30000 долларовЕрин, Боракова, 28, $ 25250Тони Рафаэль, 35 лет, $ 28700

Это определяет простую таблицу базы данных с плоскими файлами с использованием формата файла CSV.

Разделители скобок [ править ]

Разделители скобок, также называемые разделителями блоков, разделителями областей или сбалансированными разделителями, отмечают как начало, так и конец области текста. [6] [7]

Общие примеры разделителей скобок включают: [8]

Соглашения [ править ]

Исторически сложилось так, что вычислительные платформы условно использовали определенные разделители. [16] [17] В следующих таблицах приведены несколько примеров для сравнения.

Языки программирования ( См также , Сравнение языков программирования (синтаксис) ).

Поле и разделители записи ( См также , ASCII , символ управления ).

Столкновение разделителей [ править ]

Коллизия разделителей - это проблема, которая возникает, когда автор или программист вводит разделители в текст, фактически не намереваясь интерпретировать их как границы между отдельными областями. [5] [19] В случае XML, например, это может происходить всякий раз, когда автор пытается указать символ угловой скобки .

В большинстве типов файлов есть и разделитель полей, и разделитель записей, оба из которых могут конфликтовать. В случае файлов значений, разделенных запятыми , например, конфликт полей может происходить всякий раз, когда автор пытается включить запятую как часть значения поля (например, salary = "30 000 долларов США"), и конфликт разделителей записей будет происходить всякий раз, когда поле содержит несколько строк. В текстовых файлах часто возникают конфликты между разделителями записей и полей.

В некоторых случаях злоумышленник или злоумышленник может намеренно попытаться использовать эту проблему. Следовательно, конфликт разделителей может быть источником уязвимостей и эксплойтов безопасности . Злоумышленники могут воспользоваться коллизией разделителей в таких языках, как SQL и HTML, для развертывания таких хорошо известных атак, как внедрение SQL и межсайтовый скриптинг , соответственно.

Решения [ править ]

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

Текст с разделителями ASCII [ править ]

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

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

Эскейп-персонаж [ править ]

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

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

Последовательность выхода [ править ]

Escape-последовательности похожи на escape-символы, за исключением того, что они обычно состоят из какой-то мнемоники, а не только из одного символа. Один из вариантов использования - строковые литералы , содержащие символ двойных кавычек ("). Например, в Perl код:

print  "Нэнси сказала \ x22Hello World! \ x22 толпе." ;  ### используйте \ x22

производит тот же результат, что и:

print  "Нэнси сказала толпе \" Hello World! \ "». ;  ### используйте escape-символ

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

Разделители двойных кавычек [ править ]

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

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

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

Разделители кавычек отступа [ править ]

В отличие от escape-последовательностей и escape-символов, разделители-заполнители предоставляют еще один способ избежать столкновения разделителей. Visual Basic , например, использует двойные кавычки в качестве разделителей. Это похоже на экранирование разделителя.

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

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

print  "print" "Нэнси сказала" "" "Hello World!" "" "толпе." ""

Настраиваемые альтернативные разделители кавычек [ править ]

В отличие от двойных разделителей, несколько разделителей еще более гибки для предотвращения коллизии разделителей. [22]

Например, в Perl :

print  qq ^ Нэнси не хочет говорить "Hello World!" больше. ^ ; print  qq @ Нэнси не хочет говорить «Привет, мир!» больше. @ ; print  qq (Нэнси больше не хочет говорить «Hello World!».) ;

все производят желаемый результат за счет использования операторов кавычек , которые позволяют любому удобному символу выступать в качестве разделителя. Хотя этот метод более гибкий, его поддерживают несколько языков. Это два Perl и Ruby . [23] [24]

Граница содержания [ править ]

Граница содержания представляет собой особый тип разделителя , который специально разработан , чтобы противостоять разделителей столкновения. Он работает, позволяя автору указывать последовательность символов, которая гарантированно всегда указывает границу между частями в сообщении, состоящем из нескольких частей, без какой-либо другой возможной интерпретации. [25]

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

Пробелы или отступы [ править ]

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

Синтаксис регулярного выражения [ править ]

При указании регулярного выражения можно также использовать альтернативные разделители для упрощения синтаксиса операций сопоставления и подстановки в Perl . [27]

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

$ string1  =  'Нэнси сказала: «Привет, мир!» к толпе ». ;  # указать целевую строку print  $ string1  = ~  m / [aeiou] + / ;  # соответствует одной или нескольким гласным

Синтаксис достаточно гибкий, чтобы указать операции сопоставления с альтернативными разделителями, что позволяет легко избежать столкновения разделителей:

$ string1  =  'Нэнси сказала, что "http: //Hello/World.htm" не является действительным адресом.' ;  # целевая строка напечатать  $ string1  = ~  m @ http: // @ ;  # сопоставление с использованием альтернативного разделителя регулярного выражения print  $ string1  = ~  m {http: //} ;  # то же, что и предыдущий, но с другим разделителем print  $ string1  = ~  m! http: //! ;  # то же, что и предыдущий, но с другим разделителем.

Здесь документ [ править ]

Документ Here позволяет включать произвольный контент, описывая специальную конечную последовательность. Многие языки поддерживают это, включая PHP , сценарии bash , ruby и perl . Документ здесь начинается с описания того, какой будет конечная последовательность, и продолжается до тех пор, пока эта последовательность не появится в начале новой строки. [28]

Вот пример на perl:

печать  << ENDOFHEREDOC ; Очень сложно закодировать строку «определенными символами».Новые строки, запятые и другие символы могут вызывать конфликты разделителей. ENDOFHEREDOC

Этот код напечатает:

Очень сложно закодировать строку «определенными символами».Новые строки, запятые и другие символы могут вызывать конфликты разделителей.

При использовании специальной конечной последовательности в строке разрешены любые символы.

ASCII броня [ править ]

Хотя защита ASCII в основном используется в качестве механизма для текстового кодирования двоичных данных, это метод программирования и системного администрирования, который также помогает избежать столкновения разделителей в некоторых обстоятельствах. [29] [30] Этот метод отличается от других подходов, описанных выше, поскольку он более сложен и поэтому не подходит для небольших приложений и простых форматов хранения данных. Этот метод использует специальную схему кодирования, такую ​​как base64 , чтобы гарантировать, что разделитель или другие значимые символы не появляются в передаваемых данных. Цель состоит в том, чтобы предотвратить многослойное экранирование , то есть для двойных кавычек .

Этот метод используется, например, в Microsoft «s ASP.NET технологии веб - разработки, и тесно связан с компонентом„ViewState“этой системы. [31]

Пример [ править ]

Следующий упрощенный пример демонстрирует, как этот метод работает на практике.

Первый фрагмент кода показывает простой тег HTML, в котором значение VIEWSTATE содержит символы, несовместимые с разделителями самого тега HTML:

<input  type = "hidden"  name = "__VIEWSTATE"  value = "Название книги: Нэнси больше не говорит« Привет,  мир! »  ."  />

Этот первый фрагмент кода сформирован неправильно и поэтому не будет работать должным образом в развернутой системе «реального мира».

Для хранения произвольного текста в атрибуте HTML можно использовать сущности HTML . В этом случае "& quot; заменяется двойной кавычкой:

<input  type = "hidden"  name = "__VIEWSTATE"  value = "Название книги: Нэнси больше не говорит" Привет, мир! "."  />

В качестве альтернативы можно использовать любую кодировку, не включающую символы, имеющие особое значение в контексте, например base64:

<input  type = "hidden"  name = "__VIEWSTATE"  value = "Qm9va1RpdGxlOk5hbmN5IGRvZXNuJ3Qgc2F5ICJIZWxsbyBXb3JsZCEiIGFueW1vcmUu"  />

Или процентное кодирование :

<input  type = "hidden"  name = "__VIEWSTATE"  value = "Название книги: Nancy% 20doesn% 27t% 20say% 20% 22Hello% 20World!% 22% 20anymore."  />

Это предотвращает коллизию разделителей и гарантирует, что несовместимые символы не появятся внутри HTML-кода, независимо от того, какие символы появляются в исходном (декодированном) тексте. [31]

См. Также [ править ]

  • CDATA
  • Десятичный разделитель
  • Значения, разделенные разделителями
  • Последовательность выхода
  • Строковый литерал
  • Значения, разделенные табуляцией

Ссылки [ править ]

  1. ^ a b «Сборник математических символов: разделители» . Математическое хранилище . 2020-03-01 . Проверено 9 августа 2020 .
  2. ^ «Определение: разделитель» . Федеральный стандарт 1037C - Телекоммуникации: Глоссарий телекоммуникационных терминов . Архивировано 5 марта 2013 года . Проверено 25 ноября 2019 .
  3. ^ "Что такое разделитель?" . www.computerhope.com . Проверено 9 августа 2020 .
  4. ^ Рол, Джеффри С. (1973). Программирование на Фортране . Оксфорд, Оксфордшир: Издательство Оксфордского университета. ISBN 978-0-7190-0555-8. описание метода в нотации Холлерита на языке программирования Фортран.
  5. ^ а б де Моор, Жорж Дж. (1993). Прогресс в стандартизации информатики здравоохранения . IOS Press. ISBN 90-5199-114-2.п. 141
  6. Перейти ↑ Friedl, Jeffrey EF (2002). Освоение регулярных выражений: мощные методы для Perl и других инструментов . О'Рейли. ISBN 0-596-00289-0.п. 319
  7. ^ Скотт, Майкл Ли (1999). Прагматика языка программирования . Морган Кауфманн. ISBN 1-55860-442-1.
  8. ^ Стена ; Ларри; Джон Орвант (июль 2000 г.). Программирование на Perl (Третье изд.). О'Рейли. ISBN 0-596-00027-8.
  9. ^ Кауфманн, Мэтт (2000). Компьютерное мышление: подход . Springer. ISBN 0-7923-7744-3.п. 3
  10. ^ Мейер, Марк (2005). Исследования в области компьютерных наук . Оксфорд, Оксфордшир: Издательство Оксфордского университета. ISBN 978-0-7637-3832-7. ссылки на языки программирования в стиле C, в которых используются фигурные скобки и точки с запятой.
  11. ^ Диллиган, Роберт (1998). Компьютеры в эпоху Интернета . Оксфорд, Оксфордшир: Издательство Оксфордского университета. ISBN 978-0-306-45972-6.Описывает синтаксис и разделители, используемые в HTML.
  12. ^ a b Шварц, Рэндал (2005). Изучение Perl . Оксфорд, Оксфордшир: Издательство Оксфордского университета. ISBN 978-0-596-10105-3.Описывает строковые литералы .
  13. ^ Ватт, Эндрю (2003). Sams научитесь XML за 10 минут . Оксфорд, Оксфордшир: Издательство Оксфордского университета. ISBN 978-0-672-32471-0.Описывает инструкцию по обработке XML. п. 21.
  14. ^ Кабрера, Гарольд (2002). C # для программистов на Java . Оксфорд, Оксфордшир: Издательство Оксфордского университета. ISBN 978-1-931836-54-8.Описывает однострочные и многострочные комментарии. п. 72.
  15. ^ "Документация по шаблону Smarty" . Проверено 12 марта 2010 . См., Например, документацию по системе шаблонов Smarty, «Экранирование разделителей шаблонов».
  16. ^ «Набор управляющих символов для ISO 646» (PDF) . Международная организация по стандартизации. 1 декабря 1975 г.
  17. ^ «Набор графических символов ASCII» (PDF) . Международная организация по стандартизации. 1 декабря 1975 г.
  18. ^ Левин, Дональд (1991). Руководство программиста Posix . Оксфорд, Оксфордшир: Издательство Оксфордского университета. ISBN 978-0-937175-73-6. Описывает использование control-zp 156,
  19. ^ Фридл, Джеффри (2006). Освоение регулярных выражений . Оксфорд, Оксфордшир: Издательство Оксфордского университета. ISBN 978-0-596-52812-6.описание решений для проблем со встроенными разделителями стр. 472.
  20. ^ Обсуждение текста с разделителями ASCII по сравнению с CSV и разделителями табуляции
  21. ^ Kahrel, Питер (2006). Автоматизация InDesign с помощью регулярных выражений . О'Рейли. ISBN 0-596-52937-6.п. 11
  22. ^ Стена ; Ларри; Джон Орвант (июль 2000 г.). Программирование на Perl (Третье изд.). О'Рейли. п. 63. ISBN 0-596-00027-8.
  23. ^ Стена ; Ларри; Джон Орвант (июль 2000 г.). Программирование на Perl (Третье изд.). О'Рейли. п. 62. ISBN 0-596-00027-8.
  24. ^ Yukihiro, Мацумото (2001). Рубин в двух словах . О'Рейли. ISBN 0-596-00214-9.В Ruby они обозначаются как общие строки с разделителями . п. 11
  25. ^ Javvin Technologies, Incorporated (2005). Справочник по сетевым протоколам . ISBN Javvin Technologies Inc. 0-9740945-2-8.п. 26
  26. ^ 200, Циклинг (2001). Компьютерная лингвистика и интеллектуальная обработка текста . Оксфорд, Оксфордшир: Издательство Оксфордского университета. ISBN 978-3-540-41687-6.CS1 maint: числовые имена: список авторов ( ссылка )Описывает разделители пробелов. п. 258.
  27. ^ Фридл, Джеффри (2006). Освоение регулярных выражений . Оксфорд, Оксфордшир: Издательство Оксфордского университета. ISBN 978-0-596-52812-6. стр. 472.
  28. ^ Операторы Perl и их приоритет
  29. ^ Ри, Man (2003). Интернет-безопасность: криптографические принципы, алгоритмы и протоколы . Джон Уайли и сыновья. ISBN 0-470-85285-2.(пример использования защиты ASCII в приложениях для шифрования)
  30. ^ Гросс, Кристиан (2005). Открытый исходный код для администраторов Windows . Чарльз Ривер Медиа. ISBN 1-58450-347-5.(пример использования защиты ASCII в приложениях для шифрования)
  31. ^ a b Калани, Амит (2004). Разработка и внедрение веб-приложений с помощью Visual C #. NET и Visual Studio. NET . Que. ISBN 0-7897-2901-6.(описывает использование кодировки Base64 и VIEWSTATE внутри исходного кода HTML)

Внешние ссылки [ править ]

  • Метаформаты файлов данных из книги «Искусство программирования для Unix » Эрика Стивена Рэймонда
  • Что такое разделитель Маргарет Роуз.