Skip to content


Внедряем Captcha в CuteNews

captcha exampleЗащита от спама сейчас - просто необходимый элемент любого сайта, где присутствует возможность заполнения каки-либо форм (будь то форма для обратной связи с автором, либо форма добавления ссылки в каталог ссылок или еще что-то подобное). Одним из наиболее эффективных способов противодействия появлению спама на веб-страницах является CAPTCHA (расшифровывается как Completely Automated Public Turing test to tell Computers and Humans Apart) т.е. одна из разновидностей теста Тьюринга. Пример такого теста в достаточно жеcтком для пользователя варианте :) приведен на картинке слева.

Порядок установки CAPTCHA в новостной скрипт CuteNews.

  1. Добавляем в файл data/Default.tpl в код формы ввода комментария $template_form (примерно 62-ая строка):
    data/Default.tpl
    Текст на картинке: 
    picture with code

    Полная версия кода формы у меня получилась такая:

    $template_form = <<<HTML
    <table border="0" width="500" cellspacing="0" cellpadding="2" style="margin-bottom: 20px">
    <thead style="background: rgb(239,244,11); text-align: center">
    <tr><td colspan="2"><span style="font-size: 12pt">Оставить комментарий</span></td></tr>
    </thead>
    <tr><td height="5" colspan="2"></td></tr>
    <tr><td width="20%">Имя:</td><td><input type="text" name="name" tabindex="1"></td></tr>
    <tr><td>E-mail:</td><td><input type="text" name="mail" tabindex="2"></td></tr>
    <tr><td colspan="2"> <textarea style="width: 100%" rows="8" name="comments" tabindex="3"></textarea><br /></td></tr>
    <tr><td colspan="2"><div style="margin-top: 10px; float: left">Введите цифры с картинки: <input tabindex="4" type="text" name="captcha" size="10" /></div>
    <img src="captcha.php" alt="picture with code" valign="middle" /></td></tr>
    <tr><td colspan="2" align="center"><input tabindex="5" type="submit" name="submit" value="Добавить комментарий" accesskey="s"></td></tr></table>
    HTML;
  2. Положить в корень сайта файлы captcha.php и Comic_Sans_MS.ttf. Взять их можно тут.
  3. Поправить файл inc/shows.inc.php, добавив в него начиная примерно со 172-ой строки следующее:
    inc/shows.inc.php
    @session_start();
    if (! (isset($_SESSION["captcha"]) && $_SESSION["captcha"]===$_POST["captcha"]) ) {
     echo "
    Текст с картинки введен НЕВЕРНО

    Вернуться назад
    "; $CN_HALT = TRUE; break 1; } unset($_SESSION["captcha"]);
  4. Поудалять из файла site/data/comments.txt спам-комментарии, которые попали туда до того, как была прикручена captcha :)

Чтобы эта версия captcha работала, PHP должен быть сконфигурирован со следующими опциями (актуально для версии 5.3.0):
−−with-gd=/usr
−−enable-gd-native-ttf
−−with-freetype-dir=/usr
−−with-zlib
−−with-zlib-dir=/usr

Путь к библиотекам (/usr), естественно, следует заменить так, чтобы он был актуален для Вашей системы.

Posted in Web-apps.

Tagged with , .


Организация уведомлений о событиях

