Представляю вашему вниманию PHP-скрипт тонко настраиваемого безопасного веб-гейта (web-gate).
Гейт принимает данные от внешней программы и записывает их в лог.
Исходник под катом.
<?php
/*
* Web-gate (Веб-гейт)
* Автор - Figaroo
* http://blogfigaroo.ru/
*/
/* ***************** Настройки ***************** */
// Для переменных величин
//* [IP] - IP-адрес, [DD] - день, [MM] - месяц, [YYYY] или [YY] - год в 4/2-значном формате
//* [HH] - часы, [II] - минуты, [SS] - секунды, [INFO] - пришедшие (входные) данные
// Настройка вывода ошибок в PHP
Error_Reporting (~E_ALL); // лучше не менять
////////////////////
#date_default_timezone_set("Europe/Moscow");
$_GATE = array();
// Режим работы гейта: "file" - запись логов в файл, "mail" - отправка логов на почту, "mixed" - запись логов в файл и отправка на почту
$_GATE['settings']['mode'] = "mixed";
// Имя переменной, которая будет принимать данные
$_GATE['settings']['variable'] = "input";
// Имя переменной для доступа к админке
$_GATE['settings']['admin_prms'] = "admin";
// Имя и пароль пользователя для доступа к статистики гейта (путь_к_этому_файлу?mode=stat)
// Примечание: обязательно замените пароль на свой, со стандартным гейт работать не будет (минимальная длина пароля - 8 символов)
$_GATE['settings']['auth_login'] = "Figaroo"; // логин
$_GATE['settings']['auth_password'] = "satana"; // пароль
// Формат логов
$_GATE['settings']['format'] = "[IP] | [DD].[MM].[YYYY], [HH]:[II]:[SS] | [INFO]\n";
// Название окошка авторизации
$_GATE['settings']['auth_string'] = "Figaroo.Webgate";
// Выводить ли сообщения об ошибках?
// ВНИМАНИЕ! Используйте только для отладки. На работающих гейтах использовать строго не рекомендуется!
$_GATE['settings']['show_error_info'] = 1; // 1 - да, 0 - нет
// Максимальный размер строки с входными данными (в символах)
$_GATE['settings']['input_size'] = 1000;
// Настройки для режимов "file" и "mixed"
$_GATE['settings']['file_name'] = "data.log"; // имя файла для записи логов (файл должен иметь права доступа 666)
$_GATE['settings']['file_order'] = "DESC"; // порядок записи: "DESC" - новые сверху, "ASC" - новые снизу
// Настройки для режимов "mail" и "mixed"
$_GATE['settings']['mail_name'] = "kaznitel@yandex.ru"; // email-адрес для отправки логов
$_GATE['settings']['mail_from'] = "figaroo-webgate@figaroo.ru"; // email-адрес, с которого будут приходить логи
$_GATE['settings']['mail_title'] = "From Figaroo.Webgate ([DD].[MM].[YYYY], [HH]:[II]:[SS])"; // заголовок письма
/* ***************** Figaroo.Web-gate ***************** */
// функция обработки данных
function secru ($text) {
$text = trim ($text);
$text = htmlspecialchars ($text, ENT_QUOTES);
return $text;
}
// получаем основные данные для скрипта
$_GATE['script']['url'] = "http://".$_SERVER['SERVER_NAME'].$_SERVER['SCRIPT_NAME'];
$_GATE['script']['remote_addr'] = secru($_SERVER['REMOTE_ADDR']);
$_GATE['script']['errors'] = "";
// проверяем правильность настроек
if (!preg_match("/^(file|mail|mixed)$/", $_GATE['settings']['mode']))
$_GATE['script']['errors'] .= "
<li>Неверно задан параметр \$_GATE['settings']['mode'];<br />\n";
if (strlen($_GATE['settings']['auth_login']) == 0)
$_GATE['script']['errors'] .= "
<li>Не заполнен параметр \$_GATE['settings']['auth_login'];<br />\n";
if (strlen($_GATE['settings']['auth_password']) < 6 || $_GATE['settings']['auth_password'] == "password")
$_GATE['script']['errors'] .= "
<li>Неверно задан параметр \$_GATE['settings']['auth_password'];<br />\n";
if (($_GATE['settings']['mode'] == "file" || $_GATE['settings']['mode'] == "mixed") && strlen($_GATE['settings']['file_name']) == 0)
$_GATE['script']['errors'] .= "
<li>Неверно задан параметр \$_GATE['settings']['file_name'];<br />\n";
if (!file_exists($_GATE['settings']['file_name']))
fclose(fopen($_GATE['settings']['file_name'], "wt"));
if (($_GATE['settings']['mode'] == "file" || $_GATE['settings']['mode'] == "mixed") && strlen($_GATE['settings']['file_name']) > 0 && file_exists($_GATE['settings']['file_name']) && !is_writeable($_GATE['settings']['file_name']))
$_GATE['script']['errors'] .= "
<li>Указанный в параметре \$_GATE['settings']['file_name'] файл \"".$_GATE['settings']['file_name']."\" не доступен для записи;<br />\n";
if (($_GATE['settings']['mode'] == "file" || $_GATE['settings']['mode'] == "mixed") && !preg_match("/^(DESC|ASC)$/", $_GATE['settings']['file_order']))
$_GATE['script']['errors'] .= "
<li>Неверно задан параметр \$_GATE['settings']['file_order'];<br />\n";
clearstatcache();
// выводим сообщение об ошибках, если $_GATE['settings']['show_error_info'] == 1
if (strlen($_GATE['script']['errors']) > 0) {
if ($_GATE['settings']['show_error_info']) {
echo "<html>\n<body>\nОшибки:
<ul>\n".$_GATE['script']['errors']."</ul>
\n</body>\n</html>\n";
}
exit();
}
// показываем статистику
if (isset($_GET[$_GATE['settings']['admin_prms']])) {
$_GATE['script']['authorized'] = false;
if (isset($_SERVER['PHP_AUTH_USER']) && isset($_SERVER['PHP_AUTH_PW'])) {
if ($_SERVER['PHP_AUTH_USER'] == $_GATE['settings']['auth_login'] and $_SERVER['PHP_AUTH_PW'] == $_GATE['settings']['auth_password']) $_GATE['script']['authorized'] = true;
}
if (!$_GATE['script']['authorized']) {
header("WWW-Authenticate: Basic realm=\"".$_GATE['settings']['auth_string']."\"");
header("HTTP/1.1 401 Unauthorized");
if ($_GATE['settings']['show_error_info']) {
echo "<html>\n<body>\nВ доступе отказано.\n</body>\n</html>\n";
}
exit();
} else {
echo "<html>\n<head>\n\n</head>\n<body>\n";
echo "
<h2>".$_GATE['settings']['auth_string']."</h2>
\n";
echo "URL: <b>".$_GATE['script']['url']."?".$_GATE['settings']['variable']."=</b><i>данные</i>
\n";
echo "Режим работы гейта: <b>".$_GATE['settings']['mode']."</b> <i>(".(($_GATE['settings']['mode'] == "file") ? "запись логов в файл" : (($_GATE['settings']['mode'] == "mail") ? "отправка логов на email" : "запись логов в файл и отправка на email")).")</i><br />\n";
echo "Имя переменной для входных данных: <b>".$_GATE['settings']['variable']."</b><br />\n";
echo "Показ сообщений об ошибках: <b><font color=\"".($_GATE['settings']['show_error_info'] ? "red\">включён" : "green\">выключен")."</font></b><br />\n";
if ($_GATE['settings']['mode'] == "file" || $_GATE['settings']['mode'] == "mixed") {
$_GATE['settings']['file_size'] = filesize($_GATE['settings']['file_name']);
if ($_GATE['settings']['file_size'] >= 1024*1024) $_GATE['settings']['file_sizetext'] = ($_GATE['settings']['file_size'] / 1024*1024)." Мбайт";
else if ($_GATE['settings']['file_size'] >= 1024) $_GATE['settings']['file_sizetext'] = ($_GATE['settings']['file_size'] / 1024)." Кбайт";
else $_GATE['settings']['file_sizetext'] = ($_GATE['settings']['file_size'])." байт";
echo "Размер файла <b>".$_GATE['settings']['file_name']."</b>: <b>".$_GATE['settings']['file_sizetext']."</b><br />\n";
}
if ($_GATE['settings']['mode'] == "mail" || $_GATE['settings']['mode'] == "mixed") {
echo "E-mail для отправки логов: <b>".$_GATE['settings']['mail_name']."</b><br />\n";
}
echo "
<hr size=\"1\" width=\"40%\" align=\"left\">\n";
$data = file($_GATE['settings']['file_name']);
foreach ($data as $str)
echo $str."<br />\n";
echo "
<hr size=\"1\" width=\"40%\" align=\"left\">\n";
echo "© <a href=\"http://blogfigaroo.ru/\" target=\"_blank\">Figaroo</a>, ".(date("Y") == "2007" ? date("Y")." г." : "2007-".date("Y")." гг.")."</body>\n</html>\n";
}
clearstatcache();
exit();
}
// получаем входные данные
$VALUE = substr(secru((isset($_GET[$_GATE['settings']['variable']]) ? $_GET[$_GATE['settings']['variable']] : (isset($_POST[$_GATE['settings']['variable']]) ? $_POST[$_GATE['settings']['variable']] : ""))), 0, $_GATE['settings']['input_size']);
if (strlen($VALUE) == 0) exit();
// функция для преобразования
function handler ($text) {
global $VALUE, $_GATE;
$text = str_replace("[IP]", $_GATE['script']['remote_addr'], $text);
$text = str_replace("[DD]", date("d"), $text);
$text = str_replace("[MM]", date("m"), $text);
$text = str_replace("[YYYY]", date("Y"), $text);
$text = str_replace("[YY]", date("y"), $text);
$text = str_replace("[HH]", date("H"), $text);
$text = str_replace("[II]", date("i"), $text);
$text = str_replace("[SS]", date("s"), $text);
$text = str_replace("[INFO]", $VALUE, $text);
return $text;
}
// формируем выходные данные
$_GATE['script']['text'] = $_GATE['settings']['format'];
$_GATE['script']['text'] = handler($_GATE['script']['text']);
// работаем в режимах "file" и "mixed"
if ($_GATE['settings']['mode'] == "file" || $_GATE['settings']['mode'] == "mixed") {
if ($_GATE['settings']['file_order'] == "ASC") {
@$fp = fopen($_GATE['settings']['file_name'], "a+t") or die("");
@flock($fp, LOCK_EX);
@fputs($fp, $_GATE['script']['text']);
@fclose($fp);
unset($fp);
} else {
@$text = join('', file($_GATE['settings']['file_name']));
@$fp = fopen($_GATE['settings']['file_name'], "wt") or die("");
@flock($fp, LOCK_EX);
@fputs($fp, $_GATE['script']['text'].$text);
unset($text);
@fclose($fp);
unset($fp);
}
clearstatcache();
}
// работаем в режимах "mail" и "mixed"
if ($_GATE['settings']['mode'] == "mail" || $_GATE['settings']['mode'] == "mixed") {
@mail($_GATE['settings']['mail_name'], handler($_GATE['settings']['mail_title']), $_GATE['script']['text'], "From: ".$_GATE['settings']['mail_from']."\nContent-type: text/plain; charset=\"windows-1251\"\nContent-Transfer-Encoding: 8bit");
}
?>
Примечание:
Получение данных (по умолчанию): gate.php?input=данные
Просмотр лога (по умолчанию): gate.php?admin=1
Скачать архив с исходником figaroo-web-gate.rar.