Линкспам мастдай! Берите скрипт!

Написал конфирмер для защиты форм от роботов. Бесплатно! Берите! 🙂
Описание задесь: http://promosite.ru/services/confirmer.php
Пример работы: http://promosite.ru/services/confirmer/form.php
Скачать: http://promosite.ru/services/confirmer/confirmer.zip
Требуется возможность работы PHP с графикой, а именно функции imagecreatefromgif, imagegif.
***
Это бесплатный комплект скриптов на PHP, который позволяет на любую форму установить проверку юзера на человечность. Особенность конфирмера: НЕ НУЖНО использовать сессии при работе! Картинки не генерятся индивидуально для пользователей, но защита вполне достаточная.

Комплект состоит из:
1. файл confirmer_pic.php, который генерит картинку с нужным числом псевдослучайных символов, меняющихся раз в минуту
2. файл confirmer_include.php, который знает алгоритм генерации картинки и проверяет введенную строчку на правильность. Должен находиться в той же директории, что и (1).
3. файл form.php, пример использования кода. Он инклюдит confirmer_include.php и получает результат проверки в виде переменной $confirmer_result (=0,1) и показывает картинку счетчика $confirmer_pic. Должен находиться в той же директории, что и (1,2), т.к. вызов картинки идет из той же директории. Вы можете это исправить сами.
4. директории с графической подложкой и GIF-картинками буковок. Эта директория прописана в файле confirmer_pic.php, вообще ее желательно прятать от чужих глаз. Все картинки можно менять на свои! Вы можете создать свой конфирмер, использовать свои картинки.
Картинка генерится на основе номера минуты, зашифрованного функцией crypt() с параметром $confirmer_salt. Эта строка (фактически: пароль) должна быть одинаковой в скриптах confirmer_pic.php и confirmer_include.php – иначе ничего не получится.
Пароль $confirmer_salt снаружи можно подобрать… 🙂 но это очень-очень долго :).
В параметре $confirmer_num файла confirmer_include.php задается число буковок, которые надо вводить юзеру в поле.
Картинка валидна в течение $confirmer_min минут после ее создания. Просто скрипт confirmer_include.php проверяет все значения, соотвествующие прошедшим минутам.

Работает конфирмер просто:
1. В начале скрипта form.php вы инклюдите confirmer_include.php.
2. Если запрос пришел методом GET, он выставляет переменную $confirmer_pic, которая содержит html-код: картинку с пояснением.
3. Если запрос пришел методом POST, он выставляет переменную $confirmer_result, которая равна 1, если юзер ввел правильный код, или 0, если неправильный (в этом случае он устанавливает $confirmer_pic и просит повторить ввод). Анализируете эти данные и делаете свои дела.

SEO – ссылочки на панель links

Скоро пора будет тульбар делать. 🙂
Итак, ссылочка делает вот что: со страницы поиска по запросу напротив каждого найденного результата пишет, сколько сайтов и страниц на этот домен ссылаются с текстом запроса. Вставляет ифрейм рядом с результатом.
Текст запроса оно берет тупо из реферера, ищет в рефере перекодированные %XX символы и их использует как текст ссылок. Не настроено на индивидуальные SE, с 2 страниц Яндекса не работает, при отсутствии русских букв в запросе не работает.
Т.е., алгоритм простой: ищем чего-нибудь в SE, и нажимаем ссылку – и оно пишет по каждому результату ссылающиеся со словами.
Ссылка: 0) {linkdomain=document.links[i].href.substring(7,document.links[i].href.indexOf(‘/’,8)); if (linkdomain!=thisdomain && linkdomain.indexOf(nowww)==-1 && linkdomain!=’hghltd.yandex.com’ && linkdomain!=’66.249.93.104′ && linkdomain!=’194.67.26.242′) { document.links[i].outerHTML=’ ‘+document.links[i].outerHTML; };}; }; void(0)” target=_blank>INB_Q3 – дополнительно по anchor#link=”site.ru*”[“слова запроса”> (/strict) и anchor#link=”site.ru*”[слова && запроса] (/wide).
Перетащить ссылку на панель Links, и, как обычно, согласиться. Тулза серверная, просьба не насиловать! 🙂

