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($string0$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 в строке с двойными кавычками не забывайте экранировать $.

« Previous Page