Разработка программы для фиксации попыток атаки на защищаемый объект
Программа, которая будет выполнять записи в log-файл действий, идентифицированных как попытки атаки на защищаемый объект. Язык программирования PHP. Описание таблиц СУБД MySQL. Алгоритм работы программы. Вывод результата запроса через вложенный цикл.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 26.07.2015 |
Размер файла | 2,0 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
КОСТАНАЙСКИЙ СОЦИАЛЬНО-ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
ИМЕНИ АКАДЕМИКА З.АЛДАМЖАР
ТЕХНИЧЕСКИЙ ФАКУЛЬТЕТ
КАФЕДРА
ФИЗИКИ И ИНФОРМАЦИОННЫХ ТЕХНОЛОГИЙ
КУРСОВАЯ РАБОТА ПО ДИСЦИПЛИНЕ основы информационной безопасности
ТЕМА: разработка программы для фиксации попыток атаки на защищаемый объект
Выполнил: Комаров
Сергей Борисович
3 курса специальности
ВТ и ПО
Научный руководитель
Рак О.В.
Костанай
2011
СОДЕРЖАНИЕ
Введение
1. Разработка программы
1.1 Задание на курсовой проект
1.2 Выбор используемых инструментов
1.3 Описание структуры приложения
1.4 Описание таблиц СУБД MySQL
1.5 Описание алгоритма работы программы
Руководство пользователя
Заключение
Приложение А. Листинги файлов программы
Приложение В. Список использованной литературы
Приложение С. Блок-схема работы приложения
ВВЕДЕНИЕ
Информационная безопасность -- защита конфиденциальности, целостности и доступности информации. [1]
Конфиденциальность- свойство информационных ресурсов, связанное с тем, что они не станут доступными и не будут раскрыты для неуполномоченных лиц.[1]
Целостность-неизменность информации в процессе ее передачи или хранения.[1]
Доступность-свойство информационных ресурсов, определяющее возможность их получения и использования по требованию уполномоченных лиц.[1]
Обеспечение безопасности информационных систем (ИС) и собственно информации, как их части, является одним из самых важных мероприятий в организации работы любых компьютерных систем. В наше время риск потерять или предать огласке конфиденциальную или просто важную информацию очень велик, благодаря влиянию множества трудно учитываемых факторов. Среди этих причин и постоянная высокая активность вредоносных программ (троянских программ, сетевых червей и т. п.) и действия злоумышленников (т. н. хакеров). Вредоносные программы проникая в ИС могут «открывать дверки» для хакеров или передавать на удаленный компьютер злоумышленника конфиденциальные данные или же закачивать в ИС вирусы, которые в свою очередь могут повреждать как операционные системы, так и сами данные. Для некоторых категорий информационных ресурсов очень важно быть постоянно доступными, т. к. их актуальность может изменяться в кратчайшее время, т. е. здесь уже опасность представляет даже не утеря важной информации, а всего лишь временная недоступность. На такие ресурсы для нападения используются атаки на отказ или временную недоступность (т. н. DOS/DDOS-атаки).И таких аспектов можно обнаружить огромное количество и все они будут требовать к себе отдельного внимания для обеспечения информационной безопасности. А это означает, что обеспечение безопасности ИС вопрос комплексный, включающий в себя организационные и технические мероприятия, которые в свою очередь будут разделяться еще на несколько подкатегорий. Так технические мероприятия можно разделить на применение в работе аппаратного обеспечения, способного обеспечить повышенный уровень защищенности ИС, применение грамотно настроенных программных средств обеспечения безопасности и грамотно продуманная схема организации защищаемого объекта (например создание демилитаризованных зон -- DMZ, в случае защиты корпоративной сети и публичных серверов и т. п.). Организационные мероприятия можно разделить на создание режима ограниченного доступа к оборудованию содержащему или оберегающему важные данные и на работу с пользователями ИС, которых нужно научить работать с ИС так, чтобы своими действиями не нарушить безопасность системы (при «помощи» слабых паролей и т.п.) и непременно контролировать их «сознательность» в данном вопросе, т. к. человеческий фактор- одна из самых слабых частей безопасности ИС.[2]
Как видно из вышеперечисленного, чтобы обеспечить безопасность ИС нужно тщательно прорабатывать все нюансы. Работа в данной области не прекращается ни на минуту. Программное обеспечение обеспечивающее безопасность ИС становится все более совершенным и включают в себя любую функциональность, которая является необходимой в соответствии с веяниями времени. Развиваются ресурсы помогающие специалистам решать проблемы безопасности -- например базы данных по вирусам, содержащие ссылки на средства борьбы с ними. Это означает, что актуальность любых разработок связанных с информационной безопасностью весьма высока.
1. РАЗРАБОТКА ПРОГРАММЫ
1.1 Задание на курсовой проект
Тема: Разработка программы для фиксации попыток атаки на защищаемый объект.
Необходимо разработать программу, которая будет выполнять записи в log-файл действий идентифицированных как попытки атаки на защищаемый объект.
Итак, необходимо определиться с защищаемым объектом. Так как одним из популярных методов атаки на ИС является атака «грубой силой» или атака перебором паролей по словарным базам, я решил выбрать в качестве защищаемого объекта страницу авторизации пользователей условного ресурса. Разрабатываемое приложение будет заносить в базу данных необходимые сведения о каждом подключающемся пользователе. В случае успешной авторизации, пользователь будет попадать на свою приватную страницу, а данные об этом соединении будут удалены из БД, т. к. авторизация, успешная с первой попытки почти наверняка будет легитимна, в случае неудачи -- возврат на страницу входа с выводом сообщения о неверном логине или пароле. Вторая попытка авторизации, так же будет фиксироваться в БД, в случае успеха авторизации -- переадресация пользователя в приватную зону, в случае неудачи -- возврат на страницу входа с уведомлением. И лишь в случае неуспешной авторизации в третий раз, выполняется запись в базу т. н. «опасных соединений», которая содержит дату, время попытки подключения и ip-адрес хоста с которого пытались подключиться. Для администратора ресурсов на его странице будет предусмотрена кнопка для просмотра БД опасных коннектов.
1.2 Выбор используемых инструментов
Реализация приложения будет выполняться на языке программирования PHP. Выбор этого языка программирования не случаен -- он является практически стандартным выбором в случае программирования для Веб и имеет развитую систему библиотек кода, позволяющую подключаться к любым СУБД. На этом языке удобно писать любые приложения для Веб, благодаря огромному количеству обучающей литературы на любом языке. Кроме того С-подобный синтаксис языка делает его удобным и даже привычным в применении. Ему легко обучиться и на нем легко создавать программное обеспечение. В качестве среды разработки будет использована IDE NetBeans 6.9, имеющая систему подсказок по функциям языка PHP и подсветку синтаксиса, что делает написание программ более комфортным. Кроме этих программ, нужен веб-сервер, на котором будет проходить тестирование проект. Можно для этих целей использовать эмуляторы типа «Денвера» или бесплатный хостинг, но гораздо проще и удобней на мой взгляд использовать связку именуемую LAMP, что означает Linux + Apache + MySQL + PHP. Эта связка используется практически на любом хостинге, установка и настройка ее под Linux не составляет особых трудностей -- системы управления пакетами ПО помогут установить все приложения, а изменение пары строк в конфигурационных файлах -- дело пяти минут. Версия веб-сервера Apache - 2, т. к. она стабильна и имеет преимущества по сравнению с популярной ранее версией 1.3 в безопасности. Исходя из выбранного набора инструментов будет использоваться СУБД MySQL 5.1. Эта СУБД разработана в Sun Microsystem поглощенной в 2010 году корпорацией Oracle. Для этой СУБД в языке PHP существуют удобные в применении библиотеки функций имитирующие «живое» общение с СУБД на языке SQL, и в тоже время скрывающие от программиста особенности реализации SQL, что делает программирование намного более удобным. На мой взгляд также важно, что все используемое программное обеспечение является бесплатным для персонального (а некоторое и для коммерческого) использования.
1.3 Описание структуры приложения
Программа из пяти файлов имеющих расширение .php:
index.php являющийся страницей авторизации, содержащей минимальный объем php-кода и в основном реализованной на языке разметки HTML, в соответствии с Рисунком 1.
logger.php файл выполняющий основную работу по вычислению потенциально-опасных соединений и ведении записей о них.
config.php маленький конфигурационный файл содержащий информацию необходимую для подключения к СУБД MySQL и используемый другими файлами сценариев.
admin.php имитация страницы администратора ресурса, имеющая в своем наборе кнопку для просмотра записей об опасных соединениях. Сама страничка имитирует личную страницу в какой-либо социальной сети, со стандартными (в данном случае - бездействующими) ссылками и аватаром пользователя. Кроме того она имеет особую по сравнению со страницами обычных пользователей функциональность - возможность просмотра из БД записей о потенциально опасных соединениях. Эта функциональность реализована в виде кнопки “See” по нажатию на которую срабатывает php-скрипт вложенный в тело данной страницы и выводящий в середине страницы список зафиксированных ip-адресов, в соответствии с Рисунком 2.
Рисунок 1. Внешний вид страницы авторизации index.php.
Рисунок 2. Внешний вид страницы администратора admin.php.
authorized.php это имитация страницы пользователя информационного ресурса, из элементов управления представлены только типичные для личных страниц пользователей ссылки. Более подробно создавать страницу пользователя не имеет особого смысла в разрезе целей данного проекта, согласно Рисунка 3.
Рисунок 3. Внешний вид страницы пользователя authorized.php.
1.4 Описание таблиц СУБД MySQL
В СУБД MySQL будет создана база данных с тремя таблицами, каждая из которых будет нести индивидуальное предназначение. Имена таблиц БД:
«users» - как следует из названия, она содержит регистрационные данные пользователей ресурса.
«log_control» - таблица содержащая временные записи о неудачных попытках авторизоваться и счетчик попыток.
«danger_connect» - таблица в которую помещаются записи о потенциально-опасных соединениях, они не удаляются и в любой момент могут быть проверены администратором ресурса.
Команды для создания таблиц в БД выполнялись в консоли клиента mysql-client в виде стандартных SQL-запросов к базе данных в соответствии с Рисунком 4.
Рисунок 4. SQL-запросы на создание таблиц в БД.
Каждая из таблиц содержит несколько полей (столбцов), у каждого из которых индивидуальное предназначение.
Поля таблицы «users»:
«id» - поле содержащее уникальный идентификатор пользователя, тип поля целочисленный INT(4) (в скобках указано число байт выделенных для хранения значения), приращивается самой СУБД при добавлении нового пользователя, благодаря указанию спецификатора AUTO_INCREMENT при создании таблицы.
«user» - естественно содержит имя пользователя, имеет символьный тип CHAR(10).
«pass» - содержит как нетрудно догадаться пароль пользователя, также имеет символьный тип CHAR(15).
Поля таблицы «log_control»:
«time» - поле, хранящее запись о дате и времени попытки подключения, имеет специальный тип для хранения даты и времени DATETIME.
«ip» - поле, хранящее ip-адрес хоста пытавшегося подключиться к защищаемому ресурсу, тип поля символьный CHAR(15).
«num_logon» - поле, хранящее номер текущей попытки соединения для данного ip-адреса, имеет целочисленный тип INT(11).
Поля таблицы «danger_connect»:
«time» - содержит время попытки подключения, которая согласно логике программы является потенциально-опасной, имеет тип DATETIME.
«ip» - ip-адрес хоста совершившего данную попытку, имеет тип INT(15).
Просмотреть список полей таблиц можно SQL-запросами в соответствии с Рисунком 5.
Рисунок 5. SQL-запросы к БД, отображающие структуры полей таблиц.
Кроме вышеперечисленных операций с БД нужно произвести еще одну, без которой работать система не будет - ввести пользователей и пароли для возможности авторизации. Так как данная функциональность не имеет отношения к сущности реализуемого проекта я выбрал самый простой способ создания пользователей ресурса - из консоли управления СУБД посредством SQL-запросов. В соответствии с Рисунком 6 были выполнены запросы к базе данных на создание учетных записей администратора и пользователя информационного ресурса. Затем был выполнен SQL-запрос на выборку всех данных из таблицы “users”, с целью продемонстрировать созданные учетные записи. Имя пользователей и пароли для учетных записей были выбраны наугад, а идентификатор каждой учетной записи назначался автоматически.
Рисунок 6. SQL-запросы к БД для создания учетных записей.
1.5 Описание алгоритма работы программы
Рассмотрим алгоритм работы программы. Как было выше указано, программа состоит из 5 файлов. Первым вступает в работу файл index.php, который предлагает пользователю ввести логин и пароль. Далее введенные пользователем данные передаются файлу logger.php, который не имеет пользовательского интерфейса, зато выполняет основные функции программы -- сверяет логин и пароль с имеющимися в БД и в случае успеха переадресует пользователя или администратора на его страничку (для администратора это admin.php, а для пользователя autorized.php). Данные для соединения с БД эти файлы берут из конфигурационного файла config.php.
Теперь рассмотрим работу каждого файла. Начнем по порядку.
Файл index.php. Это обычный HTML-документ, со вставкой PHP-кода. Структуру HTML подробно рассматривать не будем, так как она вторична, кроме тега <form>, описывающего интерактивные элементы страницы. Сам тег использован в виде <form name="login" action="logger.php" method="POST">. Здесь имеются несколько параметров:
«name» - содержит имя формы, которое может быть использовано в обращениях к элементам формы через структуру иерархии HTML-документа.
«action» - содержит название php-скрипта, которому будет передано содержание формы для обработки.
«method» - важный параметр указывающий каким способом мы будем передавать данные php-скрипту, используется метод POST, который безопаснее метода GET, т. к. в этом случае, данные формы передаются в теле HTTP-запроса, а не в URL, который видим пользователю и соответственно его легко подделать.
Листинг 1.
if($_GET['fail'])
echo "<font color='red'>Ошибка авторизации!</font>";
else echo " ";
Приведенная в Листинге 1 вставка php-кода просто отлавливает переменную-флаг «fail» , присутствие которой в переменной-массиве $_GET говорит об ошибке предыдущей авторизации. Если этот флаг обнаружен в URL страницы, скрипт при выводе вставляет в страницу надпись «Ошибка авторизации!» в соответствии с Рисунком 7.
Рисунок 7. Страница авторизации с сообщением об ошибке.
Следующим рассмотрим маленький конфигурационный файл config.php.
В нем всего 4 строки содержащие параметры соединения с базой данных:
«$dbhost="localhost"» - строка содержит url хоста, на котором находится БД, в данном случае значение localhost означает, что БД на этом-же сервере.
«$dbadmin="root"» -- имя администратора СУБД.
«$dbpass="c2h5oh"» - пароль администратора СУБД.
«$dbname="attack_logger"» -- имя БД в которой хранятся таблицы имеющие отношения к нашему проекту.
Далее рассмотрим файл logger.php, который и выполняет всю основную работу. Начинается скрипт со строки «require_once './config.php'», которая подключает к данному скрипту конфигурационный файл config.php, в результате чего, переменные объявленные в нем становятся доступными для кода текущего скрипта.
В следующей строке проверяется установлена-ли в глобальном массиве $_POTS переменная-флаг «go», наличие которой означает, что скрипту передаются данные из формы для обработки. Вот эта строка:
Листинг 2.
if($_POST['go'])
Ее наличие необходимо, т.к если скрипт будет вызван не из index.php после заполнения формы, а каким -- то иным образом, то переменные необходимые для работы скрипта не будут установлены, что вызовет сбой и вывод ошибок в браузер, что в свою очередь может скомпрометировать ресурс, указав какие переменные не установлены, что поможет злоумышленнику лучше понять структуру скрипта работающего с авторизацией.
Далее следует блок объявления и инициализации переменных. Рассмотрим его построчно:
$i=0 -- переменная выполняющая роль счетчика попыток авторизации.
$rows=0 -- переменная нужная для работы с БД.
$flag=$_POST['go'] -- переменная хранящая значение флага «go» описанного выше.
$user=$_POST['user'] -- переменная получающая от формы имя пользователя, которое извлекается из глобального массива $_POST.
$pass=$_POST['passwd'] -- переменная получающая от формы пароль.
$timevisit=date('Y-m-d H-i-s') -- эта переменная хранит текущие время и дату получаемые вызовом функции «date», в формате совместимом с DATETIME, используемым в СУБД MySQL для хранения этого значения.
$ip=$_SERVER['REMOTE_ADDR'] -- в эту переменную записывается значение ip-адреса удаленного хоста, с которого выполняется попытка авторизации. Это значение извлекается из глобального массива $_SERVER. $server_ip=$_SERVER['SERVER_ADDR'] -- в эту переменную запишем значение ip-адреса нашего сервера, это необходимо для динамического создания ссылок при переадресации пользователя. На этом объявление переменных закончено. Рассмотрим скрипт дальше. В следующих 2-х строках мы выполняем обработку полученных от формы данных функцией htmlspecialchars для удаления HTML-тегов, для исключения написания и использования скриптов на JS или VB и функцией удаления слэшей stripslashes, для исключения написания и использования скриптов на Perl. Это необходимо, т. к. злоумышленник может ввести вместо имени или пароля текст скрипта на вышеперечисленных языках, который может открыть брешь в безопасности системы. Эти строки приведены в Листинге 3.[3]
Листинг 3.
$user=htmlspecialchars(stripslashes($user));
$pass=htmlspecialchars(stripslashes($pass));
В Листинге 4 выполняется подключение скрипта к СУБД и выбор БД для работы.
Листинг 4.
mysql_connect($dbhost, $dbadmin, $dbpass) or die("ERROR ".mysql_errno()." ".mysql_error());
mysql_select_db($dbname) or die("ERROR ".mysql_errno()." ".mysql_error()."\n");
В этой строке выполняется подключение к СУБД используя параметры из конфигурационного файла. Затем мы выбираем для работы свою БД, так же используя параметр $dbname из конфигурационного файла. Со следующей строки, согласно Листинга 5 начинает выполнение алгоритм проверки имени пользователя и пароля, а также количества неуспешных попыток авторизации с данного ip-адреса. Сначала создаем SQL-запрос, который проверит значение поля num_logon из таблицы log_control для даного ip-адреса, которое содержит номер предыдущей неуспешной попытки авторизации. Далее с помощью функции mysql_query мы выполняем этот запрос к БД и получаем в качестве ответа объект типа «ресурс».
Листинг 5.
$sql_exist_ctrl="select num_logon from log_control where ip='".$ip."'";
$res=mysql_query($sql_exist_ctrl) or die("ERROR ".mysql_errno()." ".mysql_error()."\n");
$rows=mysql_num_rows($res);
Затем в переменную $rows мы при помощи функции mysql_num_rows помещаем число строк в полученном от БД ответе, преследуя при этом следующую цель: если число строк возвращенных в ответ на запрос окажется равным нулю, это будет означать первую попытку авторизации. В Листинге 6 приведена сама проверка возвращенного результата:
Листинг 6.
if($rows==0)
{
$sql_begin_ctrl="insert into log_control set time='".$timevisit."', ip='".$ip."', num_logon=".$i;
mysql_query($sql_begin_ctrl) or die ("ERROR ".mysql_errno()." ".mysql_error()."\n");
}
Если запрос на авторизацию первый, создаем SQL-запрос к БД который выполнит вставку данных (ip-адрес и дата/время) о текущем подключении в таблицу log_control и присвоит полю num_logon номер попытки, равный нулю. Затем мы выполняем этот запрос при помощи функции mysql_query. Иначе, если этот ip-адрес уже есть в таблице log_control, что означает имеющиеся предыдущие ошибки авторизации, мы получаем в переменную $i количество неуспешных попыток для данного ip-адреса, как в Листинге 7.
Листинг 7.
else
{
$array=mysql_fetch_array($res);
$i=$array[0];
}
Теперь пришло время проверки правильности логина и пароля введенных пользователем. Для этого составляется SQL-запрос и выполняется посредством функции mysql_query с проверкой на успешное выполнение запроса. Затем проверяем возвращенный функцией результат. Сначала посчитаем число возвращенных строк. Эти действия приведены в Листинге 8.
Листинг 8.
$sql_autoriz="select id from users where user='".$user."' and pass='".$pass."'";
$res=mysql_query($sql_autoriz) or die("ERROR ".mysql_errno()." ".mysql_error()."\n");
$rows=mysql_num_rows($res);
Число строк может быть равно нулю или больше. Если равно нулю, это означает, что пара логин / пароль была неверна. Я сначала отработаю удачную авторизацию. Код приведен Листинге 9.
Листинг 9.
if($rows>0)
{
$sql_end_ctrl="delete from log_control where ip='".$ip."'";
mysql_query($sql_end_ctrl);
switch ($user)
{
case "admin" :
http_redirect("http://".$server_ip."/attacklogger/admin.php");
break;
default :
http_redirect("http://".$server_ip."/attacklogger/autorized.php?user=".$user);
break;
}
}
Итак, если автоизация успешна ($rows>0), выполняем удаление данных о текущем подключении из контрольной таблицы log_control. Для этого составляем SQL-запрос и выполняем его в БД. Теперь самое время перебросить пользователя на его личную страницу, делать это мы будем с проверкой имени пользователя, т. к. у разных пользователей системы разные права. В нашем случае в БД было заведено всего 2 пользователя admin и user. Тут логично предположить, что отличающаяся от других личная страница должна быть только у администратора ресурса (ник admin). Тогда мы можем обработать имена пользователей в 2 шага. Сначала проверить в case имя пользователя на соответствие нику admin -- если совпадает преадресуем на страницу администратора, если нет, включается вариант default, который используется для всех «не особых» пользователей и переадресует запрос пользователя через фукцию http_redirect, на обычную пользовательскую страницу, с передачей в качестве параметра имени пользователя, для дальнейшей обработки. Вся эта кострукция реализована на базе конструкции switch. Эта конструкция выбрана не случайно -- в случае необходимости добавления еще одного или более «особых» пользователей, конструкцию легко расширить добавив проверки на соответствие логинов искомым и в случае соответствия применения каких-то особых процедур обработки. А «обычные» пользователи продолжают обрабатываться через вариант default и не требуют никаких изменений.
Теперь рассмотрим вариант когда логин / пароль не верны. Код исполняющий эту функциональность приведен в Листинге 10.
Листинг 10.
else
{
$i++;
$sql_up2i_ctrl="update log_control set num_logon=".$i." where ip='".$ip."'";
mysql_query($sql_up2i_ctrl) or die ("ERROR ".mysql_errno()." ".mysql_error()."\n");
if(($i % 3)==0)
{
$sql_danger_connect="insert into danger_connect
set time='".$timevisit."', ip='".$ip."'";
mysql_query($sql_danger_connect) or die ("ERROR ".mysql_errno()." ".mysql_error()."\n");
}
http_redirect("http://".$server_ip."/attacklogger/index.php?fail=yes");
}
Поглядим теперь, как же это все работает. Данная часть кода и выполняет основное назначение программы -- фиксацию попыток атаки на защищаемый объект. Так как атакой на систему при проектировании системы, была признана каждая 3-я попытка неудачной авторизации, выполненная подряд ( как при переборе по словарю ), то здесь и будет применяться данная аксиома. Сначала выполняем приращение счетчика попыток хранящегося в переменной $i. Затем составляется SQL-запрос который выполнит присвоение приращенного счетчика соответствующей данному ip-адресу строке в БД. После создания запрос выполняется в БД. Теперь пора проверить -- данная попытка авторизации кратна 3-м или нет. Для этого используется операция деления по модулю ( if(($i % 3)==0) ), которая в качестве результата возвращает в вызывающую процедуру целочисленный остаток от деления. Если этот остаток равен нулю (что означает кратность 3-м), выполняется фиксация данной попытки соединения в таблице потенциально опасных соединений danger_connect, для последующего бессрочного хранения с возможностью просмотра администратором системы. Запись в таблицу выполняем стандартно -- сначала создание SQL-запроса к БД, затем его исполнение. Далее я сделал перенаправление запроса пользователя назад на страницу index.php, с добавлением к URL флага fail, наличие которого в запросе приведет к выводу страницы авторизации с надписью извещающей пользователя о неуспешной авторизации. Как вариант можно после каждой третьей попытки перенаправлять пользователя не на страницу авторизации, а на какую-нибудь специально подготовленную страницу-заглушку или установить таймер блокирующий на некоторое время попытки соединения с данного ip-адреса и постоянно увеличивающийся, после каждой следующей кратной 3-м попытки авторизации.
Следующей строкой закрываем соединение с СУБД MySQL явным образом, хотя при завершении скрипта ресурсы также освободятся автоматически.
И наконец, завершающая скрипт строка, которая будет работать только в случае какого-либо сбоя, в результате чего переменная «Go» не будет установлена. Строка просто выводит текст извещающий о произошедшем .
На этом рассмотрение скрипта logger.php закончено, можно переходить дальше.
Теперь рассмотрим скрипт странички администратора admin.php. Основную часть файла составляет не скрипт, а HTML-код реализующий GUI страницы администратора. Он выполнен в виде таблицы, для фикисированного расположения элементов и особого интереса не представляет, кроме следующей строки: «<form method=POST action=?><input type=submit name=see value=See></form>». Здесь при помощи тега <form> реализована кнопка «See», при помощи которой администратор дает команду встроенному скрипту вывести список зафиксированных потенциально опасных попыток авторизации. Для этого используется параметр «action» тега <form>, который задает имя скрипта принимающего данные формы для обработки. В данном случае при помощи указания символа «?», задано, что этим скриптом является текущий, т. е. admin.php. Параметр «name» тега <input> нужен для определения нажата ли кнопка «See». Теперь рассмотрим сам скрипт включенный в тело файла admin.php.
В Листинге 11 проверяется установлена ли переменная «see».
Листинг 11.
if($_POST[see])
{
mysql_connect($dbhost, $dbadmin, $dbpass) or die("ERROR ".mysql_errno()." ".mysql_error());
mysql_select_db($dbname) or die("ERROR ".mysql_errno()." ".mysql_error()."\n");
Для проверки установки переменной «see» выполняется поиск ее по имени в глобальном массиве $_POST. Далее выполняется подключение к СУБД MySQL. Теперь нужно выбрать в СУБД именно нашу БД для работы. Данные для выполнения подключения и выбора БД берутся из конфигурационного файла config.php, который подключается в начале файла admin.php в строке «require_once './config.php'». Теперь создаем SQL-запрос, при помощи которого извлекаются все данные из таблицы потенциально опасных соединений danger_connect. Затем нужно выполнить этот запрос в БД и получить результат. Далее, чтобы вывод в HTML-документ был структурирован, нужно определить количество полученных от БД строк и столбцов. Это выполняется с помощью функций специально созданных для этого. Функция mysql_numrows возвращает число строк в полученном от БД результате. Функция mysql_numfields возвращает число полей, то бишь столбцов в полученном от БД результате. Код приведен в Листинге 12.
Листинг 12.
$sql_select_hack="select * from danger_connect";
$r=mysql_query($sql_select_hack);
$row= mysql_numrows($r);
$col= mysql_numfields($r);
Код из Листинга 13 выводит в виде таблички, данные полученные от БД:
Листинг 13.
echo "<br>";
for($j=0; $j<$row; $j++)
{
for($y=0; $y<$col; $y++)
{
echo mysql_result($r, $j, $y);
echo " ";
}
echo "<br>";
}
Здесь используются два вложенных цикла «for», которые и осуществляют выборку данных из результата при помощи функции mysql_result, и их вывод при помощи функции «echo». Вид выводимой страницы будет выглядеть в соответствии с Рисунком 8.
Далее закрываем соединение с MySQL и обрабатываем случай, когда переменная «see» не установлена, выводя в этом случае пробел вместо таблицы.
Рисунок 8. Вывод результата запроса через вложенный цикл.
атака защищенный программа запрос
Рассмотрим последний файл autorized.php, реализующий функциональность личной страницы пользователя. Он представляет собой обычный HTML-документ, с вставкой php-кода. Код приведен в Листинге 14.
Листинг 14.
<?php
echo "<font color=red>".strtoupper($_GET['user'])."</font>";
?>
Здесь вся функциональность заключается в выводе большими красными буквами имени пользователя в приветствии. В случае большого количества пользователей реального ресурса было бы уместно создать в БД таблицы хранящие индивидуальные данные каждого пользователя и «вытаскивать» их при выводе страницы ориентируясь по полученному в глобальном массиве ($_GET['user']) имени пользователя, реализовав эти функции в данном файле.
РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ
Руководство пользователя в данном случае очень несложно, т. к. функциональность реализуется автоматически, без активного участия пользователя. Рекомендации предназначены только для администратора. Разобьем использование системы на шаги и рассмотрим их последовательно.
Итак, Шаг 1. Набираем в адресной строке браузера URL или ip-адрес ресурса, в соответствии с Рисунком 9. И попадаем на страницу авторизации, в соответствии с Рисунком 10.
Рисунок 9. Набор URL в адресной строке.
Рисунок 10. Страница авторизации пользователя.
Шаг 2. Вводим имя пользователя и пароль, в соответствии с Рисунком 11.
Рисунок 11. Ввод логина и пароля.
Шаг 3. Попадаем на страницу администратора, в соответствии с Рисунком 12.
Рисунок 12. Страница администратора информационного ресурса.
Шаг 4. Для просмотра списка зафикисрованных данных о потенциально-опасных соединениях нажимаем кнопку «See» в верхнем правом углу интерфейса, в соответствии с Рисунком 13.
Рисунок 13. Вывод сведений о попытках атаки.
ЗАКЛЮЧЕНИЕ
В данной курсовой работе решены задачи разработки программы для фиксации атак на защищаемый объект.
В процессе создания курсовой работы, был разработан и реализован алгоритм решения поставленной задачи. Программа как и было намечено, реализована на языке программирования PHP, с использованием языка разметки гипертекста HTML, используемым для создания графического интерфейса пользователя GUI. В качестве платформы программного комплекса использована связка Linux + Apache + MySQL + PHP. Полученные в результате проведенной работы результаты соответствуют поставленным задачам. Написано приложение выполняющее запись о потенциально-опасных соединениях, коими в рамках решаемой задачи были признаны каждая 3-я не успешная попытка авторизации выполненная подряд. Запись помещается в таблицу БД для долговременного хранения и просмотра администратором системы в любой момент.
Исходя из вышесказанного можно говорить о успешном достижении целей курсовой работы.
ПРИЛОЖЕНИЕ А.
ЛИСТИНГ ПРОГРАММЫ.
Листинг 1.1. Файл index.php
<?php
/**********************************************************
* главная страница проекта - страница авторизации *
**********************************************************/
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Добро пожаловать на страницу авторизации</title>
</head>
<body><center>
<form name="login" action="logger.php" method="POST">
<table name="body" width="100%" height="100%">
<tr valign="center" align="center"><td bgcolor="bbbbff">
<table name="border">
<tr><td>
<table name="form">
<tr><td colspan="2" align="center"><h1><font color="222222">ВХОД</font></h1></td></tr>
<tr><td colspan="2" align="center"><h6>
<?php
//Вставка отслеживающая наличие переменной fail указывающей на
//ошибку авторизации.
if($_GET['fail'])
echo "<font color='red'>Ошибка авторизации!</font>";
else echo " ";
?>
</h6></td></tr>
<tr><td> Login </td><td><input type="text" name="user"> </td></tr>
<tr><td> Password</td><td><input type="password" name="passwd"> </td></tr>
<tr><td colspan="2" align="center"><h6> </h6></td></tr>
<tr><td><h6> <a href="index.php">Регистрация</a></h6></td><td align="right"><h6><a href="index.php">Забыли пароль?</a> </h6></td></tr>
<tr><td colspan="2" align="center"><h6> </h6></td></tr>
<tr align="center" valign="center"><td colspan="2"><h1><input type="submit" name="go" value="Logon"></h1></td></tr>
</table>
</td></tr>
</table>
</td></tr>
</table>
</form>
</center></body>
</html>
Листинг 1.2 Файл logger.php
<?php
/*****************************************************
* файл выполняющий основную работу по выявлению *
* и логированию попыток взлома перебором *
*****************************************************/
require_once './config.php';
if($_POST['go'])
{
$i=0;
$rows=0;
$flag=$_POST['go'];
$user=$_POST['user'];
$pass=$_POST['passwd'];
$timevisit=date('Y-m-d H-i-s');
$ip=$_SERVER['REMOTE_ADDR'];
$server_ip=$_SERVER['SERVER_ADDR'];
//Обработка функциями удаления HTML-тегов (для исключения возможности
//написания скриптов на JavaScript и Visual Basic) и обратных слешей
//(для исключения возможности написания скриптов на Perl).
$user=htmlspecialchars(stripslashes($user));
$pass=htmlspecialchars(stripslashes($pass));
//Подключение к БД
mysql_connect($dbhost, $dbadmin, $dbpass) or die("ERROR ".mysql_errno()." ".mysql_error());
mysql_select_db($dbname) or die("ERROR ".mysql_errno()." ".mysql_error()."\n");
//Проверка на наличие данного ip в контрольной таблице
$sql_exist_ctrl="select num_logon from log_control where ip='".$ip."'";
$res=mysql_query($sql_exist_ctrl) or die("ERROR ".mysql_errno()." ".mysql_error()."\n");
$rows=mysql_num_rows($res);
if($rows==0) //если ip не записан
{
//Вставка нового ip в контрольную таблицу
$sql_begin_ctrl="insert into log_control set time='".$timevisit."', ip='".$ip."', num_logon=".$i;
mysql_query($sql_begin_ctrl) or die ("ERROR ".mysql_errno()." ".mysql_error()."\n");
}
else //если ip уже есть в таблице
{
$array=mysql_fetch_array($res); //получаем номер текущей попытки авторизации
$i=$array[0];
}
//проверяем правильность пары логин-пароль
$sql_autoriz="select id from users where user='".$user."' and pass='".$pass."'";
$res=mysql_query($sql_autoriz) or die("ERROR ".mysql_errno()." ".mysql_error()."\n");
$rows=mysql_num_rows($res);
if($rows>0) //если логин-пароль верны
{
//удаляем записи из контр.таблицы
$sql_end_ctrl="delete from log_control where ip='".$ip."'";
mysql_query($sql_end_ctrl);
switch ($user)
{
case "admin" :
http_redirect("http://".$server_ip."/attacklogger/admin.php"); //авторизация администратора
break;
default :
http_redirect("http://".$server_ip."/attacklogger/autorized.php?user=".$user); //авторизация клиента
break;
}
}
else //ЕСЛИ логин-пароль неверны
{
$i++; //увеличиваем номер попытки на 1
$sql_up2i_ctrl="update log_control set num_logon=".$i." where ip='".$ip."'";
//устан. новое значение номера попытки в контрольную таблицу
mysql_query($sql_up2i_ctrl) or die ("ERROR ".mysql_errno()." ".mysql_error()."\n");
if(($i % 3)==0) //если номер этой попытки кратен 3м
{
$sql_danger_connect="insert into danger_connect set time='".$timevisit."', ip='".$ip."'";
//записываем данный ip и время попытки авторизации в постоянную таблицу опасных соединений
mysql_query($sql_danger_connect) or die ("ERROR ".mysql_errno()." ".mysql_error()."\n");
}
//возвращаем клиента на страницу авторизации с передачей
//параметра указывающего на неудачную аутенификацию пользователя.
http_redirect("http://".$server_ip."/attacklogger/index.php?fail=yes");
}
mysql_close();
}
Else
echo "ERROR!!! Not set variable Go!";
?>
Листинг 1.3 Файл config.php
<?php
/**************************************************
* конфигурационный файл, содержащий параметры *
* используемые для соединения с БД MySQL *
************************************************ */
$dbhost="localhost";
$dbadmin="root";
$dbpass="c2h5oh";
$dbname="attack_logger";
?>
Листинг 1.4 Файл admin.php
<?php
/*****************************************************
* страничка администратора ресурса позволяющая *
* позволяющая просматривать список ip-адресов *
* и время появления потенциально опасных соединений *
*****************************************************/
require_once './config.php';
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Добро пожаловать на личную страницу</title>
</head>
<body bgcolor="ddddff">
<table border="0" width="100%">
<tr><td colspan="3"><h2><center>Welcome <font color="red">Admin!</font>
</center></h2></td></tr>
<tr>
<td width="15%"><img src="debian.png" alt="Admin"></td><td width="70%" rowspan="2">
<?php
if($_POST[see])
{
//Подключение к БД
mysql_connect($dbhost, $dbadmin, $dbpass) or die("ERROR ".mysql_errno()." ".mysql_error());
mysql_select_db($dbname) or die("ERROR ".mysql_errno()." ".mysql_error()."\n");
//получение записей о подозрительных соединениях
$sql_select_hack="select * from danger_connect";
$r=mysql_query($sql_select_hack);
//вывод результата в html-документ
$row= mysql_numrows($r);
$col= mysql_numfields($r);
echo "<br>";
for($j=0; $j<$row; $j++)
{
for($y=0; $y<$col; $y++)
{
echo mysql_result($r, $j, $y);
echo " ";
}
echo "<br>";
}
mysql_close();
}
else
echo " ";
?>
</td><td width="15%"><p><font color='red'>See IP hackers?</font><br></td>
</tr>
<tr>
<td><br><p><a href="">Profile</a><br><p><a href="">Friends</a><br>
<p><a href="">Messages</a><br>
<p><a href="./index.php">Back</a></td>
<td valign="top"><form method=POST action=?><input type=submit name=see value=See></form></td>
</tr>
</table>
</html>
Листинг 1.5 Файл autorized.php
<?php
/**************************************************
* Личная страница пользователя *
**************************************************/
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Добро пожаловать на личную страницу</title>
</head>
<body bgcolor="ddddff">
<table border="0" width="100%">
<tr><td colspan="3"><h2><center>Welcome
<?php
echo "<font color=red>".strtoupper($_GET['user'])."</font>";
?>
</center></h2></td></tr>
<tr>
<td width="15%"><img src="foto.jpg" alt="User"></td><td width="70%" rowspan="2"> </td><td width="15%"> </td>
</tr>
<tr>
<td><br><p><a href="">Profile</a><br><p><a href="">Friends</a><br><p><a href="">Messages</a></td><td> </td>
</tr>
</table>
</body>
</html>
ПРИЛОЖЕНИЕ В
Список использованной литературы
1. Цирлов В. Основы информационной безопасности информационных систем. Краткий курс. Изд. «Феникс», 2008. -173 стр.
2. Шаньгин В. Информационная безопасность компьютерных систем и сетей. М.: ИД «Форум»; ИНФРА-М, 2008. -416 стр.
3. Шлосснейгл Д. Профессиональное программирование на PHP. Пер. С англ. - Издательский дом «Вильямс», 2006. - 624 стр.
ПРИЛОЖЕНИЕ С
Рисунок С. Блок-схема работы приложения
Размещено на Allbest.ru
Подобные документы
Алгоритм работы программы, которая выполняет записи в log-файл действий, идентифицированных как попытки атаки на страницу авторизации пользователей условного ресурса. Макет веб-сайта, листинги файлов программы и процесс ее взаимодействия с СУБД MySQL.
курсовая работа [1,3 M], добавлен 22.06.2015Разработка программного средства для анализа значений хэш-функций с целью формальной оценки стойкости пароля. Проблема слабых паролей. Оценка ущерба, возникающего вследствие атаки на защищаемый объект. Метод поиска по словарям и "радужным таблицам".
дипломная работа [1022,5 K], добавлен 10.06.2013Разработка программы, которая выполняет удаление элементов внешних таблиц, а также очистку файлов, вывод таблиц на экран. Описание программного продукта. Выбор языка программирования. Схема информационных потоков. Комплект поставки и инсталляция.
курсовая работа [180,0 K], добавлен 09.03.2009Описание возможностей языка программирования Turbo Pascal. Написание программы создания файлов с прямым доступом, которая также будет обрабатывать наборы данных с определенными полями и ограничениями. Контрольный пример работы поисковой программы.
курсовая работа [563,6 K], добавлен 22.01.2016Разработка программы, которая по заданной самостоятельно функции будет выполнять интегрирование методом прямоугольников. Блок-схема алгоритма вычисления интеграла (функция rectangle_integrate). Экспериментальная проверка программы, ее текст на языке C.
курсовая работа [232,0 K], добавлен 27.05.2013Разработка программы на языке программирования C++ с функциями считывания словаря в начале работы программы из текстового файла и записи словаря в файл перед завершением работы. Основные элементы программного продукта: данные абонента телефонной сети.
контрольная работа [12,9 K], добавлен 07.04.2015Функциональный язык программирования. Широкие возможности для работы с файлами. Понятие потока, с которым связан файл символ. Поток - абстрактный объект, с которым можно работать, не углубляясь в аппаратную и программную реализацию работы с данными.
доклад [10,2 K], добавлен 22.09.2008Разработка программы для работы с последовательностью прописных латинских букв. Алгоритм программы, результаты ее работы и вывод о работоспособности. Поиск количества вхождений элементов одной строки в другую. Тестирование программы, ее результаты.
лабораторная работа [858,0 K], добавлен 23.11.2014Алгоритм и код программы для создания исходного двоичного файла чисел с произвольным количеством элементов, чтения из файла действительных восьмибайтных элементов и подсчёта общего количества элементов файла. Вывод результата работы программы на экран.
контрольная работа [1,0 M], добавлен 23.11.2014Особенности языка "Си шарп". Содержательная постановка программы. Описание классов и структур. Алгоритм и логики работы программы, переменные. Тестирование, инструкция пользователю. Пример удаления записи о читателе. Общий вид листинга программы.
курсовая работа [360,3 K], добавлен 21.11.2013