Но такой ли он далёкий? Буквально сегодня пришлось столкнуться лицом к лицу с нависшей над миром угрозой.
Update: во какую штуку нашёл, надо бы донести это знание до тех, кому не безразлично…
Sorry for my terrible english. My native language is PHP.
Update: во какую штуку нашёл, надо бы донести это знание до тех, кому не безразлично…
Когда-то давно я писал о том, как решил проблему обнаружения источников спама на виртуальном хостинге. По просьбе товарища Murz выкладываю описываемый в заметке скрипт – быть может пригодиться он не только ему.
Ну и краткое руководство:
P.S.
Вы без труда сможете добавить простейшие “фильтры” и не отправлять например письма содержащие некие сигнатуры…
Sun Oct 1 23:50:53 CDT 2006
Slackware 11.0 is released. Thanks to everyone who helped out and made this
release possible. If I forgot you in the ChangeLog, mea culpa, but you know
who you are, and thanks.![]()
Enjoy! -P.
Что не может не радовать…
Таким образом программист может за три часа написать программу, которая сделает за пять минут то, что другой человек делал бы целый час…
© Кто-то
“Дорогая, а гладить ты умеешь?”
Много слышал и читал про phing, но пощупать досконально нехватало времени и желания. И вот наконец моё свободное время было потрачено (и не зря) на изучение сего монстра
“Монстром” я называю phing в “хорошем” смысле этого слова – это настоящий кухонный комбайн, СВЧ-печь и стиральная машина в одном флаконе архиве.
Что же это всё-таки такое?. Phing это Ant воссозданный на php. (Вопросы “Чё эта?” и “а нахер?” Вы можете задать непосредственно разработчикам того и другого, а я продолжу…).
Тем кто знает что такое Ant вероятнее всего phing не нужен,тем кто не знает, но интересуется, могу посоветовать хорошую вводную статью, а остальным попытаюсь объяснить вкратце суть явления.
“Но есть способ лучше!”
В процессе разработки чего-либо возникают невероятное количество однообразных операций, которые порядком утомляют.
Как пример из собственной практики – удаление “ненужных” файлов (очистка всемозможных кешей, временных файлов и т.п.), создание структуры директорий (расстановка необходимых прав доступа), удаление debug-кода из скриптов(массовый search-n-replace в определённом наборе файлов), компоновка кучи мелких “инклюдов” в общий файл и много-много подобных мелочей…
Можно конечно всё сделать “вручную”. А можно рутинную работу поручить машине. Одним из способов это сделать являются build-файлы для phing. build-файл представляет собой xml-ку в которой указан проект – совокупность задач (target-ов), которые следует выполнить, а так же последовательность (зависимость – depends в терминах phing) их выполения.
<project name="make_release" basedir=".." default="build">
<taskdef classname="phing.tasks.ext.PhpStripCommentsTask" name="phpstripcomments" />
<taskdef classname="phing.tasks.ext.JsLintTask" name="jslint" />
<target name="clear_cache_dir">
<delete>
<fileset dir="cache">
<include name="*" />
</fileset>
</delete>
</target>
<target name="lint_before_strip">
<jslint jslbinary="/usr/bin/jslint" failonerror="true">
<fileset dir=".">
<include name="**/*.js"/>
<exclude name="**/.old_site/**" />
</fileset>
</jslint>
<!-- skip -->
</target>
<!-- ....skip -->
<target name="build" depends="prepare,clear_cache_dir,lint_before_strip,dump_db,copy_src,cleanup_src,remove_debugging,lint_after_strip,simpletests">
<!-- skip -->
<mail to="me@mydomain.tld" subject="build complete">
The build process is a success...
</mail>
</target>
</project>
После запуска phing начнёт выполнять default task (в примере – build), и поскольку его выполнить нельзя пока не выполнены depends, то начнёт их делать по указанному порядку… ну и на радостях отправит мне письмо (что конечно лишнее)
“Но и это ещё не всё…”
Спектр задач которые в настоящий момент способен решать phing довольно широк (от файловых операций и строковых манипуляций, до работы с svn, simpletest и phpdoc). Для тех кому зазо исходного набора окажется недостаточно есть замечательная возможность плодить task-и самостоятельно – просто наследуйте новый класс от базового Task и вперёд.
Мне не хватило jslint, jscompress и zndenc – на создание коих было бесследно утрачено минут 15 драгоценного времени. В настоящий момент (ага вот прямо сейчас) обдумываю написание самого аццкого таска – ftpupload (или ftpsync).
Интересный момент – target-ы выполняются строго по порядку и если произойдёт некая непредвиденная ситуация(файл нельзя записать или например как в примере выше в проверяемом коде обнаружится синтаксическая ошибка) другие таргеты выполнятся не будут, выполнение будет прервано exception-ом. Собственно момент интересен тем что можно создавать собственный обработчик этих самых exception-ов, в которых делать “правильные выводы” о том стоит ли продолжать работу или смело “to die if necessary…”.
Другая интересная возможность – делать собственные logger-ы – потому как наблюдать за бурной рабочей деятельностью phing-а в консоли не больно удобно. В стандартной поставки для примера есть AnsiColorLogger, который слегка “приукрашивает” серые терминальные будни. А можно пойти дальше – складывать логи в sqlite например.
“А вы поменяете две пачки обычного порошка на одну пачку необычного?”
Чем хорош именно phing – он написан на php5 – я могу исправить, дополнить и добавить недостающие фичи (Ant несомненно хорош, имеет кучу готовых плагинов, но написан на java, которую я совсем не знаю). Стандартный (g)make откровенно бесит синтаксисом makefile-ов, pake (идея видимо нагло стырена с rake)тоже ничего (хорошего), но уж слишком прост и расширять его возможности довольно муторно
.
Тонна мелких и крупных shell-perl-php-cmd скриптов, которые я ранее использовал для решения сиюминутных насущных проблем тоже порядком задолбали.
Чем плох – xml как формат build-файлов (хотя на вскидку лучшего предложить ничего не могу, но “аллергия” на xml ещё не прошла) и написан на php5 ;o) – скорость работы оставляет желать лучшего (18 минут на сборку,проверку и упаковку 10-ти мегабайтного проекта на мой взгляд это много).
Но “удобность” всё-таки решает. Так что:
$> pear channel-discover pear.phing.info$> pear install phing/phing
И вперёд…
Суть проблемы – на хостинге много пользователей (сайтов) и один apache (с mod_php), а с какого-то аккаунта шлют спам (через формочки, которые есть практически на каждом сайте – типа feedback и т.п.). Где-то это получается удачно (умудряются добавитб заголовок bcc и список из пару сотен (почему-то бразильских) e-mail-ов) где-то не очень и все кракозябрица отправляется в теле письма адресату, указанному в скрипте (который в свою очередь пересылает её нам, с вопросом – “а чО эта такое?”). Надо начинать бороться.
На прошлой неделе решил добавить в php.ini (httpd.conf) параметр mail.force_extra_parameters = “-fshell_user_name”.
Это помогло выявить некоторые кривые скрипты и уведомить авторов(владельцев) о том что пора исправлять ошибки.
Но поскольку этот параметр легко переписывается пятым параметром в функции mail, то всё вычислить не удаёься.
Сегодня пошёл другим путём – написал враппер на php (/usr/sbin/sendmail.php и указал его как sendmail_path в php.ini), который проверяет откуда был запущен sendmail, логирует и отправляет письмо дальше к реальному бинарнику. Это помогло найти проблемные(дырявые) скрипты на сайтах, но не решает проблемы рассылки спама с сайтов.
Сегодня же увидел ещё один метод рассылки – на неком сайте есть “доска объявлений”, после отправки объявления, скрипт отправляет его (объявление) на e-mail “добавляющему”. Ну и кто-то умный и большой фигачит автоматом объявление и меняет адреса… владельцам сайта похоже
пох..всё равно, что там твориться, а спам идёт и идёт…
У меня теперь есть возможность создавать кучу фильтров во враппере и отправлять левые письма в топку /dev/null (например если в тексте встретилось сочетание “bcc: “, но всё-таки интересно как решают подобные проблемы “крупные хостеры” (и решают ли они их). Как например в условиях shared hosting-а (если php установлен как модуль apache) делают лимиты на количество отправляемых писем в час с одного аккаунта ? Как борются со спамерами ? И ещё куча вопросов
или “крупные” хостеры, ставят php как [fast]cgi и такими проблемами не озадачиваются ? ;o)
Нарисовалась интересная задачка – авторизовывать пользователя через AD.
Собственно задачка для меня не нова – в нескольких сервисах я её уже реализовал – через LDAP, на одном, доступ к которому есть из “внешнего мира”, – через mod_auth_pam (winbindd на сервере установлен, настроен и работает как часы “Слава”) – т.е. как бы задачка – казалось бы вовсе не задачка…. Но! Но хочется людЯм чтоб “не выскакивало это окошечко”… Обратили внимание на SharePoint сервер, который (якобы) не спрашивает логин-пароль – объясняю – на самом деле спрашивает, просто этого не видно – говорят – ну и сделай так же – ну и делаю так же… НО! но “без проблем” это делать умеет только IE (Mozilla “в принципе” тоже умеет), а как же Ёпера, она же, убогая, не умеет ВАЩЕ NTLM ?
Забить на Оперу Допустим что Оперой не пользуются… а в принципе.. безопастна ли NTLM-авторизация? посмотрел на PHP NTLM GET LOGIN… судя по реализации можно смело предположить, что потенциальный негодяй может “завернуть” в base64_encode любой логин… (аналогичная история получится с mod_ntlm – первые версии своих “сервисов” делал через него, но после перестановки системы на сервере, он начал “конфликтовать” с разными модулями апача и мне надоело его править)…
Пока оставляю всё как есть – “клиент: форма -> клиент: des_encrypt ->сервер: ldap_connect->сервер: ldap_bind-> сервер: return (true || false) ”
В такой схеме (на мой взгляд) безопасно передаются данные и безопасно(а главное “честно”) проверяется пара логин-пароль согласно всем политикам AD – всякие блокировки по времени, expires и т.д. тогда как при NTLM можно с лёгкостью обойти все эти механизмы
А собственно вопрос – а верно ли я понял, что NTLM – “АЦтой” ? А есть ли способ использовать NTLM прозрачно для клиента и безопасно для сервера?
на opennet-e новость и ссылка на статью…
Буквально в двух словах – предлагают отключить ВСЁ (забыли только в crontab добавить каждую минуту apachectl stop делать)
Не спорю – будет секурно,а кому будет нужен такой apache ?
Из реальных советов только mod_security советуют поставить ( и не пишут где набрать для него хороших правил – без них это просто ещё один «unnecessary module», которые советую вырубать), в chroot загнать – тоже спорно(на мой взгляд) для статических сайтов (на которые по сути и рассчитаны видимо эти «советы») это решение №1, а «динамический» вогнать в chroot довольно трудоёмкая задача(почти полсистемы копировать чтобы работали php,perl и т.п.) – проще сделать jail ( а проще ли? – удобнее точно), ну и собственно рекомендуют отключать «нафикненужные» модули, что я думаю подразумевается любым вменяемым администратором.
Из совершенно непонятных мне советов:
(в вольном переводе)
Отключить .htaccess (правильно – если у Вас один сайт – один сервер, а если это публичный хостинг тогда писать «рулесы» по требованию клиента? а не заезамучаешься?)
но это не главное – дальше говорят – «а если всё-таки нужны .htaccess – сделайте, но назовите это файл как-нибудь по-другому, например .httpdoverride», дальше приводят правило, которое итак есть в httpd.conf… – а смысл в переименовании ? что измениться ? чтоб никто не догадался ?
страусиная философия – прячем череп в песок, чтоб не так страшно было, когда будут убивать….
Lower the Timeout value – крайне спорно!!! , хотя может для буржуев это и актуально, у нас же пока большая часть пользователей пользуются убогими модемами(или убогими ATC) и уменьшив таймаут, мы рискуем кинуть их всех через известный орган…
P.S.
плевать на «вредные советы»
я хочу нормальное решение(без ugly hack-ов) для хостинга web-проектов (в данном случае php+any_webServer), такое чтобы было «шустрое» как mod_php (этим я подразумеваю что php as cgi или fastcgi конечно рабочее, но в скорости многократно проигрывает) и «секурное» – чтобы каждый VirtualHost был под своим юзером….
мечты-мечты…
Мечты подкрепились недавним очередным релизом Peruser MPM for apache 2 – хорошее начало, но имеет ряд существенных ограничений – надо отключать KeepAlive – а это неминуемое падение прозводительности (которое в принципе я решил путём отдачи статики через ngnix ) и ряд офигенных глюков PHP, в частности проблемы с GD и MSSQL которые я получил, попробовав настроить такую конструкцию на dev-сервере, оно понятно, об этом предупреждают создатели PHP, но до слёз обидно…
P.P.S.
ещё пару советов в общую коллекцию:
Порежьте сетевой кабель на куски и сожгите его в безлунную ночь под ржание сивой кобылы.
Разъбейте все внешние (и внутренние тоже) накопители об стенку, осколки закопайте на Поле Чудес
Спите в презервативе – БЕЗОПАСТНОСТЬ ПРЕВЫШЕ ВСЕГО