информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Spanning Tree Protocol: недокументированное применениеГде водятся OGRы
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Phrack #70/0x46 
 Возможно, Facebook наступил на... 
 50 лет электронной почте 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
все доски
FAQ
IRC
новые сообщения
site updates
guestbook
beginners
sysadmin
programming
operating systems
theory
web building
software
hardware
networking
law
hacking
gadgets
job
dnet
humor
miscellaneous
scrap
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
Оптимизация PCRE, фильтрующих URL... 18.11.05 21:25  Число просмотров: 2243
Автор: 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;/" , Но его качество оставляет желать лучшего.
Может быть все не так уж и плохо? и регексп на четыре сотни символов это не "ужас" ? ;)
<programming> Поиск 








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


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