ANTICHAT — форум по информационной безопасности, OSINT и технологиям
ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию.
Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club,
и теперь снова доступен на новом адресе —
forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
|
Результаты опроса: Вам понравилось?
|
|
Да, очень
|
  
|
4 |
36.36% |
|
Нормально
|
  
|
4 |
36.36% |
|
Нет, это не нужно
|
  
|
3 |
27.27% |

31.05.2009, 01:14
|
|
Участник форума
Регистрация: 21.02.2008
Сообщений: 255
Провел на форуме: 975514
Репутация:
177
|
|
очень небольшая статья по PHP
некоторое время назад понадобилось из PHP-CLI скрипта
вызвать внешнюю программу, не дожидаясь её выполнения
в операционной системе windows
вопрос возник потому, что стандартные пхп функции system,
exec и т.д. приостанавливают работу скрипта до тех пор, пока
заданный в них параметр не выполнится.
спрашивал на форуме - сказали что винда г, юзать nix и запускать
команду в фоновом режиме амперсандом, но надо было в винде.
и вот сегодня почитав мануал по win оболочке дошел до команды
START, которая как раз делает то, что нужно =)
синтаксис можно посмотреть так: start /?
и, наконец, применение в пэхэпэ скрипте:
PHP код:
system("start php.exe c:\\file.php");
- вызывает на исполнение файл c:/file.php интерпретатором пхп ПАРАЛЛЕЛЬНО с
текущим скриптом (т.е. родительский скрипт продолжает выполняться потому что
команда start после запуска указанной программы завершается и следовательно
функция system завершается )
ну конечно при условии что win знает где лежит php.exe
т.к. я раньше не знал этого и думал что это невозможно
(как впрочем мне и сказали тогда на форуме)
решил выложить в помощь людям, которые ещё не знают этого
и которым это может понадобиться
Последний раз редактировалось imajo.ati; 31.05.2009 в 01:20..
|
|
|

