Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ПЗ_резерв.doc
Скачиваний:
60
Добавлен:
24.02.2016
Размер:
2.21 Mб
Скачать

3.3 Алгоритмы обработки текстовой информации

При работе данного приложения возникает момент, когда пользователю надо водить текстовую информацию. При вставке этой информации на страницу может произойти сбой работы т.к. информация может содержать инъекцию кода. Это ведет к общему снижению информации и поэтому надо вести предварительную проверку всего текста на предмет возможной инъекции. Для этих целей был формальный язык поиска – регулярные выражения. По сути регулярное выражение это строка образец, по которой происходит поиск подстроки в строке. Отличие этого метода от простого поиска это наличие метасимволов позволяющие задать формальные правила к какой либо части строки поиска.

Примеров применения регулярных выражений может послужить выражение для поиска комментариев в веденом тексте. Как известно комментарии нужны для документации кода и не следует их включать в рабочую версию страницы, так как это может помочь злоумышленникам. Если реализовать поиск комментариев через код это будет весьма трудоемко, однако при помощи регулярных выражений это можно сделать всего одной строчкой. Выражение вида «(\/\*(\w|\D)+\*\/)|(\/\/(?:[^\r\n]|\r(?!\n))*)» находит все комментарии и позволяет их удалить. На рисунке 3.4 приведен алгоритм, который описан в этом выражении.

Рисунок 3.4 – Графическое представление работы регулярного выражения.

Как видно из приведённого алгоритма выражения ищет комментарии 2 типов многострочные и однострочные. Многострочные комментарии заключаться в конструкцию вида «/*…*/» и могут содержать в себе любую информацию. Однострочные комментарии содержат в себе только 1 строку. Разработка алгоритмов анализа текста весьма трудоемка, однако регулярные выражения существенно сокращают затраты на реализацию этих алгоритмов.

Так же требовалось проверять всю введенную информацию на наличие HTMLтэгов. С учетом того что пользователь не должен вводить информацию такого типа, при её нахождение можно её сразу удалять считая вредоносной.

Для этого было разработано выражение вида «<(?:([a-zA-Z\?][\w:\-]*)(\s(?:\s*[a-zA-Z][\w:\- ]*(?:\s*=(?:\s*"(?:\\"|[^"])*"|\s*'(?:\\'|[^'])*'|[^\s> ]+))? )*)?(\s*[\/\ ?]?)|\ /([a-zA-Z][\w:\-]*)\s*|!--((?:[^\-]|-(?!->))*)--|!\[CDATA\[((?:[ ^\]]|\](?!\]>))*)\]\])>». Разбор алгоритма этого выражения приведен на рисунке 3.5.

Рисунок 3.5 – Графическое представление регулярного выражения.

Как известно, выделяться 4 типа тэгов в htmlстранице.

Двойные тэги, например: «<title></title>». Сокращённая запись двойных тэгов, например «<title/>», сокращённая запись применяется только тогда когда тэг содержит только атрибуты. Одиночный тэг, например: «<br>», этот тэг отличается от сокращённой записи двойного тэга что не имеет закрывающих символов, но при этом не имеет закрывающего тэга, и тэги мета-данных, например [CDATA].

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

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