наши услуги

спецпредложения

Главная » БЛОГ » FreeBSD » Создаем форму обратной связи и панель управления для rejik

Комментарии (0) Автор:

Создаем форму обратной связи и панель управления для rejik

Процесс установки программы для блокирования нежелательного контента мы рассмотрим в одной из следующих статей, т.к. установка простая, а для управления пришлось писать свою морду. Режик отлично блокирует сайты и баннеры, но появляется проблема с оповещением админа в случаях ложного срабатывания блокировки, да и для пользователей сообщение типа «сайт заблокирован» или просто пустой экран мало о чем говорит, портит настроение и нервы. Еще возможен вариант когда пользователь звонит админу и по телефону пытается продиктовать адрес по которому не пускает режик... очень не удобно не правда ли? И сейчас поговорим о том как создать web интерфейс для rejik. Моя конфигурация: Считаем, что FreeBSD+squid+rejik+Apache уже установлены, настроены и режик фильтрует сайты.
#uname -v
FreeBSD 7.1-RELEASE-p3
#pkg_info|grep rejik
rejik-3.2.1_1       A squid redirector used for blocking unwanted content
#squid -v
Squid Cache: Version 2.7.STABLE6
#apachectl -v
Server version: Apache/2.2.11 (FreeBSD)
Server built:   Jul 30 2009 14:28:29
#php-v
PHP 5.2.10 with Suhosin-Patch 0.9.7 (cli) (built: Jul 30 2009 14:41:03)
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2009 Zend Technologies
Настройка: Создаем форму обратной связи для пользователей Конфигурационный файл rejik: redirector.conf:
#!/bin/sh
#----------------------------------------------------------------------
# Description: Rejik config
# Author:  Andrey Ryabchenko (phantom)
# Created at: Thu Feb 11 18:32:08 EET 2010
# Computer: service-it
# System: FreeBSD 7.1-RELEASE-p3
# Copyright (c) 2010   All rights reserved.
#----------------------------------------------------------------------
## Если изменяешь этот файл - перезапусти squid
## например так:   squid -k reconfigure
# Описываем логи
error_log /usr/local/rejik/redirector_err.log
change_log /usr/local/rejik/redirector.log
make-cache /usr/local/rejik/make-cache
# Разрешенные URL независимо от наличия в базе режика
allow_urls /usr/local/rejik/banlists/allow_urls.txt
# IP для которых правила режика не действуют
allow_ip f:/usr/local/rejik/allow_ip.txt
# Далее описание секций блокировок
# пути к спискам банов и пути к ссылка к файлам переадресации
# stop.php - веб форма, заявка не снятие блокировки
# banner.gif - прозрачная картинка размером 1х1 пиксел для показа вместо баннеров
# URL к которым запрещен доступ независимо от наличия в базе режика
#(не сработает если этот же сайт будет в allow_urls файле)
ban_dir /usr/local/rejik/banlists/my-deny-sites
url http://192.168.0.1/redir_page/stop.php
# далее все понятно, это стандартные категории режика
ban_dir /usr/local/rejik/banlists/banners
url http://192.168.0.1/redir_page/banner.gif
#log off

ban_dir  /usr/local/rejik/banlists/porno
url http://192.168.0.1/redir_page/stop.php

ban_dir /usr/local/rejik/banlists/dating
url http://192.168.0.1/redir_page/stop.php

ban_dir /usr/local/rejik/banlists/chats
url http://192.168.0.1/redir_page/stop.php

ban_dir /usr/local/rejik/banlists/online-games
url http://192.168.0.1/redir_page/stop.php

ban_dir /usr/local/rejik/banlists/phishing
url http://192.168.0.1/redir_page/stop.php

ban_dir /usr/local/rejik/banlists/spyware
url http://192.168.0.1/redir_page/stop.php