31.05.2009, 16:03
|
|
Постоянный
Регистрация: 29.05.2007
Сообщений: 852
Провел на форуме: 4832771
Репутация:
1916
|
|
Парсинг страниц с защитой на JavaScript
[INTRO]
Многие начинающие и не очень начинающие кодеры при написании парсеров/грабберов сталкиваются с проблемой, что вывод
данных на страницу производится яваскриптом, да ещё и с динамическими именами переменных, массивов и т.д.
Собственно решил написать эту статейку.
[Способ решения]
Вот так недавно наткнулся на один код.
На странице выводилась прокся (IP : Port). Но выводилось при помощи JS.
Наша задача - получить адрес и порт прокси при помощи PHP, не прибегая к каким-либо выполнениям на стороне клиента.
Код страницы выглядел примерно вот так:
Код:
<HTML><BODY>
<script>
lXaLNu = new Array(742,62,948,760,41,960,48);
auAQmk = parseInt((((500+lXaLNu[0])*lXaLNu[1]+lXaLNu[2]+lXaLNu[3])*lXaLNu[4]-lXaLNu[5]-lXaLNu[6])*10)/10-3226178;
jmJZrOkTxr = new Array(351,30,25,715,874);
JACwFMTS = parseInt((((109+jmJZrOkTxr[0])*jmJZrOkTxr[1])*jmJZrOkTxr[2]+jmJZrOkTxr[3]+jmJZrOkTxr[4])*10)/10-346439;
pYSHW = new Array(425,482,67,716,370,432);
nlM = parseInt(((843+pYSHW[0]+pYSHW[1])*pYSHW[2]+pYSHW[3]-pYSHW[4]+pYSHW[5])*10)/10-105771;
CIjU = new Array(374,514,208);
NCfWOOCO = parseInt((424+CIjU[0]+CIjU[1]-CIjU[2])*10)/10-894;
ZuIGvQrzIMTS = new Array(112,185,735,61,91);
myiDrcfCi = parseInt(((287+ZuIGvQrzIMTS[0]-ZuIGvQrzIMTS[1]-ZuIGvQrzIMTS[2])*ZuIGvQrzIMTS[3]+ZuIGvQrzIMTS[4])*10)/10+31828;
TMUuMPjfRhm = parseInt(NCfWOOCO)+'.'+parseInt(auAQmk)+'.'+parseInt(myiDrcfCi)+'.'+parseInt(JACwFMTS)+':'+parseInt(nlM);
</script>
Proxy IP:PORT : <script>document.write(TMUuMPjfRhm);</script>
Имена переменных, массивов были динамическими, последовательности и величины математических операций так же были различными при
каждой перезагружке страницы.
Казалось бы сложно, на самом деле нет 
Рассмотрим код:
Каждая переменная формирует кусок ip прокси, а одна из них содержит порт. Этот алгоритм не меняется.
Далее переменная TMUuMPjfRhm содержит конечный результат (адрес разделённый точками и через двоеточие порт).
Следовательно нам нужно получить результат этой переменной.
В принципе есть множество способов решения данной проблемы, в целом всё зависит от воображения программиста.
Сейчас мы рассмотрим один из способов - преобразование JS кода в PHP и выполнение.
И так пошагово: - Отпарсить кусок нужного JavaScript
- Заменить JS переменные и массивы на PHP
- Заменить JS функции на эквивалентные PHP
- Выполнить полученный код через eval() и создать переменную, содержащую конечный результат
Всё, что для этого нужно это знание регулярных выражений, ну и синтаксиса PHP (как бы банально это не звучало),
иначе eval() код с ошибками кушать не будет
[Поехали]
1. Парсим код.
Всё, что нам нужно для счастья это код между <script></script>.
PHP код:
preg_match('#<script>(.+)</script>#Uis', $source, $out);
В $out[1] теперь содержится нужный нам код.
2. Парсим имена массивов и переменных
PHP код:
preg_match_all('#([a-z]+)\s=\snew#i', $out[1], $arrs);
preg_match_all('#([a-z]+)\s=\sparse#i', $out[1], $vars);
Получаем
Код:
Переменные
Array
(
[0] => auAQmk
[1] => JACwFMTS
[2] => nlM
[3] => NCfWOOCO
[4] => myiDrcfCi
[5] => TMUuMPjfRhm
)
Массивы
Array
(
[0] => lXaLNu
[1] => jmJZrOkTxr
[2] => pYSHW
[3] => CIjU
[4] => ZuIGvQrzIMTS
)
Теперь преобразуем все переменные в PHP путём добавления знака доллара. Для этого напишем небольшую функцию
обратного вызова, чтобы применить её ко всем элементам массивов $arrs[1] и $vars[1].
PHP код:
function add_dollar($elem) {
return '$' . $elem;
}
Применяем:
PHP код:
$php_arrs = array_map('add_dollar', $arrs[1]);
$php_vars = array_map('add_dollar', $vars[1]);
Далее заменяем преобразованные имена в нашем коде
PHP код:
$out[1] = str_replace($arrs[1], $php_arrs, $out[1]);
$out[1] = str_replace($vars[1], $php_vars, $out[1]);
Заменили, едем дальше.
3. Меняем JS функции на эквивалентные PHP
Здесь используется всего-лишь одна функция parseInt. Эквиватент ей в PHP - intval() или в данном примере
даже подойдёт abs().
Заменим на intval():
PHP код:
$out[1] = str_replace('parseInt', 'intval', $out[1]);
Далее смотрим на массивы, видим new Array(). Но так как в PHP массив не является объектом, а простой функцией array()
заменим это дело, просто убрав new:
PHP код:
$out[1] = str_replace('new ', '', $out[1]);
В последней переменной, которая формирует результат мы видим JS-конкатенацию (знак плюса).
Заменяем ёё на PHP-конкатенацию (точка)
PHP код:
$out[1] = str_replace(
array("'+", "+'"),
array("' . ", " . '"),
$out[1]);
Хитрый финт ушами и у нас уже готовый PHP-код:
PHP код:
$lXaLNu = Array(742,62,948,760,41,960,48);
$auAQmk = intval((((500+$lXaLNu[0])*$lXaLNu[1]+$lXaLNu[2]+$lXaLNu[3])*$lXaLNu[4]-$lXaLNu[5]-$lXaLNu[6])*10)/10-3226178;
$jmJZrOkTxr = Array(351,30,25,715,874);
$JACwFMTS = intval((((109+$jmJZrOkTxr[0])*$jmJZrOkTxr[1])*$jmJZrOkTxr[2]+$jmJZrOkTxr[3]+$jmJZrOkTxr[4])*10)/10-346439;
$pYSHW = Array(425,482,67,716,370,432);
$nlM = intval(((843+$pYSHW[0]+$pYSHW[1])*$pYSHW[2]+$pYSHW[3]-$pYSHW[4]+$pYSHW[5])*10)/10-105771;
$CIjU = Array(374,514,208);
$NCfWOOCO = intval((424+$CIjU[0]+$CIjU[1]-$CIjU[2])*10)/10-894;
$ZuIGvQrzIMTS = Array(112,185,735,61,91);
$myiDrcfCi = intval(((287+$ZuIGvQrzIMTS[0]-$ZuIGvQrzIMTS[1]-$ZuIGvQrzIMTS[2])*$ZuIGvQrzIMTS[3]+$ZuIGvQrzIMTS[4])*10)/10+31828;
$TMUuMPjfRhm = intval($NCfWOOCO) . '.' . intval($auAQmk) . '.' . intval($myiDrcfCi) . '.' . intval($JACwFMTS) . ':' . intval($nlM);
4. Выполняем полученный код
Для начала создадим переменную, которая будет содержать результат. Ведь к переменной $TMUuMPjfRhm мы не можем обращаться постоянно,
так как имя её меняется.
Поэтому, чтоб код был постоянно рабочим при любых изменениях переменных достанем имя последней переменной из массива (того, когда парсили)
имена переменных. И создадим независимую переменную, содержащую результат.
PHP код:
$out[1] .= '$proxy = ' . array_pop($php_vars) . ';';
Осталось лишь выполнить наш PHP-код через eval()
Теперь адрес проксика будет в переменной $proxy
[Вывод]
Как все знают, идеальной защиты не существует и JS тому не исключение 
Был продемонстрирован всего один из тысячи способов получения контента страницы с казалось бы такой крутой защитой.
В общем удачных кодесов
В аттаче весь код этой статьи с комментариями
Последний раз редактировалось .:EnoT:.; 31.05.2009 в 16:41..
|
|
|

