Листинг 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;_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.
{
$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.($rows>0)
{
$sql_end_ctrl="delete from log_control where ip='".$ip."'";_query($sql_end_ctrl);($user)
{"admin" :_redirect("#"869107.files/image008.jpg">
Рисунок 8. Вывод результата запроса через вложенный цикл.
Рассмотрим последний файл autorized.php, реализующий функциональность личной страницы пользователя. Он представляет собой обычный HTML-документ, с вставкой php-кода. Код приведен в Листинге 14.
Листинг 14.
<?php"<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>
<?php
/*****************************************************
* файл выполняющий основную работу по выявлению *
* и логированию попыток взлома перебором *
*****************************************************/_once './config.php';($_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));
//Подключение к БД_connect($dbhost, $dbadmin, $dbpass) or die("ERROR ".mysql_errno()." ".mysql_error());_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);($rows==0) //если ip не записан
{
//Вставка нового ip в контрольную таблицу
$sql_begin_ctrl="insert into log_control set time='".$timevisit."', ip='".$ip."', num_logon=".$i;_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);($rows>0) //если логин-пароль верны
{
//удаляем записи из контр.таблицы
$sql_end_ctrl="delete from log_control where ip='".$ip."'";
mysql_query($sql_end_ctrl); ($user)
{
case "admin" :
http_redirect("#"869107.files/image014.gif">