Я тут шлифанул свой код немного. Все же безопасность превыше всего, ибо в нашем деле лучше перебздеть, чем не добздеть..
Короче, изобрел в очередной раз колесо..
Доп инфа в коментах<?php
session_start();
session_register("authoriz");
$authoriz=$_SESSION['authoriz'];
?>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=koi8-r"/>
<title>Редактирование правил фаервола IPFW</title>
<style type="text/css">
body {font-family: Arial, Verdana;}
select {font: Verdana, Arial; background: GreenYellow;}
.d {font: Verdana, Arial; background: DeepPink;}
input {font: Verdana, Arial;}
input.login-pass {width: 150px}
textarea {font: "Lucida Console"; background: Seashell;}
</style>
</head>
<body>
<script language="javascript">
function del(theform){
var c=theform.filecur;
if (confirm("Are you sure?")) {
alert("DELETED");
return true;
}
else {
alert("OTMEHEHO");
c.focus();
return false;
}
}
</script>
<?
if(isset($_POST['logout'])) logout();
// ЛОГИН И ПАРОЛЬ
$login="admin";
// ЭТО ЛИШЬ ПРИМЕР ЗАШИФРОВАННОГО ПАРОЛЯ (passwd) АЛГОРИТМОМ MD5
// САМЫМ НАСТОЯТЕЛЬНЫМ ОБРАЗОМ КРАЙНЕ РЕКОМЕНДУЕТСЯ УКАЗАТЬ СВОЙ ПАРОЛЬ
// ВО ИЗБЕЖАНИИ, ТАК СКАЗАТЬ, САМЫХ НЕГАТИВНЫХ ПОСЛЕДСТВИЙ :))
$password="76a2173be6393254e72ffa4d6df1030a";
if($authoriz!=1) step($login,$password);
else protection();
function step($login,$password) {
print "<b>Authorization</b>
<form method=\"post\">
<table cellspacing=\"5\" cellpadding=\"3\" border=\"0\">
<tr>
<td align=\"right\">login</td>
<td><input class=\"login-pass\" type=\"text\" name=\"name\" value=\"\"></td>
</tr>
<tr>
<td align=\"right\">password</td>
<td><input class=\"login-pass\" type=\"password\" name=\"pass\" value=\"\"></td>
</tr>
<input type=\"hidden\" name=\"auth\" value=\"auth\">
<tr>
<td></td>
<td><input type=\"submit\" value=\"OK\"></td>
</tr>
</table></form>";
// ЕСЛИ ПРИШЕЛ ОТВЕТ ОТ ФОРМЫ АВТОРИЗАЦИИ
if(isset($_POST['auth'])) {
$name=$_POST['name'];
$pass=$_POST['pass'];
if(empty($name)) {echo "<font color=red>Enter LOGIN!</font>"; exit;}
if(empty($pass)) {echo "<font color=red>Enter PASSWORD</font>"; exit;}
$pass=md5($pass);
if($name!==$login) {echo "<font color=red>Invalid LOGIN!</font>"; exit;}
if($pass!==$password) {echo "<font color=red>Invalid PASSWORD</font>"; exit;}
if($name==$login and $pass==$password and $name!='' and $pass!='') {
$_SESSION['authoriz']=1;
protection(); // ВЫЗЫВАЕМ ФУНКЦИЮ protection()
header("Location: $_SERVER[PHP_SELF]"); // СВАЛИВАЕМ ОТСЮДА НАФИГ :)
}
}
}
// start protection()
function protection() {
// ОСНОВНАЯ ДИРЕКТОРИЯ
$dirmain="/etc";
// ДИРЕКТОРИЯ ДЛЯ БЭКАПА КОНФИГА IPFW
$dirbak="$dirmain/fwrulesbak";
// ОСНОВНОЙ КОНФИГУРАЦИОННЫЙ ФАЙЛ
$fileconf="rc.firewall";
$filemain="$dirmain/$fileconf";
print "Loading for edit the main or backup configuration file IPFW firewall rules?
<table cellpadding=\"3\" cellspacing=\"2\" border=\"0\">
<tr>
<td>
<font color=\"blue\">Load MAIN</font>
</td>
<td>
<font color=\"green\">Load BACKUP</font>
</td>
<td>
<font color=\"red\">Delete BACKUP</font>
</td>
</tr>
<tr>
<td>
<form method=\"post\">
<input type=\"hidden\" name=\"dircur\" value=".$dirmain.">
<input type=\"hidden\" name=\"filecur\" value=".$fileconf.">
<input type=\"submit\" value=\"OK\" name=\"load\">
</form>
</td>
<td>
<form method=\"post\">
<select name=\"filecur\">";
// ДЕЛАЕМ ВЫБОРКУ КОНФИГУРАЦИОННЫХ ФАЙЛОВ ИЗ ДИРЕКТОРИИ БЭКАПА
// ДЛЯ ВЫБОРОЧНОЙ ЗАГРУЗКИ И ДАЛЬНЕЙШЕГО РЕДАКТИРОВАНИЯ
if ($handle=opendir($dirbak)) { // ЕСЛИ МОЖЕМ ОТКРЫТЬ ДИРЕКТОРИЮ ДЛЯ БЭКАПА
while (false!==($file=readdir($handle))) { // ЧИТАЕМ В ЦИКЛЕ ДИРЕКТОРИЮ ПОКА НЕ КОНЧИТСЯ
if (!is_dir("$dirbak/$file") && $file!='.' && $file!='..') { // ПРОВЕРЯЕМ: ЕСЛИ ТО ЧТО ПРОЧИТАЛИ ДИРЕКТОРИЯ ИЛИ
print "<option value='$file'>".$file."</option>"; // ФАЙЛЫ . И .. ТО, ИГНОРИРУЕМ И ВЫВОДИМ ЧТО ОСТАЛОСЬ
}
}
closedir($handle);
}
print "</select>
<input type=\"hidden\" name=\"dircur\" value=".$dirbak.">
<input type=\"submit\" value=\"OK\" name=\"load\">
</form>
</td>
<td>
<form method=\"post\" onSubmit=\"return del(this)\">
<select name=\"filecur\" class=\"d\">";
// ДЕЛАЕМ ВЫБОРКУ КОНФИГУРАЦИОННЫХ ФАЙЛОВ ИЗ ДИРЕКТОРИИ БЭКАПА ДЛЯ УДАЛЕНИЯ НУЖНОГО ФАЙЛА
if ($handle=opendir($dirbak)) {
while (false!==($file=readdir($handle))) {
if (!is_dir("$dirbak/$file") && $file!='.' && $file!='..') {
print "<option value='$file'>".$file."</option>";
}
}
closedir($handle);
}
print "</select>
<input type=\"submit\" value=\"OK\" name=\"delete\">
</form>
</td>
</tr>
</table>
<p><form method=\"post\"><input type=\"submit\" value=\"LOGOUT\" name=\"logout\"></form></p>
<p><input type=\"button\" value=\"BACK\" onClick=\"javascript:history.go(-1)\"></p>";
// ЕСЛИ ПРИШЕЛ ОТВЕТ, ЧТО РЕДАКТИРОВАТЬ НЕ БУДЕМ - ВЫВАЛИВАЕМСЯ В НАЧАЛО
if (isset($_POST['nowriterules'])) $nowriterules=$_POST['nowriterules'];
// ЕСЛИ ПРИШЕЛ ОТВЕТ, ЧТО ЗАГРУЖАЕМ ДЛЯ РЕДАКТИРОВАНИЯ ФАЙЛ
// ИЛИ ОСНОВНОЙ ИЛИ ИЗ БЭКАПА
if (isset($_POST['load']) and isset($_POST['filecur'])) {
$filecur=$_POST['filecur'];
$dircur=$_POST['dircur'];
$filelist="$dircur/$filecur"; // ОПРЕДЕЛЯЕМСЯ КАКОЙ ФАЙЛ БУДЕМ ПРОСМАТРИВАТЬ
$fp=fopen("$filelist","r") or die("<font color=red>Couldn't open <b>$filelist</b>! No file or no rights?"); // ОТКРЫВАЕМ
$fwcon=file_get_contents(trim($filelist)); // ПОТРОШИМ ФАЙЛ И ПОЛУЧАЕМ СОДЕРЖИМОЕ (ЗАОДНО ЧИСТИМ, А МОЖЕТ И НЕ НАДО?)
fclose($fp); // ЗАКРЫВАЕМ
// ВЫВОДИМ НА ПЕЧАТЬ ФОРМУ
print "<form method=\"post\">
<textarea name=\"fwconf\" rows=\"20\" cols=\"100\">";
echo $fwcon; // НАПРАВЛЯЕМ ВНУТРЕННОСТИ ФАЙЛА ПОСЛЕ ПОТРОШЕНИЯ И ПРЕПАРАЦИИ В TEXTAREA
print "</textarea>
<br/>Write new rules?
<input type=\"hidden\" value=\"$filecur\" name=\"filecur\">
<input type=\"hidden\" value=\"$dircur\" name=\"dircur\">
<input type=\"submit\" value=\"OK\" name=\"writerules\">
<input type=\"submit\" value=\"NO\" name=\"nowriterules\">
</form>";
}elseif(isset($_POST['load']) and empty($filecur)) {echo "<font color=red>You are idiot? You can't get and load of anything!</font>";}
// ЕСЛИ ПРИШЛО ПОДТВЕРЖДЕНИЕ, ЧТО ЗАПИСЫВАТЬ ОТРЕДАКТИРОВАННЫЙ ФАЙЛ БУДЕМ
if(isset($_POST['writerules']) and isset($_POST['fwconf'])) {
$fwconf=$_POST['fwconf'];
$filecur=$_POST['filecur'];
$dircur=$_POST['dircur'];
if(empty($fwconf)) {echo "<font color=red><b>PANIC! YOU ARE IDIOT? EMPTY RULES NOT WRITING!</b></font>"; exit;}
createbackup($dirbak,$filemain,$dircur,$filecur,$fileconf); // ВЫЗЫВАЕМ ФУНКЦИЮ ДЛЯ СОЗДАНИЯ БЭКАПА ФАЙЛА И ДИРЕКТОРИИ ДЛЯ БЭКАПА
filewrite($fwconf,$filemain); // ВЫЗЫВАЕМ ФУНКЦИЮ ДЛЯ ЗАПИСИ ОТРЕДАКТИРОВАННОГО ФАЙЛА
}
// ЕСЛИ ПРИШЕЛ ОТВЕТ, ЧТО УДАЛЯЕМ ВЫБРАННЫЙ ФАЙЛ ИЗ БЭКАПА
if(isset($_POST['delete']) and isset($_POST['filecur'])) {
$file=$_POST['filecur'];
deletefile($dirbak,$file); // ВЫЗЫВАЕМ ФУНКЦИЮ ДЛЯ УДАЛЕНИЯ ФАЙЛА
}
} // end function protection()
// ФУНКЦИЯ СОЗДАНИЯ БЭКАПОВ
function createbackup($dirbak,$filemain,$dircur,$filecur,$fileconf) {
if(!$dh=opendir($dirbak)) { // ЕСЛИ НЕ МОЖЕМ ОТКРЫТЬ ДИРЕКТОРИЮ БЭКАПА ИЛИ НЕ СУЩЕСТВУЕТ
$cmdmd=escapeshellcmd($cmdmd);
$cmdmd="/usr/local/bin/sudo /bin/mkdir $dirbak"; // КОМАНДА СОЗДАНИЯ ДИРЕКТОРИИ ДЛЯ БЭКАПА
exec($cmdmd,$ouput,$return); // ВЫЗОВ КОМАНДЫ
if($return==1) print "<font color=red>Can't create directory <b>$dirbak</b> for the backup!<br/>
In files sudoers next line <u>www ALL=NOPASSWD: /bin/mkdir</u> is not added?</font><br/>";
elseif($return==0) echo "<font color=green>Created directory <b>$dirbak</b> for the backup sucessfully!</font>";
}
$cmdcp=escapeshellcmd($cmdcp);
$cmdcp="/usr/local/bin/sudo /bin/cp $dircur/$filecur /tmp/$fileconf && /usr/local/bin/sudo /bin/mv /tmp/$fileconf $dirbak/$fileconf".".".date("Y-m-d_H:i:s");
exec($cmdcp,$ouput,$return); // КОМАНДА ДЛЯ СОЗДАНИЯ БЭКАПА - СНАЧАЛА КОПИРУЕМ В /tmp ДИРЕКТОРИЮ,
// ПОТОМ ПЕРЕМЕЩАЕМ В ДИРЕКТОРИЮ БЭКАПА С ДРУГИМ НАЗВАНИЕМ
// ИМЯ ФАЙЛА ВЫБИРАЕТСЯ КАК СТАРОЕ НАЗВАНИЕ И В КОНЦЕ ДОБАВЛЯЕТСЯ ТЕКУЩЕЕ ВРЕМЯ
// ТАКОЙ ФИНТ УШАМИ ПОТОМУ, ЧТО МОЖЕТ БЫТЬ ВЫЗВАН ФАЙЛ КАК ОСНОВНОЙ ТАК И ИЗ БЭКАПА
// А ИЗ БЭКАПА УЖЕ ИМЕЕТ НАЗВАНИЕ СО ВРЕМЕНЕМ ВКОНЦЕ, КОРОЧЕ, ЧТОБЫ ВРЕМЯ НЕ НАКЛАДЫВАЛОСЬ ДВА, ТРИ И БОЛЕЕ РАЗ
if($return==1) print "<font color=red>Can't copy file <b>$filecur</b> in the backup directory <b>$dirbak</b>!<br/>
In files sudoers next line <u>www ALL=NOPASSWD: /bin/cp</u> is not added?</font><br/>
Or in files sudoers next line <u>www ALL=NOPASSWD: /bin/mv</u> is not added?</font><br/>";
elseif($return==0) {
echo "<font color=green>Copy file <b>$filecur</b> in the backup directory <b>$dirbak</b> sucessfully!<br/></font>";
}
}
// ФУНКЦИЯ ЗАПИСИ ОТРЕДАКТИРОВАННОГО КОНФИГА В ФАЙЛ
function filewrite($fwconf,$filemain) {
$cmdto=escapeshellcmd($cmdto);
$cmdto="/usr/local/bin/sudo /usr/sbin/chown www $filemain";
exec($cmdto,$ouput,$return);
if($return==1) echo "<font color=red>Can't change the file <b>$filemain</b> owner on <b>www</b>!</font><br/>
In files sudoers next line <u>www ALL=NOPASSWD: /usr/sbin/chown</u> is not added?</font><br/>";
elseif($return==0) echo "<font color=green>Changed the file <b>$filemain</b> owner on <b>www</b> for writing sucessfully!<br/></font>";
$fp=fopen($filemain,"w+") or die("<font color=red>Couldn't open <b>$filemain</b>! No file or no rights?</font>"); // МАТЕРИМСЯ, ЕСЛИ НЕ МОЖЕМ ОТКРЫТЬ
flock($fp,LOCK_EX); // БЛОКИРУЕМ ФАЙЛ (ВНИМАНИЕ! БЛОКИРОВКА НЕ ПОЛНАЯ! ТОЛЬКО СРЕДСТВАМИ PHP, ОТ UNIX НЕ СПАСЕТ!)
$fwconf=str_replace("\r\n","\n",$fwconf); // ЗАМЕНА ПЕРЕХОДА СТРОКИ И ВОЗВРАТА КАРЕТКИ ИЗ WINDOWS НА UNIX
$fwconf=trim($fwconf); // ЧИСТИМ ФАЙЛ, УДАЛЯЕМ ПРОБЕЛЫ И ТАБЫ, НА ВСЯКИЙ СЛУЧАЙ
fwrite($fp,$fwconf); // ПИШЕМ В ФАЙЛ
flock($fp,LOCK_UN); // СНИМАЕМ БЛОКИРОВКУ С ФАЙЛА
fclose($fp); // ЗАКРЫВАЕМ
$cmdbak="/usr/local/bin/sudo /usr/sbin/chown root $filemain";
exec($cmdbak,$ouput,$return);
if($return==1) echo "<font color=red>Can't change the file <b>$filemain</b> owner back on <b>root</b>!</font><br/>
<b>PANIC! UNKNOWN ERROR!</b>";
elseif($return==0) {
echo "<font color=green>Changed the file <b>$filemain</b> owner back on <b>root</b> for security sucessfully!<br/></font>";
echo "<font color=green>Write new rules successfully! Congratulation! <b>YES!</b></font>";
echo "<meta http-equiv=\"content-type\" content=\"text/html; charset=koi8-r\">
<script language=\"javascript\">
alert(\"Yes! All right!\");
</script>";
// АВТОПЕРЕХОД ДЛЯ ОБНОВЛЕНИЯ ВЫПОДАЮЩЕГО СПИСКА СЕЛЕКТ
echo "<meta http-equiv=\"refresh\" content=\"0; url=./conf3.php\">"; // ВМЕСТО conf3.php ВСТАВИТЬ СВОЮ СТРАНИЦУ
}
}
// ФУНКЦИЯ УДАЛЕНИЯ ФАЙЛА ИЗ ДИРЕКТОРИИ БЭКАПА
// СДЕЛАНА С ИСПОЛЬЗОВАНИЕМ РОДНОГО UNIX ШЕЛА, ИБО И ТАК ГЕМОРНО, А ИНАЧЕ ЕЩЕ И ПРАВА НА ДИРЕКТОРИЮ БЭКАПА И ФАЙЛЫ УСТАНАВЛИВАТЬ
function deletefile($dirbak,$file) {
$cmddel=escapeshellcmd($cmddel);
$cmddel="/usr/local/bin/sudo /bin/rm -f $dirbak/$file"; // САМА КОМАНДА НА УДАЛЕНИЕ ФАЙЛА
exec($cmddel,$ouput,$return); // УДАЛЯЕМ ФАЙЛ
if($return==1) echo "<font color=red>Can't delete file <b>$file</b> from directory <b>$dirbak</b>!<br/>
In files sudoers next line <u>www ALL=NOPASSWD: /bin/rm</u> is not added?</font><br/>";
elseif($return==0) {
print "<font color=green>Deleted files <b>$file</b> from directory <b>$dirbak</b> sucessfully!<br/></font>";
echo "<meta http-equiv=\"content-type\" content=\"text/html; charset=koi8-r\">
<script language=\"javascript\">
alert(\"Deleted files $file from directory $dirbak sucessfully!\");
</script>";
// АВТОПЕРЕХОД ДЛЯ ОБНОВЛЕНИЯ ВЫПАДАЮЩЕГО СПИСКА СЕЛЕКТ
// ЕСЛИ ИСПОЛЬЗОВАТЬ header("Location: url") ТО НЕ УВИДИМ ОТЛАДОЧНЫХ СООБЩЕНИЙ :)
echo "<meta http-equiv=\"refresh\" content=\"0; url=./conf3.php\">"; // ВМЕСТО conf3.php ВСТАВИТЬ СВОЮ СТРАНИЦУ
// header("Location: $_SERVER[PHP_SELF]");
}
}
// ФУНКЦИЯ ВЫХОДА
// РАЗРЕГИСТРИРУЕМ ПЕРЕМЕНЫЕ И УНИЧТОЖАЕМ ИХ
// РАЗРУШАЕМ СЕССИЮ
function logout() {
session_unset();
session_destroy();
header("Location: $_SERVER[PHP_SELF]");
}
/*
ЛИРИЧЕСКИЙ ПОСТСКРИПТУМ :)
НАПИСАНО ЧИСТО РАДИ ЛЮБВИ К ИСКУССТВУ, СПОРТИВНОГО И АКАДЕМИЧЕСКОГО ИНТЕРЕСА.
НЕ УПОТРЕБЛЯТЬ!
ОБЯЗАТЕЛЬЕО ДОБАВИТЬ В КОНФИГУРАЦИОННЫЙ ФАЙЛ SUDO /ur/local/etc/sudoers СЛЕДУЮЩИЕ СТРОКИ:
www ALL=NOPASSWD: /bin/rm
www ALL=NOPASSWD: /bin/cp
www ALL=NOPASSWD: /bin/mkdir
www ALL=NOPASSWD: /bin/mv
www ALL=NOPASSWD: /usr/sbin/chown
ЗАШИФРОВАТЬ ПАРОЛЬ ДЛЯ ВХОДА АЛГОРИТМОМ MD5
С ПОМОЩЬЮ PHP ИЛИ ЧЕРЕЗ КОНСОЛЬ
В PHP ПРОЧЕСТЬ ВЫВОД СТРОКИ echo md5('passwd');
В КОНСОЛИ UNIX ВЫПОЛНИТЬ md5 -s passwd
ЛИБО В КОНСОЛИ UNIX php -r "print md5('passwd');"
ГДЕ ВМЕСТО passwd ПОДСТАВИТЬ СВОЮ ХРЕНЬ
НУ И ВЫВОД ВСЕГО ЭТОГО МРАКОБЕСИЯ, СООТВЕТСТВЕННО, ВСТАВИТЬ В ОДНО МЕСТО (ПО УСМОТРЕНИЮ - КОМУ И КУДА, УЖ САМИ РАЗБЕРЕТЕСЬ)
КРАЙНЕ ВАЖНО!
ЧТОБЫ СЕССИЮ НЕ ПЕРЕХВАТИЛИ И НЕ УГНАЛИ, В КОНЦЕ ОБЯЗАТЕЛЬНО ДЕЛАЙТЕ LOGOUT !!
ИНАЧЕ, ПОСЛЕ ПЕРВОНАЧАЛЬНОЙ АВТОРИЗАЦИИ, ВХОД БУДЕТ ВЫПОЛНЕН И ДОСТУПЕН И ПОСЛЕ ОБЫЧНОГО ЗАКРЫТИЯ СТРАНИЦЫ БРАУЗЕРА!
СЕССИЯ НЕ БУДЕТ РАЗРУШЕНА И, СООТВЕТСТВЕННО, ВЫ ИМЕЕТЕ ДЫРУ В ЗАЩИТЕ И ГЕМОР НА ОДНО МЕСТО :))
*/
?>
</body>
</html>
Вот такие дела..