31.05.2009, 16:27
|
|
Познавший АНТИЧАТ
Регистрация: 07.05.2006
Сообщений: 1,031
Провел на форуме: 5885100
Репутация:
773
|
|
Оч интересно... Спасибо енот..
В карту статей и ниииет)
|
|
|

31.05.2009, 16:29
|
|
Постоянный
Регистрация: 16.04.2008
Сообщений: 889
Провел на форуме: 12942062
Репутация:
1550
|
|
Это было реально охуенно, в статьи)
|
|
|

08.06.2009, 05:21
|
|
Познающий
Регистрация: 07.09.2008
Сообщений: 39
Провел на форуме: 78936
Репутация:
20
|
|
Кэширование Web-страниц
Кэширование Web-страниц
Эта статья ориентирована не на спецов, так что определения некоторых понятий точностью ни изобилуют, главное чтобы было понятно.. Прошу сильно не ругать, так как пишу подобное впервые - за здоровую критику буду благодарен..
Недавно при написании сайта я столкнулся с проблемой кэширования. Долго искал информацию на эту тему, то что нарыл укладывается в один стандартный алгоритм. Примерная его суть: - Получаем URL страницы
- Преобразуем в имя файла
- Тут варианты: либо все куда то записать(по-типу БД) либо же сохраняем в папку так
- Как только обращаются к странице проверяем ее на срок истечения действительности кэша и выводим
Очевидные проблемы:- Скрипт регистрации к примеру выдает специфичные данные для каждого человека(хотя строка может быть и одинаковой), так что кэшировать надо бы выборочно...
- Наклевывается вопрос: а если POST или например COOKIE? Тогда URL может быть одинаковым для разных страниц!
Из-за всего этого пришлось изобретать свой велосипед(хотя на новаторство идеи не претендую, вряд-ли кто-то до этого не догадывался): - Используем Базу Данных
Будем хранить к примеру такую таблицу(для простого случая подходит):
---------------------------
page | cache_time
---------------------------
По сути кажется что таблица будет весить неимоверно много, но вот тут-то и надо встряхнуть тем серым веществом, которое мы по наивности называем мозгом. Для большинства страниц в базе данных cache_time окажется одинаковым, исключениями будут страницы регистрации, новостные ленты(и то не факт) и.т.п... Зачем хранить там все страницы? В самом скрипте заведем константу, и будем всегда пользоваться ее значением, но перед этим желательно проверять, а нету ли чего-нибудь особенного для этой страницы в базе данных. В итоге 90% страниц будут использовать значение константы, а для 10% можно и пожертвовать драгоценным местом в БД.
- Выборочное кэширование
Первый вопрос: у вас на сайте есть что-то наподобие этого? Если нет - кэшируйте все на здоровье, а если да, то что?

