информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Сетевые кракеры и правда о деле ЛевинаГде водятся OGRыЗа кого нас держат?
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Logitech готовится закрыть очередную... 
 Серьёзная атака на инфраструктуру... 
 Microsoft призналась в сознательном... 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
На девелоперской машине - летает. Но на сайте - (VDS) - ресурсов этак на порядок меньше (150 попугаев, 32RAM) - подтормаживать может. В принципе, уже и из этого выход нашел - фильтровать однажды - при добавлении текста. 22.11.05 13:25  Число просмотров: 2242
Автор: kstati <Евгений Борисов> Статус: Elderman
<"чистая" ссылка>
<programming>
Оптимизация PCRE, фильтрующих URL... 18.11.05 21:25  
Автор: kstati <Евгений Борисов> Статус: Elderman
Отредактировано 18.11.05 21:30  Количество правок: 2
<"чистая" ссылка>
Доброго здоровья!
Многие уже сталкивались с вопросом фильтрации тегов. Задача в основном одна - реализовать возможность использования правильно составленных структур, не влияющих на безопасность сайта. Я к ним отношу, например, простые ссылки на http/https/ftp ресурсы.
Для правильной фильтрации решил ознакомиться с соответствующими стандартами.
Нашел доходчивое описание формата URL в RFC1738
В качестве "фильтра" решил использовать PCRE.
Первая версия регулярного выражения была написана, что называется "в лоб"
Как описано в RFC, так и задаю в пкре-регкспе. Результат потрясающий - партен более полутора килобайт.
Решил оптимизировать конструкции. Например в пятом разделе (это страница 17) описывается непосредственно формат URL. Пример:
          toplabel = alpha | alpha *[ alphadigit | "-" ] alphadigit