Флаги rewriterule

Нарыл нормальное объяснение работы флагов в mod_rewrite на http://host146.t3n.sotline.ru/manual/mod/mod_rewrite.html – за неимением, вывалю сюда, чтобы было перед глазами:
***
Additionally you can set special flags for Substitution by appending

[flags]

as the third argument to the RewriteRule directive. Flags is a comma-separated list of the following flags:

‘redirect|R [=code]’ (force redirect)
Prefix Substitution with http://thishost[:thisport]/ (which makes the new URL a URI) to force a external redirection. If no code is given a HTTP response of 302 (MOVED TEMPORARILY) is used. If you want to use other response codes in the range 300-400 just specify them as a number or use one of the following symbolic names: temp (default), permanent, seeother. Use it for rules which should canonicalize the URL and give it back to the client, e.g., translate “/~” into “/u/” or always append a slash to /u/user, etc.

Note: When you use this flag, make sure that the substitution field is a valid URL! If not, you are redirecting to an invalid location! And remember that this flag itself only prefixes the URL with http://thishost[:thisport]/, rewriting continues. Usually you also want to stop and do the redirection immediately. To stop the rewriting you also have to provide the ‘L’ flag.

‘forbidden|F’ (force URL to be forbidden)
This forces the current URL to be forbidden, i.e., it immediately sends back a HTTP response of 403 (FORBIDDEN). Use this flag in conjunction with appropriate RewriteConds to conditionally block some URLs.
‘gone|G’ (force URL to be gone)
This forces the current URL to be gone, i.e., it immediately sends back a HTTP response of 410 (GONE). Use this flag to mark pages which no longer exist as gone.
‘proxy|P’ (force proxy)
This flag forces the substitution part to be internally forced as a proxy request and immediately (i.e., rewriting rule processing stops here) put through the proxy module. You have to make sure that the substitution string is a valid URI (e.g., typically starting with http://hostname) which can be handled by the Apache proxy module. If not you get an error from the proxy module. Use this flag to achieve a more powerful implementation of the ProxyPass directive, to map some remote stuff into the namespace of the local server.
Notice: To use this functionality make sure you have the proxy module compiled into your Apache server program. If you don’t know please check whether mod_proxy.c is part of the “httpd -l” output. If yes, this functionality is available to mod_rewrite. If not, then you first have to rebuild the “httpd” program with mod_proxy enabled.

‘last|L’ (last rule)
Stop the rewriting process here and don’t apply any more rewriting rules. This corresponds to the Perl last command or the break command from the C language. Use this flag to prevent the currently rewritten URL from being rewritten further by following rules. For example, use it to rewrite the root-path URL (‘/’) to a real one, e.g., ‘/e/www/’.
‘next|N’ (next round)
Re-run the rewriting process (starting again with the first rewriting rule). Here the URL to match is again not the original URL but the URL from the last rewriting rule. This corresponds to the Perl next command or the continue command from the C language. Use this flag to restart the rewriting process, i.e., to immediately go to the top of the loop.
But be careful not to create an infinite loop!
‘chain|C’ (chained with next rule)
This flag chains the current rule with the next rule (which itself can be chained with the following rule, etc.). This has the following effect: if a rule matches, then processing continues as usual, i.e., the flag has no effect. If the rule does not match, then all following chained rules are skipped. For instance, use it to remove the “.www” part inside a per-directory rule set when you let an external redirect happen (where the “.www” part should not to occur!).
‘type|T=MIME-type’ (force MIME type)
Force the MIME-type of the target file to be MIME-type. For instance, this can be used to simulate the mod_alias directive ScriptAlias which internally forces all files inside the mapped directory to have a MIME type of “application/x-httpd-cgi”.
‘nosubreq|NS’ (used only if no internal sub-request)
This flag forces the rewriting engine to skip a rewriting rule if the current request is an internal sub-request. For instance, sub-requests occur internally in Apache when mod_include tries to find out information about possible directory default files (index.xxx). On sub-requests it is not always useful and even sometimes causes a failure to if the complete set of rules are applied. Use this flag to exclude some rules.

Use the following rule for your decision: whenever you prefix some URLs with CGI-scripts to force them to be processed by the CGI-script, the chance is high that you will run into problems (or even overhead) on sub-requests. In these cases, use this flag.

‘nocase|NC’ (no case)
This makes the Pattern case-insensitive, i.e., there is no difference between ‘A-Z’ and ‘a-z’ when Pattern is matched against the current URL.
‘qsappend|QSA’ (query string append)
This flag forces the rewriting engine to append a query string part in the substitution string to the existing one instead of replacing it. Use this when you want to add more data to the query string via a rewrite rule.
‘noescape|NE’ (no URI escaping of output)
This flag keeps mod_rewrite from applying the usual URI escaping rules to the result of a rewrite. Ordinarily, special characters (such as ‘%’, ‘$’, ‘;’, and so on) will be escaped into their hexcode equivalents (‘%’, ‘$’, and ‘;’, respectively); this flag prevents this from being done. This allows percent symbols to appear in the output, as in
RewriteRule /foo/(.*) /bar?arg=P1\=$1 [R,NE]

which would turn ‘/foo/zed’ into a safe request for ‘/bar?arg=P1=zed’.
‘passthrough|PT’ (pass through to next handler)
This flag forces the rewriting engine to set the uri field of the internal request_rec structure to the value of the filename field. This flag is just a hack to be able to post-process the output of RewriteRule directives by Alias, ScriptAlias, Redirect, etc. directives from other URI-to-filename translators. A trivial example to show the semantics: If you want to rewrite /abc to /def via the rewriting engine of mod_rewrite and then /def to /ghi with mod_alias:
RewriteRule ^/abc(.*) /def$1 [PT]
Alias /def /ghi

If you omit the PT flag then mod_rewrite will do its job fine, i.e., it rewrites uri=/abc/… to filename=/def/… as a full API-compliant URI-to-filename translator should do. Then mod_alias comes and tries to do a URI-to-filename transition which will not work.
Note: You have to use this flag if you want to intermix directives of different modules which contain URL-to-filename translators. The typical example is the use of mod_alias and mod_rewrite..

For Apache hackers
If the current Apache API had a filename-to-filename hook additionally to the URI-to-filename hook then we wouldn’t need this flag! But without such a hook this flag is the only solution. The Apache Group has discussed this problem and will add such a hook in Apache version 2.0.
‘skip|S=num’ (skip next rule(s))
This flag forces the rewriting engine to skip the next num rules in sequence when the current rule matches. Use this to make pseudo if-then-else constructs: The last rule of the then-clause becomes skip=N where N is the number of rules in the else-clause. (This is not the same as the ‘chain|C’ flag!)
‘env|E=VAR:VAL’ (set environment variable)
This forces an environment variable named VAR to be set to the value VAL, where VAL can contain regexp backreferences $N and %N which will be expanded. You can use this flag more than once to set more than one variable. The variables can be later dereferenced in many situations, but usually from within XSSI (via ) or CGI (e.g. $ENV{‘VAR’}). Additionally you can dereference it in a following RewriteCond pattern via %{ENV:VAR}. Use this to strip but remember information from URLs.
‘cookie|CO=NAME:VAL:domain[:lifetime[:path]]’ (set cocookie)
This sets a cookie on the client’s browser. The cookie’s name is specified by NAME and the value is VAL. The domain field is the domain of the cookie, such as ‘.apache.org’,the optional lifetime is the lifetime of the cookie in minutes, and the optional path is the path of the cookie

По конфигурации сервера посоветуйте?

Решил сервер купить, под веб. Задолбали хостеры.

На 26600 рублей насчитали мне примерно такое:

корпус серверный
Мать Socket 939, Lan, SATA RAID
Процессор Athlon 3000 Socket 939
Память 2x 512 MB, 200MHz/400 Mbps, Samsung
ЖД 200Gb SeagateBarracuda SATA, 7200
и всякая мелочь…

Люди просто фанаты Атлона, говорят, что он всех Ксеонов просто там делает и все такое.
Может, кто чего посоветует? Нагрузка предполагаемая – около 10-15 000 хостов в день (40-60 тыс. хитов, соотв.). С базами.
Или посоветуйте, где посмотреть, с чем сравнить… Есть у меня еще мысль типовые конфигурации осмотреть и что-то похожее на них подобрать.
И еще – услуги админства скока стоят? Я понимаю, что зависит от загрузки… Она не должна быть большой, по идее, если панелька есть. Предложили $300 единоразово плюс $40/мес.
И еще – панельки какие бывают и какие лучше? Работал только с Cpanel (ну не считая дурацких хостерских панелей)

Sweb зажигает

Как известно, вчера в Москве выло нехилое отключение электричества, из-за чего стояли трамваи и метро в части Москвы. Я, кстати, под это дело попал – в кои-то веки выехал в город – сначала в Яндекс, потом в Озон – и попал…
Ну и хостинги частично накрыло.
Прихожу, замученный, с книжками и т.п. – и вижу письмишко от Sweb:

В связи с проблемами с электропитанием в Москве, вызвавшими перебои
в работе большенства московских магистральных интернет-провайдеров,
доступ к серверам, расположенным на московских технологических
площадках отсутствует.

Благодаря тому, что технологическая площадка, на которой расположены
сервера компании SpaceWeb находится с Санкт-Петербурге, данная проблема
не окажет влияние на стабильность работы серверов хостинг-провайдера
SpaceWeb.

Надеемся, что данные проблемы носят временный характер и в ближайшее
время будут решены.

-забавно, а? Типа вот у вас в городе случилось, например, землятресение, а, например, аг-во недвижимости из другого города пишет: гыы лол, а у нас все хорошо! Покупайте недвижимость у нас!
Где-то я такую поговорку видел, типа с немецкого:

Самая лучшая радость – это злорадство, которое мы ощущаем, наблюдая неприятности тех, кому мы завидуем

Подсел я на базы данных…

Вот ведь что происходит. Базы – это же инструмент для всяких выборок, сортировок и т.п. – но никак не для хранения плейнтекста!
Зато работают постоянно, и если с ними на “ты”, то легче в них хранить ненужные данные.
Это развращает. 🙂
Пример. У клиента сайт на MTW, а я хочу писать лог по внешним заходам. Мне системный лог парсить лень – его, во-первых, найти надо, а во-вторых, парсить. 🙂 И я пишу нужные мне данные (заходы с поиска) в текстовый файлик – прямо скриптом генерации страницы магазина. Типа внутренняя статистика.
Нет, я понимаю, что у всех свои заморочки. У кого-то все нормально. У Мастерхоста, к примеру, я должен создать директорию, выставить ей права, и туда писАть. У МТВ – ну не работает никак – ни в директорию, и в основной каталог (а надо сказать, что домен – алиас основного домена и ну абсолютно не хочется разбираться, в чем фишка. Тем более сегодня :)).
Ну и пишем все в базу…