ban_dir /usr/local/rejik/banlists/virus-detect
url http://192.168.0.1/redir_page/stop.php
ban_dir /usr/local/rejik/banlists/web-proxy
url http://192.168.0.1/redir_page/stop.php
Скрипт с формой обратной связи stop.php :
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>!СТОП-ЛИСТ! Запрошенный вами адрес в "черном" списке.</title>
<style>
body { font:bold 10pt Arial, Helvetica, sans-serif; color:#666666; background:url(http://192.168.0.1/redir_page/CyberCopLogo.jpg) no-repeat left bottom;}
.info { border:solid; border-width:1px; border-color:#FFD2D2; padding:5px; margin:auto; margin-bottom:10px; background-color:#66CC33;}
.txt { border:solid; border-width:1px; border-color:#FFD2D2; padding:5px; margin:auto; margin-bottom:10px; width:700px; font: 8pt Arial, Helvetica, sans-serif;}
.txt p {padding:0; margin:0; margin-top:3px;}
.warn { background-color:#FFFF00; border:dotted; border-width:2px; border-color:#FF0000; margin:auto; margin-top:10px; margin-bottom:10px; font: bold 20pt Arial, Helvetica, sans-serif; padding:20px; width:500px; color:#000000;}
.submit { border:1px; background-color:#FFFF00; border-color:#666666; border-style:dashed; margin:3px; padding:3px;}
</style>
<link rel="stylesheet" type="text/css" href="/assets/snippets/jot/templates/jot.css" />
<link rel="stylesheet" type="text/css" href="/assets/snippets/jot/templates/jot.css" />
</head>
<body>

<center>
<?php
$refer = getenv("HTTP_REFERER");
$ip = ($_SERVER['HTTP_X_FORWARDED_FOR'] == "" ? $_SERVER['REMOTE_ADDR'] : $_SERVER['HTTP_X_FORWARDED_FOR']);
?>
<div align="center" class="warn">Запрошенный вами адрес находится в "черном" списке.</div>
<div class="txt">
<p><font color="#FF0000">Почему так произошло?</font> Очевидно запрошенный вами веб-узел был уличен в распространении контента несущего угрозу вашему компьютеру или мешающего в работе.
<p><font color="#FF0000">Возможна ли ошибка?</font> Каждый из адресов проверялся не менее 300!!!раз различными людьми прежде чем попасть в нашу базу, и несмотря на это ошибки возможны. Сайт может сменить профиль деятельности, владельца, и .т.п. если вы обнаружили ошибку воспользуйтесь формой ниже.
</div>
<div align="center" style="margin:0px auto; padding:20px; background-color:#FFFFCC; width:400px; ">
Заяка для снятия блокировки  сайта.
<div style="padding:5px;"><?php get_blocked_url(); ?></div>

<?php
function get_blocked_url()
{
echo ('<form name="GetBlockedUrl" method="post"><input name="GetBlockedUrl" type="submit" value="получить адрес заблокированного сайта" /></form>');
}

function send_form($ip, $refer, $text, $email)
{
echo ('
<form name="send_form" method="post" action="">
<div>Ваш IP:'); print "$ip"; echo ('
<div>URL: '); print "$refer"; echo('</div>
<div style="padding:10px;" align="center">
<textarea name="text" cols="40" rows="3" onFocus="if(this.value==\'Причина по которой Вы хотите посещать этот сайт\') this.value=\'\';" onBlur="if(this.value==\'\') this.value=\'Причина по которой Вы хотите посещать этот сайт\'"; >');
if ($text == "") { print "Причина по которой Вы хотите посещать этот сайт"; } else { print "$text"; }
echo ('</textarea>
</div>
<div style="margin-bottom:10px;">email: <input size="40" name="email" value="');
if ($email == "") { print "ваш email для ответа о результатах"; } else { print "$email"; }
echo ('" onFocus="if(this.value==\'ваш email для ответа о результатах\') this.value=\'\';" onBlur="if(this.value==\'\') this.value=\'ваш email для ответа о результатах\'"; /></div>
<input type="submit" name="send_form" value="Отправить заявку"/>
</div>
</form>
');
}

if ($_POST['GetBlockedUrl'])
{
send_form($ip, $refer, $text, $email);
}

if ($_POST['send_form'])
{
# переменные из полей формы
$text = $_POST["text"];
$email = $_POST["email"];

# ПРОВЕРКА ЗАПОЛНЕНИЯ ФОРМЫ
if ($text == "" or $text == "Причина по которой Вы хотите посещать этот сайт")
{
//print "Укажите причину посещений этого сайта";
echo ('<script>alert (\'Укажите причину посещений этого сайта\')</script>');
send_form($ip, $refer, $text, $email);
exit;
}
if ($email == "" or $email == "ваш email для ответа о результатах")
{
echo('<script>alert (\'Укажите свой правильный e-mail адрес\')</script>');
send_form($ip, $refer, $text, $email);
exit;
}

# ОТПРАВКА МЫЛА
$mail_to = 'no-spam@service-it.com.ua'; //вам потребуется указать здесь Ваш настоящий почтовый ящик, куда должно будет прийти письмо.
$type = 'plain'; //Можно поменять на html; plain означяет: будет присылаться чистый текст.
$charset = 'UTF-8';

include('smtp-func.php');
    $message     = "IP адрес клиента : $ip;"."\n";
    $message    .= "E-Mail клиента : $email;"."\n";
    $message    .= "Запрошенный сайт : $refer"."\n";
    $message    .= "Текст сообщения : $text"."\n";
    $subject = "Запрос удаления блокировки сайта";
    $mail_from = $email;
    $replyto = $email;
    $headers = "To: \"Administrator\" <$mail_to>\r\n".
              "From: \"$replyto\" <$mail_from>\r\n".
              "Reply-To: $replyto\r\n".
              "Content-Type: text/$type; charset=\"$charset\"\r\n";
   $sended = smtpmail($mail_to, $subject, $message, $headers);
   echo '<html>
        <head>
        <meta http-equiv="content-type" content="text/html; charset='.$charset.'">
        <link rel="stylesheet" type="text/css" href="/assets/snippets/jot/templates/jot.css" />
<link rel="stylesheet" type="text/css" href="/assets/snippets/jot/templates/jot.css" />
</head>
              <body>';
   if (!$sended) echo 'Писмо не удалось отправить. Пожалуйста свяжитесь с администратором сайта по адресу: '.$mail_to;
   else echo 'Письмо было успешно отправлено. В ближайшее Вы получите ответ на него.';
   echo '</body>';
   exit;
}?>

<center>
</body>
</html>

для отправки мыла использую скрипт smtp-func.php (писан не мной, автора не знаю потому без обратной ссылки, но в поисковике находится он без проблем) использование php скрипта для отправки почты позволяет обрабатывать возможные ошибки SMTP и уведомлять об этом пользователя, а также выполнять отправку почты через любой SMTP сервер, а не только localhost. Строки про SMTP авторизацию закоментировал; кому нужно используйте. smtp-func.php :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
<link rel="stylesheet" type="text/css" href="/assets/snippets/jot/templates/jot.css" />
<link rel="stylesheet" type="text/css" href="/assets/snippets/jot/templates/jot.css" />
</head>

<body>

<?php
//$config['smtp_username'] = 'no-spam@service-it.com.ua';  //Смените на имя почтового ящика отправителя.
$config['smtp_port']     = '25'; // Порт работы. Не меняйте, если не уверены.
$config['smtp_host']     = '127.0.0.1';  //сервер для отправки почты
//$config['smtp_password'] = '';  //Измените пароль
$config['smtp_debug']    = true;  //Если Вы НЕ хотите видеть сообщения ошибок, укажите true вместо false
$config['smtp_charset']  = 'UTF-8';   //кодировка сообщений. (или UTF-8, итд)
//$config['smtp_from']     = 'My Office Net'; //Ваше имя - или имя Вашего сайта. Будет показывать при прочтении в поле "От кого"

function smtpmail($mail_to, $subject, $message, $headers='') {
         global $config;
        $SEND =   "Date: ".date("D, d M Y H:i:s") . " UT\r\n";
        $SEND .=   'Subject: =?'.$config['smtp_charset'].'?B?'.base64_encode($subject)."=?=\r\n";
        if ($headers) $SEND .= $headers."\r\n\r\n";
        else
        {
                $SEND .= "Reply-To: ".$config['smtp_username']."\r\n";
                $SEND .= "MIME-Version: 1.0\r\n";
                $SEND .= "Content-Type: text/plain; charset=\"".$config['smtp_charset']."\"\r\n";
                $SEND .= "Content-Transfer-Encoding: 8bit\r\n";
                $SEND .= "From: \"".$config['smtp_from']."\" <".$config['smtp_username'].">\r\n";
                $SEND .= "To: $mail_to <$mail_to>\r\n";
                $SEND .= "X-Priority: 3\r\n\r\n";
        }
        $SEND .=  $message."\r\n";
         if( !$socket = fsockopen($config['smtp_host'], $config['smtp_port'], $errno, $errstr, 30) ) {
            if ($config['smtp_debug']) echo $errno."<br>".$errstr;
            return false;
         }

            if (!server_parse($socket, "220", __LINE__)) return false;

            fputs($socket, "HELO " . $config['smtp_host'] . "\r\n");
            if (!server_parse($socket, "250", __LINE__)) {
               if ($config['smtp_debug']) echo '<p>Не могу отправить HELO!</p>';
               fclose($socket);
               return false;
            }
/*            fputs($socket, "AUTH LOGIN\r\n");
            if (!server_parse($socket, "334", __LINE__)) {
               if ($config['smtp_debug']) echo '<p>Не могу найти ответ на запрос авторизаци.</p>';
               fclose($socket);
               return false;
            }
            fputs($socket, base64_encode($config['smtp_username']) . "\r\n");
            if (!server_parse($socket, "334", __LINE__)) {
               if ($config['smtp_debug']) echo '<p>Логин авторизации не был принят сервером!</p>';
               fclose($socket);
               return false;
            }
            fputs($socket, base64_encode($config['smtp_password']) . "\r\n");
            if (!server_parse($socket, "235", __LINE__)) {
               if ($config['smtp_debug']) echo '<p>Пароль не был принят сервером как верный! Ошибка авторизации!</p>';
               fclose($socket);
               return false;
            }
*/            fputs($socket, "MAIL FROM: <".$config['smtp_username'].">\r\n");
            if (!server_parse($socket, "250", __LINE__)) {
               if ($config['smtp_debug']) echo '<p>Не могу отправить комманду MAIL FROM: </p>';
               fclose($socket);
               return false;
            }
            fputs($socket, "RCPT TO: <" . $mail_to . ">\r\n");

            if (!server_parse($socket, "250", __LINE__)) {
               if ($config['smtp_debug']) echo '<p>Не могу отправить комманду RCPT TO: </p>';
               fclose($socket);
               return false;
            }
            fputs($socket, "DATA\r\n");

            if (!server_parse($socket, "354", __LINE__)) {
               if ($config['smtp_debug']) echo '<p>Не могу отправить комманду DATA</p>';
               fclose($socket);
               return false;
            }
            fputs($socket, $SEND."\r\n.\r\n");

            if (!server_parse($socket, "250", __LINE__)) {
               if ($config['smtp_debug']) echo '<p>Не смог отправить тело письма. Письмо не было отправленно!</p>';
               fclose($socket);
               return false;
            }
            fputs($socket, "QUIT\r\n");
            fclose($socket);
            return TRUE;
}
function server_parse($socket, $response, $line = __LINE__) {
        global $config;
    while (substr($server_response, 3, 1) != ' ') {
        if (!($server_response = fgets($socket, 256))) {
                   if ($config['smtp_debug']) echo "<p>Проблемы с отправкой почты!</p>$response<br>$line<br>";
                   return false;
                }
    }
    if (!(substr($server_response, 0, 3) == $response)) {
           if ($config['smtp_debug']) echo "<p>Проблемы с отправкой почты!</p>$response<br>$line<br>";
           return false;
        }
    return true;
}

?>
</body>
</html>

Создаем простой веб интерфейс для режика Эта панель позволяет в браузере редактировать файлы режика которые отвечают за пользовательские ограничения, перезапускать squid, смотреть текущую статистику rejik. при желании в нее можно элементарно добавить кнопки например ручного обновления баз из списков DBL index.php :
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Панель управления Rejik</title>
<link rel="stylesheet" type="text/css" href="/assets/snippets/jot/templates/jot.css" />
<link rel="stylesheet" type="text/css" href="/assets/snippets/jot/templates/jot.css" />
</head>

<body>
<p><h1 align="center">Панель управления Rejik</h1></p>
<a href="index.php">обновить страницу</a>
<form name="squid_reconfigure" method="post" action=""><input type="submit" name="squid_reconfigure" value="Применить новые настройки сервера"></form>
<?php
if ($_POST['squid_reconfigure'])
{
system("/usr/local/bin/sudo /usr/local/sbin/squid -k reconfigure &");
echo('<font style="color:#FF0000">Применяю настройки прокси сервера... </font>');
echo "<meta http-equiv='refresh'; content='3; url=http://192.168.0.1/rejik_panel/index.php'> ";
}?>

<table width="100%">
<tr>
<td align="center">
<p>Список IP на которые не распростаняются блокировки:<br />
<?php
if ($_POST['allow_ip'])
{
$file=fopen('/usr/local/rejik/allow_ip.txt','w');
fputs($file,$_POST['allow_ip']);
fclose($file);
echo '<font style="color:#FF0000">Данные записаны в файл!</font>';
echo "<meta http-equiv='refresh'; content='3; url=http://192.168.0.1/rejik_panel/index.php'> ";
}
else
{
echo '
<form method="post" action="">
<textarea rows="10" cols="40" name="allow_ip">
'.file_get_contents('/usr/local/rejik/allow_ip.txt').'
</textarea><br>
<input type="submit" value="Сохранить">
</form>';
}?>
</p>
</td>

<td align="center">
Список URL на которые не распростаняются блокировки:<br />
<?php
if ($_POST['allow_url'])
{
$file=fopen('/usr/local/rejik/banlists/allow_urls.txt','w');
fputs($file,$_POST['allow_url']);
fclose($file);
echo '<font style="color:#FF0000">Данные записаны в файл!</font>';
echo "<meta http-equiv='refresh'; content='3; url=http://192.168.0.1/rejik_panel/index.php'> ";
}
else
{
echo '
<form method="post" action="">
<textarea rows="10" cols="40" name="allow_url">
'.file_get_contents('/usr/local/rejik/banlists/allow_urls.txt').'
</textarea><br>
<input type="submit" value="Сохранить">
</form>';
}?>
</td>
</tr>

<tr>

<td align="center">
Список URL заблокированных вручную:<br />
<font size="-2">работает для всей сети кроме исключаемых IP</font><br>
<?php
if ($_POST['deny_url'])
{
$file=fopen('/usr/local/rejik/banlists/my-deny-sites/urls','w');
fputs($file,$_POST['deny_url']);
fclose($file);
echo '<font style="color:#FF0000">Данные записаны в файл!</font>';
echo "<meta http-equiv='refresh'; content='3; url=http://192.168.0.1/rejik_panel/index.php'> ";
}
else
{
echo '
<form method="post" action="">
<textarea rows="10" cols="40" name="deny_url">
'.file_get_contents('/usr/local/rejik/banlists/my-deny-sites/urls').'
</textarea><br>
<input type="submit" value="Сохранить">
</form>';
}?>
</td>

<td align="center"> </td>

</tr>

</table>

<form name="rejik_stat" method="post" action=""><input type="submit" name="rejik_stat" value="Просмотреть статистику блокировок"><br>
<?php
if ($_POST['rejik_stat'])
{
echo ('<textarea rows="15" cols="85">');
system("/usr/local/rejik/rejik_stat.sh -i /usr/local/rejik/redirector.log &");
echo ('</textarea>');
}?>

</form>
</body>
</html>

запись в конфиге httpd.conf для публикации панели режика:
Alias /rejik_panel "/usr/local/www/data/rejik_panel/"
<directory >
 Options ExecCGI
 AddHandler cgi-script .cgi
 Order allow,deny
 Allow from all
 Options FollowSymLinks ExecCGI Indexes
 AllowOverride All
</directory>
закрываю доступ с помощью файлов .htaccess + .htpasswd .htaccess :
AuthName "Service IT REJIK panel"
AuthType Basic
AuthUserFile /usr/local/www/data/rejik_panel/.htpasswd
require valid-user
.htpasswd создается с помощью /usr/local/sbin/htpasswd Запись в файле /usr/local/etc/sudoers: нужна для срабатывания команды перезапуска сквида:
www     ALL = NOPASSWD: /usr/local/sbin/squid -k reconfigure
PS: Базы режика выкладывать не буду. заработайте сами право скачать свежие базы. это очень просто. потратите пару часиков на просмотр бан листов и этим поможете остальному сообществу.
продажа серверов бу
FREEhost.com.ua - качественный хостинг и регистрация доменов во всех зонах
Украинский хостинг - UNIX хостинг & ASP хостинг

Write a comment

  • Required fields are marked with *.

If you have trouble reading the code, click on the code itself to generate a new random code.