---
буквально можно описать так:
          toplabel =/([a-zA-Z]|([a-zA-Z]([a-zA-Z0-9])*[a-zA-Z0-9])/

---
Но это же полная лабуда. Намного эффективнее будет конструкция:
          /[a-zA-Z]+([a-zA-Z0-9\-]*[a-zA-Z0-9])?/

---

Аналогично упрощается и путь. В качестве примера беру ftp, так как он чуть-чуть "навороченее".
          ftpurl  = "ftp://" login [ "/" fpath [ ";type=" ftptype ]]
          fpath  = fsegment *[ "/" fsegment ]
          ftourl_opt = "ftp://" login [ fpath_opt [ ";type=" ftptype ]]
          fpath_opt = * ["/" fsegment]

---
Подобными изменениями удалось "сжать" партен ftp-url до 352 байт.
Так вот в чем собственно вопрос.
Где еще можно оптимизировать этот партен?


<<<<<<<<<<<<<<<<<<<<<<<<<<<<
user & password =(?:[a-zA-Z0-9-$_.+!*'(),;?&=][0-9A-Fa-f]{2})+
hostport =
(?:(?:(?:(?:(?:[a-zA-Z0-9](?:[-a-zA-Z0-9]*[-a-zA-Z0-9])?)\.)*
(?:[a-zA-Z](?:[-a-zA-Z0-9]*[a-zA-Z])?))

(?:[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+))(?:\:[0-9]+)?)

Он же - в более читаемом виде:
 (?:
  (?:
   (?:
    (?:[a-zA-Z0-9]
     (?:[-a-zA-Z0-9]*[a-zA-Z0-9]
     )?
    )\.
   )*
   (?:[a-zA-Z]
    (?:[-a-zA-Z0-9]*[a-zA-Z]
    )?
   )
  )
  |
  (?:[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+
  )
 )
 (?:\:[0-9]+
 )?

---

login =/(?:(?:(?:[a-zA-Z0-9-.+'(),;?&=]|%[0-9A-Fa-f]{2})+(?:\:(?:[a-zA-Z0-9-$+!*'(),;?&=]|%[0-9A-Fa-f]{2})+)@)?(?:(?:(?:(?:(?:[a-zA-Z0-9](?:[-a-zA-Z0-9]*[-a-zA-Z0-9])?)\.)?:[a-zA-Z](?:[-a-zA-Z0-9]*[a-zA-Z])?))?:[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+))(?:\:[0-9]+)?))/
fsegment =/(?:[a-zA-Z0-9-$_.+'(),\?:@&=][0-9A-Fa-f]{2})
fpath =/(?:\/(?:[a-zA-Z0-9-$_.+'(),\?:@&=][0-9A-Fa-f]{2})*)
ftptype= [AIDaid]
ftpurl=
(ftp:\/\/
(?:(?:(?:[a-zA-Z0-9-.+'(),;?&=]|%[0-9A-Fa-f]{2})+(?:\:(?:[a-zA-Z0-9-$+!(),;?&=][0-9A-Fa-f]{2})+)@)?
(?:(?:(?:(?:(?:[a-zA-Z0-9](?:[-a-zA-Z0-9]*[-a-zA-Z0-9])?)\.)*(?:[a-zA-Z](?:[-a-zA-Z0-9]*[a-zA-Z])?))?:[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+))(?:\:[0-9]+)?))
 (?:(?:\/(?:[a-zA-Z0-9-$_.+'(),\?:@&=][0-9A-Fa-f]{2})*)   (?:\;=type[AIDaid]{1}
   )?
  )?
)

---
ftpurl=/(ftp:\/\/(?:(?:[a-zA-Z0-9-.+'(),;?&=]|%[0-9A-Fa-f]{2})+(?:\:(?:[a-zA-Z0-9-$_.+!*'(),;?&=]|%[0-9A-Fa-f]{2})+)@)?(?:(?:(?:(?:(?:[a-zA-Z0-9](?:[-a-zA-Z0-9]*[-a-zA-Z0-9])?)\.)*(?:[a-zA-Z](?:[-a-zA-Z0-9]*[a-zA-Z])?))|(?:[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+))(?:\:[0-9]+)?)(?:(?:\/(?:[a-zA-Z0-9-$+!*'(),\?:@&=]
[0-9A-Fa-f]{2})*)?:\;=type[AIDaid]{1})?)?)/
<<<<<<<<<<<<<<<<<<<<<<<<<<<<

C http/s дела примерно такие же как и с ftp - около 350 символов.

Ну, и в довесок проверка мыла. Её скорость не так уж критична - используется на много реже. Может быть пригодится кому-либо.
************************************
test for RFC822 &; RFC1738 email syntax
++ only visibled chars used
++ ip as host not allowed */
/^[^][\0-\x20()&;lt;&;gt;@,;:\\".\x80-\xff](?:[^][\0-\x20()&;lt;&;gt;@,;:\\"\x80-\xff]*?[^][\0-\x20()&;lt;&;gt;@,;:\\".\x80-\xff]@(?:(?:(?:[a-zA-Z0-9](?:[-a-zA-Z0-9]*[-a-zA-Z0-9])?)\.)?:[a-zA-Z](?:[-a-zA-Z0-9]*[a-zA-Z])?))$/

Вот и возникает вопрос.
Что бы отбросить, для уменьшения размера партенов - следовательно - увеличения скорости работы?
Конечно же, оптимальный по скорости вариант - "/&lt;a\shref=(.*?) &gt;(.*?)&lt;\/a&gt;/" , Но его качество оставляет желать лучшего.
Может быть все не так уж и плохо? и регексп на четыре сотни символов это не "ужас" ? ;)
походу так всё и есть 22.11.05 00:26  
Автор: NKritsky <Nickolay A. Kritsky> Статус: Elderman
<"чистая" ссылка>
И тебе поздорову!

> Доброго здоровья!
> Многие уже сталкивались с вопросом фильтрации тегов. Задача
> в основном одна - реализовать возможность использования
> правильно составленных структур, не влияющих на
> безопасность сайта. Я к ним отношу, например, простые
> ссылки на http/https/ftp ресурсы.
> Для правильной фильтрации решил ознакомиться с
> соответствующими стандартами.
> Нашел доходчивое описание формата URL в RFC1738
> В качестве "фильтра" решил использовать PCRE.
> Первая версия регулярного выражения была написана, что
> называется "в лоб"
> Как описано в RFC, так и задаю в пкре-регкспе. Результат
> потрясающий - партен более полутора килобайт.
> Решил оптимизировать конструкции. Например в пятом разделе
> (это страница 17) описывается непосредственно формат URL.
> Пример:

<skipped>

> Вот и возникает вопрос.
> Что бы отбросить, для уменьшения размера партенов
> - следовательно - увеличения скорости работы?

> Конечно же, оптимальный по скорости вариант -
> "/&lt;a\shref=(.*?)
> &gt;(.*?)&lt;\/a&gt;/" ,
> Но его качество оставляет желать лучшего.
> Может быть все не так уж и плохо? и регексп на четыре сотни
> символов это не "ужас" ? ;)

Я почитал, посмотрел, - похоже что не ужас. Просто в BNF это всё немножко прикольней читается за чет использования "макросов". А что скорость парсинга - есть претензии? Тестировал?
На девелоперской машине - летает. Но на сайте - (VDS) - ресурсов этак на порядок меньше (150 попугаев, 32RAM) - подтормаживать может. В принципе, уже и из этого выход нашел - фильтровать однажды - при добавлении текста. 22.11.05 13:25  
Автор: kstati <Евгений Борисов> Статус: Elderman
<"чистая" ссылка>
1






Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2019 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach