Защита от парсинга страницы
Автор: SysaninФев 7
Заказали сделать парсер одного сайта по размещению вакансий. На нём натолкнулся на интересный способ скрытия мыла, адреса, телефона разместившего объявление. Даже не знаю от кого они его так прячут от ботов спамеров - не похоже (тогда б достаточно было б шифровать только e-mail), возможно от парсинга конкуренских скриптов?:). Собственно вот такой код:
<script type="text/javascript">evаl('d.write(String.fromCharCode.call(null,20^133&45^80|60^131&137^56|164^248|-17+144|335-220|101^26|-3+99&245^143&107^20|-56+168|239-112|69+48|2^98|331-208|115^2|53+57&388-199&102+75&126-28|-37+159&438-247&24+153&296-232|35+81&-37+159&-91+207&31+87&314-190|330-214|314-199&343-247&-96+219&204-91&273-163&241-64|66+51&104^215&145+15&43+117&134^53&99^50|345-166|81^236|277-100|143^239&253^158|22+75&92+99&296-133))')</script>
Первая часть скрипта (та что заключена в первом теге <script>) разгадывается довольно просто. Достаточно вспомнить, что функция String.frоmCharCod в JavaScript по ANSII коду возвращает соответствующий символ из таблицы. Поэтому из первой части легко можно вытащить текст средствами php, к примеру.
Вторая часть намного интереснее. Сразу меня с толку сбила функция evаl(), которая по идее должна была интерпретировать и выполнить код в кавычках. Но если посмотреть в строку, то становится понятным, что она не смогла бы корректно работать, так как в функцию String.fromCharCode передаётся в качестве аргумента не число, а строка, которая не может быть приведена к типу число (присутствуют символы | и &).
Поковыряв JS файлы, прикрепленные к странице нашел интересную функцию:
var x = eval(txt.match(/,(\d+\^\d+)\D/)[1]);
eval(txt.replace(/,\d+\^\d+&/, ',rus2uni(').replace(/[&|]/g, '^'+x+'),rus2uni(').replace('))', '^'+x+')))'));
}
Из чего можно сделать вывод, что во втором блоке при вызове функции eval() вызывается функция из этого файла а не стандартная. Если присмотреться работа пользовательской функции eval() очевидна: в переменную x мы записываем конкретных два числа. Благодаря встроенной функции eval() одно число побитово делится на другое и мы получаем некоторое натуральное число, которое используем далее. Следующим действием мы преобразуем строку так, что получаем набор функций rus2uni() (она определена в этом же документе и просто преобразует цифровой код в соответствующий символ по таблице символов), в аргументах которых будут числа, разделенные некоторыми арифметическими действиями.
Вот и весь алгоритм. На первый взгляд страшненький, но если разобраться вполне понятен. Конечно, если б файлы с JavaScript'ом прогнали через оптимизатор или обфускатор, было бы определенно труднее разобраться с этим алгоритмом.
P.S. Подобное вполне можно использовать для сокрытия e-mail'a от спамеров.
1 комментарий
Пишет Kovex | дата: 1 апреля 2010 в 0:27
А чем история закончилась?
Получилось напарсить или нет?
Firebug даёт шикарный код, только вот как его вытянуть в промышленных масштабах?