объемы

если у яндекса Уникальных серверов: 1 722 162, уникальных документов: 457 501 435, то:
457501435 не вмещается в 3 байта, т.е., id страницы должен занимать 4 байта (если по битам не считать). Если на каждой странице по рунету в среднем 20 ссылок (внутренних плюс внешних), объем для хранения графа ссылок будет 36.6 Гб – многовато.
1722162 входит в 3 байта, если по 100 внешних ссылок с сайта (число взято от балды) – объем графа хостов будет 516 Мб.
Как раз на CD войдет. А вот как его обсчитывать…

Арбатек sucks – 2

Нет, один аккаунт, с 2-3 тысячами хостов в сумме, я уже перевел с Арбатека на фиг.
Так по-новой пошло со вторым акком.
Что самое интересное. Когда у Арбатека возникает “превышение системных ресурсов” в виде 5% процессора или памяти, шлется письмо вроде этого:

На Вашем аккаунте ***.RU Администратором зафиксировано устойчивое превышение лимита на использование системных ресурсов, выделенных Вашему виртуальному серверу в соответствии с Договором и нашими Правилами.
User Domain %CPU %MEM Mysql Processes
Top Process %CPU 12.0 [php ]
Top Process %CPU 10.0 [php ]
Top Process %CPU 9.0 /usr/bin/php delivery.php
Пожалуйста, безотлагательно проведите анализ и примите меры во избежание полного прекращения предоставления сервиса.