А ответ прост, нужно всего лишь не кэшировать ту информацию, которая изменятся от пользователя к пользователю. Т.е. вместо всей страницы, мы сохраним в кэш только контент, а генерация остального, очень часто, не столь долгое дело, и заморачиваться со вставкой данных в кэш будет накладней, чем просто генерировать эти элементы страницы каждый раз. Вывод: Иногда удобней кэшировать только часть страницы.
- POST и COOKIE
По сути бесполезность той схемы которую я описал вначале я впервые ощутил столкнувшись с HTTP POST, мое решение не будет изобиловать оригинальностью, но.. По-моему проще всего завести функцию для генерации имени файла в зависимости от уникальных параметров переданных этой функции. Т.е. не будем опираться только на URL, лучше возьмем за основу путь к скрипту и его уникальные параметры.
Вот наверно и все что я хотел написать..
Успехов в ваших разработках! mixk0rshun
P.S.:
Кэширование вряд ли будет иметь много смысла для мелкого сайта, но для крупных разработок оно сильно экономит процессорное время, для маленьких проектов - скорее только затормозит...
И напоследок некоторый совет: проще всего использовать в папке кэша каталоги, т.е:
Страница: http://example.com/forum/index.php?id=3
Кэш: cache/forum/index.php/id=3
|
|
|

09.06.2009, 00:56
|
|
Познающий
Регистрация: 07.09.2008
Сообщений: 39
Провел на форуме: 78936
Репутация:
20
|
|
хотелось бы услышать коментарии...
|
|
|

09.06.2009, 01:14
|
|
Постоянный
Регистрация: 03.06.2009
Сообщений: 385
Провел на форуме: 3178262
Репутация:
389
|
|
Сообщение от mixkorshun
хотелось бы услышать коментарии...
Закешированные страницы в БД, это тоже самое, что юзать железные шаблона html  Да и занимать будет целую торбу места. Так что это не оптимально.
Если контент тяжёлый (флешка, видос), то используются предзагрузка.
В общем я не видел ниодного обычного сайта с кешированием. Если где-то используется - приведи сайт (кроме гугла, ну и темболее он кешурет не для отображения своих страниц  ).
Последний раз редактировалось FireFenix; 09.06.2009 в 01:38..
|
|
|

09.06.2009, 04:40
|
|
Постоянный
Регистрация: 30.08.2007
Сообщений: 773
Провел на форуме: 3069349
Репутация:
808
|
|
а если POST или например COOKIE?
А при чём тут cookie?
По сути бесполезность той схемы которую я описал вначале я впервые ощутил столкнувшись с HTTP POST, мое решение не будет изобиловать оригинальностью, но.. По-моему проще всего завести функцию для генерации имени файла в зависимости от уникальных параметров переданных этой функции. Т.е. не будем опираться только на URL, лучше возьмем за основу путь к скрипту и его уникальные параметры.
Проблемы возникают из-за того, что это "клиентский" подход к кешированию. Примерно такое уже реализовано в браузере, остается лишь посылать правильные заголовки.
Метод post же не является ни безопасным, ни идемпотентным.
Кеширование на сервере должно происходить на другом уровне, чтобы сохранять результаты работы шаблонизатора, статистику, частые выборки из бд, и т.д.
В общем я не видел ниодного обычного сайта с кешированием. Если где-то используется - приведи сайт (кроме гугла, ну и темболее он кешурет не для отображения своих страниц ).
Напротив, кеширование используется почти везде, поскольку это простой и удобный способ повысить производительность.
|
|
|

09.06.2009, 08:04
|
|
Постоянный
Регистрация: 03.06.2009
Сообщений: 385
Провел на форуме: 3178262
Репутация:
389
|
|
Сообщение от astrologer
Напротив, кеширование используется почти везде, поскольку это простой и удобный способ повысить производительность.
Производительность в основном страдает у динамических данных, а не у статических, поэтому кеширование тут не сильо помогает
Последний раз редактировалось FireFenix; 09.06.2009 в 08:07..
|
|
|

09.06.2009, 08:51
|
|
Постоянный
Регистрация: 30.08.2007
Сообщений: 773
Провел на форуме: 3069349
Репутация:
808
|
|
Сообщение от FireFenix
Производительность в основном страдает у динамических данных, а не у статических, поэтому кеширование тут не сильо помогает
Так речь и шла о динамических - mixkorshun приводит в пример форум и почту.
|
|
|
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|