Представим ситуацию: мы ожидаем, что в каком-то лог-файле одного из серверов скоро должна появиться определенная строка, но когда именно она там появится мы не знаем. Чтобы не тратить время (которое при определенных обстоятельствах может превращаться в деньги :) на высматривание в лог-файле этой самой заветной строчки и продолжать работу за своим компьютером (пусть у него, например, будет IP-адрес 10.10.10.10), можно организовать автоматическое уведомление о наступившем событии. Например, так.

  1. На удаленном сервере (пусть для примера у него будет ip-адрес 10.10.10.254) запускаем такую команду:
    $ tail -f /var/log/somelog | grep -m 1 "our_event" && nc 10.10.10.10 2740

    В результате при следующем появлении в файле /var/log/somelog текста "our_event" откроется исходящее tcp-соединение на хост мониторинга 10.10.10.10 на порт 2740. Далее следует позаботиться об адекватной обработке этого на хосте 10.10.10.10. Ключ '-m 1' у команды grep означает, что она должна завершиться после 1-го найденного совпадения.

  2. На хосте мониторинга запускаем сервис xinetd (если он еще не запущен, предварительно создав файл /etc/xinetd.d/alarm примерно такого содержания:
    service alarm
    {
      disable = no
      id = alarm
      wait = no
      socket_type = stream
      user = me
      group = me
      server = /usr/local/sbin/show_alarm.sh
      bind = 10.10.10.10
      only_from = 10.10.10.254
    }

    Номер порта не указан по следующей причине:

    $grep -P "^alarm\s" /etc/services
    alarm           2740/tcp                        # Alarm
    alarm           2740/udp                        # Alarm

    Если вдруг в вашем файле /etc/services нет таких строк, то в /etc/xinetd.d/alarm нужно еще добавить строку port = 2740. Описание параметров конфигурации демона xinetd можно почитать в файле /etc/xinetd.d/chargen-stream ну и, конечно, в man 5 xinetd.conf.

  3. Создаем скрипт /usr/local/sbin/show_alarm.sh:
    #!/bin/bash
    kalarm "Needed string found at 10.10.10.254" 2> /dev/null

    и делаем этот файл исполняемым:

    chmod +x /usr/local/sbin/show_alarm.sh

    Утилита kalarm будет нам показывать на мониторе заданное сообщение, она входит в пакет kdepim, в чем можно убедиться с помощью следующей команды:

    $rpm -qf /usr/bin/kalarm
    kdepim-4.2.4-1.fc10.x86_64

    Также kalarm умеет издавать звуки, запускать внешние приложения (как – описано в man), что открывает широкий простор для фантазии.

  4. На хосте мониторинга 10.10.10.10 в firewall-е разрешаем входящие tcp-соединения с сервера 10.10.10.254 на tcp-порт 2740:
    /sbin/iptables -I INPUT -s 10.10.10.254 -p tcp --dport 2740 -j ACCEPT

    В результате при появлении строки "our_event" в файле /var/log/somelog на сервере 10.10.10.254 мы сразу же получим уведомление об этом в виде всплывающего окошка на хосте мониторинга 10.10.10.10.

Posted in *nix.

Tagged with .


О дистрибутивах Linux-а

Дочка Убунту прибежала к Дебиану и, весело смеясь, поцеловала его в лоб: "С днём рождения, папа!" Затем она окинула радостным взглядом сидящих за столом гостей и спросила своим звонким голосом:
– Папа, а где Gentoo, разве он ещё не пришёл?
– Нет, он ещё только собирается.

Posted in Fun.


Блондинка на "Таврии"

Блондинка за рулемЕсть у меня одна подруга, выглядит как типичная блондинка – шпильки 10см, губки бантиком, ноги от ушей и т.д. Как-то "получила" она права, естессно потратилась на это дело и сразу ей захотелось машинку. Денег было немного и потому купила она себе что-то типа "Таврия" х. з какого года. Все бы ничего, просто иногда машинка кипела, в пробках особенно. Но она мужественно с этим справлялась, подливая водички в нужное отверстие... Как-то на день рождения, не зная чтобы такого попросить у своих родителей, она попросила сделать ей следующий подарок: "А покрасьте-ка мне мою машинку в розовый цвет!" Сказано – сделано. Она стала обладательницей розовой Таврии.)) И вот как-то на выходных решила она с подругами зарулить на пикничок, на дачу, а перед тем как забрать подруг, позвонила им и предупредила – "Возьмите с собой водички, вдруг закипим на дороге". Подруги в это время уже начинали праздновать выходные, и поэтому из тары у них было только бутылка мартини и сок. Быстро добив содержимое и наполнив их водой, они тронулись в путь. Естественно, в пробке на Пулковском шоссе, на выезде из города их машинка закипела... А теперь представьте какую картину увидели проезжавшие в пробке мимо мужики... Три блондинки на каблучках и при параде, две из которых совсем не трезвые, стоят, пошатываясь, у закипевшей РОЗОВОЙ Таврии и ЗАЛИВАЮТ В НЕЕ СОК С МАРТИНИ ОДНОВРЕМЕННО... Гогот довольных мужиков был слышен даже сквозь закрытые окна проезжавших мимо машин... и видать эта картина так много умов поразила, что еще неделю она ловила на себе ухмыляющиеся взгляды и тычки пальцами "вон вон смори бландинк поехала".

Posted in Fun.