«Знание — могущество».

22 марта 2009

Figaroo Webgate

написал Figaroo в рубрике Web-разработка @ 19:35

Представляю вашему вниманию 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 "Режим работы гейта:&nbsp;&nbsp;&nbsp;&nbsp; <b>".$_GATE['settings']['mode']."</b> <i>(".(($_GATE['settings']['mode'] == "file") ? "запись логов в файл" : (($_GATE['settings']['mode'] == "mail") ? "отправка логов на email" : "запись логов в файл и отправка на email")).")</i><br />\n";
		echo "Имя переменной для входных данных:&nbsp;&nbsp;&nbsp;&nbsp; <b>".$_GATE['settings']['variable']."</b><br />\n";
		echo "Показ сообщений об ошибках:&nbsp;&nbsp;&nbsp;&nbsp; <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>:&nbsp;&nbsp;&nbsp;&nbsp; <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 "&copy; <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.

Нет комментариев »

Комментариев нет.

RSS-лента комментариев к этой записи

Оставить комментарий

Пожалуйста, заполните все поля.

© Валерий 'Figaroo' Киркиж, 2008-2012 гг.