-раньше, когда у меня подобное возникало, все-таки в качестве процесса показывался некий скрипт, потенциально часто запускаемый и соотвествующий товарной странице.
А сейчас – delivery.php превысило. Прикол же в том, что эту страницу посетили за полдня 12 человек. И тут превышение… 🙂
Видимо, они берут из кучи первый попавшийся процесс и шлют письмо, что этот процесс превысил ресурсы. Тупо.
А ты сиди и думай, проводи безотлагательный анализ…
Черт бы их!

Термсы Арбатека меня радуют…

в части реселлерской программы – просто какое-то руководство для шпиёнов:

Могут ли мои клиенты узнать, что я реселлер?
Мы соблюдаем полную анонимность перед конечным клиентом. Вы оказываете техническую поддержку и проводите расчеты с вашими клиентами. Мы никак не вступаем в контакт с вашими клиентами.

Какие технические меры вы соблюдаете, чтобы сохранить анонимность?
Мы бесплатно предоставляем анонимные DNS серверы, которые никак не указывают на нас. Вы также можете использовать бесплатные личные DNS серверы ns1.вашеимя.ru и ns2.вашеимя.ru.

Что такое персональные DNS серверы?
Использование этой бесплатной услуги позволяет создать иллюзию того, что вы размещаете домены ваших клиентов на собственном оборудовании. В случае если вы выберете эту опцию, whois записи доменов ваших пользователей будут показывать ns1.вашеимя.ru и ns2.вашеимя.ru, что придает уверенности конечному пользователю в надежности провайдера. Для того, чтобы эта функция работала, доменное имя реселлера (указываемое при оформлении заказа) должно быть проделегировано на наше оборудование.

