Obfuscation: идея
May 18, 2008 by Andrew Tch · 3 Comments
PHP Obfuscation using Zend tokenizer (token_get_all, token_name).
Замена переменных, имен функций, строк (данных строк) итп…
Quick’n'dirty, минимальная защита от ковыряния.
Латвийский (и не только) прогерный бомонд, ваше мнение :).
Комментарии типа "а нахер" будут жестоко удаляться.
Текущие реализации нихрена не понимают PHP5 / Oop.
Open Source.
Автолинковка, или снова о регулярных выражениях
February 16, 2008 by Andrew Tch · 1 Comment
Я болею, я овощь ©.
Писать, однако, временами что-то стоит.
Функция, находящая URL в тексте, заменяющая их на нормальные href и обрезающая, при необходимости. Используютеся регулярные выражения (частично стырено с Symfony) и лямбда-функции (URL auto-linking in php). Enjoy & feel free to use.
function truncateString($string, $length){ if(mb_strlen($string, "UTF-8") <= $length) return $string; else return mb_substr($string, 0, $length, "UTF-8") . "...";}
function autoLinkText($text){ $autolink_re = '~ ( # leading text <\w+.*?>| # leading HTML tag, or [^=!:\'"/]| # leading punctuation, or ^ # beginning of line ) ( (?:https?://)| # protocol spec, or (?:www\.) # www.* ) ( [-\w]+ # subdomain or domain (?:\.[-\w]+)* # remaining subdomains or domain (?::\d+)? # port (?:/(?:(?:[\~\w\+=%-]|(?:[,.;:][^\s$]))+)?)* # path (?:\?[\w\+%&=.;-]+)? # query string (?:\#[\w\-]*)? # trailing anchor ) ([[:punct:]]|\s|<|$) # trailing text ~x'; return preg_replace_callback( $autolink_re, create_function('$matches', ' if (preg_match("/<a\s/i", $matches[1])) { return $matches[0]; } else { return $matches[1] . \'<a href="\' . ($matches[2] == "www." ? "http://www." : $matches[2]).$matches[3].\'" target="_blank">\' . truncateString($matches[2].$matches[3], 35). \'</a>\'.$matches[4]; } ') , $text);}
Парсинг HTML при помощи регулярных выражений
January 23, 2008 by Andrew Tch · 3 Comments
Дошли руки исправить несовместимость с йожегом.лв – напомю, речь шла о том что RSS отдавал код страницы с относительными ссылками. Итого, задача заключается в том, как добавить для всех src="/.." адресов адрес сайта, то есть src="http://www.noop.lv/…". Смотрим реализацию:
//translate image/file links (href/src)
$matches = array();preg_match_all('/src="([a-z,/,.,_,0-9,-]+)"/i', $text, $matches);
//we don't need full patterns, so we use only second element of an array
$matches = $matches[1];
foreach($matches as $link){ //check whether it is relative... if($link{0} == '/') { $text = str_replace($link, 'http://www.noop.lv' . $link, $text); }}
//the same for links (href attributes)$matches = array();preg_match_all('/href="([a-z,/,.,_,0-9,-]+)"/i', $text, $matches);
//we don't need full patterns, so we use only second element of an array$matches = $matches[1]; foreach($matches as $link){ //check whether it is relative... if($link{0} == '/') { $text = str_replace($link, 'http://www.noop.lv' . $link, $text); }}
На входе получаем переменную $text, после выполнения этого куска кода все линки в нем поправлены.
Регулярое выражение, как видите, банально, вытаскивает то что находится в src="" или href="" аттрибутах.
Минусы: простое регулярное выражение, может не понять все линки, да и вообще такое должно делаться парсингом DOM-дерева…но об этом как-нибудь в другой раз.
Fedora Core 6/7 & php-sqlite
January 9, 2008 by Andrew Tch · 13 Comments
Как известно, Fedora Core не содержит пакета php-sqlite. При попытке поставить руками:
pecl install sqlite
получаем:
/root/SQLite-1.0.3/sqlite.c:56: error: 'BYREF_NONE' undeclared here (not in a function) /root/SQLite-1.0.3/sqlite.c:56: error: 'BYREF_FORCE' undeclared here (not in a function) /root/SQLite-1.0.3/sqlite.c:125: warning: initialization from incompatible pointer type /root/SQLite-1.0.3/sqlite.c:126: warning: initialization from incompatible pointer type
Ничего не поделать, ставим по старинке.
Сначала:
pecl download sqlite
получаем:
[root@vp ~]# pecl download sqlite WARNING: channel "pear.php.net" has updated its protocols, use "channel-update pear.php.net" to update downloading SQLite-1.0.3.tgz ... Starting to download SQLite-1.0.3.tgz (371,189 bytes) .............................done: 371,189 bytes File /root/SQLite-1.0.3.tgz downloaded
далее:
tar xvf SQLite-1.0.3.tgz cd SQLite-1.0.3
в файле sqlite.c комментируем 56ю строку:
/*static unsigned char arg3_force_ref[] = {3, BYREF_NONE, BYREF_NONE, BYREF_FORCE };*/
а строки 124-127 меняем с
function_entry sqlite_functions[] = {
PHP_FE(sqlite_open, arg3_force_ref)
PHP_FE(sqlite_popen, arg3_force_ref)
на
function_entry sqlite_functions[] = {
PHP_FE(sqlite_open, third_arg_force_ref)
PHP_FE(sqlite_popen, third_arg_force_ref)
далее:
phpize ./configure make
хватаем полученный modules/sqlite.so и работаем!
Symfony WSOD
January 9, 2008 by Andrew Tch · Leave a Comment
Symfony в последнее время начала тупо валиться в WSOD (white screen of death) без видимых причин. Как оказалось, причина была в неверной обработке кода движком php 5.1.x, связанная, в частности, с парсингом DOM и работой sfRexegpValidator. Если появляется схожая проблема – откатывайтесь на 5.0.х или обновляйтесь на ветку 5.2.х.
Валидация URL при помощи Regex
January 8, 2008 by Andrew Tch · 8 Comments
В процессе реанимации этого блога понадобилось сделать валидацию вводимых URL при помощи Regex. При помощи гугла и некоторого количества мозга получилось вот что (ессесно, удаляем абзацы):
/^((https?|ftp)://)?([a-z0-9+!*(),;?&=$_.-]+(:[a-z0-9+!*(),;?&=$_.-]+)?@)?
[a-z0-9+$_-]+(.[a-z0-9+$_-]+)*(:[0-9]{2,5})?(/([a-z0-9+$_-].?)+)*/?
(?[a-z+&$_.-][a-z0-9;:@/&%=+$_.-]*)?(#[a-z_.-][a-z0-9+$_.-]*)?$/i
т.е. валидация URL с указанием/без указания протокола (http, https, ftp), с возможностью указания имени пользователя (http://user:password@host.com), использования RealUrl’s (www.host.com/foo/bar), параметров и anchor’ов (http://www.noop.lv/foo/bar/index.php?foo=boo&string=a%20a#anchor_one).
При указании выражения в PHP в строке с двойными кавычками не забывайте экранировать $.