Кто регистрирует доменные имена для реселлера и его клиентов?
Для соблюдения полной анонимности реселлер сам регистрирует доменные имена для себя и конечных пользователей.

-только надо было написать, что если будут пытать, все равно, честное пионерское, мы вас не выдадим врагу. 🙂
Но если вам не понравится качество наших услуг, учтите, что

использование ненормативной лексики в общении с сотрудниками и службами компании недопустимо и расценивается как грубое нарушение Правил.

-видать, проблема навязла в зубах… Интересно, и много таких желающих использовать ненормативную лексику? Видно, много… 🙂

Про спам комментариев в блогах

Многие отключают комментарии в блогах. Потому, что их спамят. Я у себя использовал некое временное решение для борьбы с этим делом.
На этот блог было две “атаки” спаммеров – оба раза по 15-20 сообщений проспамили с промежутком недели в две. После первого раза я сделал одну вещь – при посте страница отдает error 500 и нормальный контент. После второго раза все прекратилось – видимо, когда спамерская тулза прожевала эту ошибку, она решила, что на блоге все плохо и не стоит с ним иметь дел. 🙂 Еще 4ХХ ошибка – тоже вариант.
В принципе, спамерские софты должны это отлавливать – им же не хочется спамить в мертвые блоги. 🙂
Хотя те, кто юзает готовые софты блогов, напрягутся посильнее, выискивая нужное место в скрипте…
Может, кому-то поможет…