Автор работы: Пользователь скрыл имя, 04 Сентября 2013 в 05:38, дипломная работа
Все эти проблемы позволяет решить разработанная мною система тестирования. Основное преимущество трёхзвенной структуры заключается в превосходной степени защиты (к базе данных нет прямого доступа из интернета, многоуровневая защита с различными алгоритмами шифрования).
Для проектирования и разработки базы данных использовались источники [1, 5, 6], для создания приложения тестирования [2, 3], а для обеспечения защиты данных [4, 7].
Введение 5
1 Теоретические основы 6
1.1 Постановка задачи6
1.2 Проектирование баз данных10
1.3 Среда Firebird как средство разработки СУБД14
1.4 Разработка интерфейса пользователя18
1.5 Выбор средств защиты информации22
2 Разработка и апробация проекта 26
Заключение 39
Список использованных источников 40
Приложение А (обязательное) Код программы 41
Статус:
«идет экзамен» - говорит о том, что экзаменуемый отвечает на вопросы билета, на форме поочередно отображается результат ответа на каждый пройденный вопрос.
«готово к старту» - приложение-сервер ждет сообщения от приложения-клиента сообщения о начале экзамена.
«Экзамен (НЕ) сдан» - отображается результат экзамена.
Если иконка рабочей станции активна, то экзаменатор щелкая на строке клиента и нажимая на кнопку «назначить экзамен на выбранном компьютере», вызывает форму назначения экзамена.
Заполняя все указанные поля, согласно документам экзаменуемого, нажимает кнопку «записать». В клиентской части системы, на компьютере экзаменуемого отображается введенная экзаменатором информация в соответствии с рисунком 5.
Рисунок 5 -Форма приложения – «клиент».
Ознакомившись с правилами сдачи экзамена, экзаменуемый нажимает любую клавишу для начала тестирования, которое проходит в соответствии с рисунком 6.
Рисунок 6 - Форма приложения – «сервер».
После того как экзаменуемый ответит на 20 вопросов билета, выводится форма в соответствии с рисунком 7, где отображается результат экзамена. Количество пройденных вопросов, верных и ошибочных, а также затраченное время.
Рисунок 7 - Форма приложения – «клиент».
Экзаменуемый имеет
Экзаменатор на форме сервера видит результат экзамена и нажимая на кнопку «распечатать экзаменационный лист выбранного компьютера», формирует отчет в соответствии с рисунком 8.
Рисунок 8 – Экзаменационный отчетный лист.
Следует сразу заметить, что для
сосуществования отдельных
Если рассмотреть схему подробнее:
Port - номер порта для установления соединений с клиентами. Порт у сервера и у клиентов должны быть одинаковыми. Рекомендуются значения от 1025 до 65535, т.к. от 1 до 1024 - могут быть заняты системой.
Установим TrueCrypt. Создадим зашифрованный том, на котором и будет храниться наша БД в соответствии с рисунками 9 и 10.
Рисунок 9 – Создание защищённого раздела.
Рисунок 10 – Шифрованные разделы алгоритмом AES.
После всего этого установим ZeBeDee и приступим к его настройке. На сервере ZeBeDee запустим: ZeBeDee -s localhost:3050. На клиенте запустим: ZeBeDee 3051:адрес сервера:3050. Теперь ZeBeDee готова к работе!
Если не использовать приватные ключи, то ZeBeDee просто шифрует данные между двумя точками, при этом разрешая соединение с сервером любых клиентов ZeBeDee. Но даже без приватных ключей ZeBeDee снимает проблему открытости пакетов при использовании 'sniffer' (просмотрщика пакетов) - шифрование идет с самого начала, и username вместе с путем и именем базы данных будет зашифрован, значительно затрудняя работу потенциального взломщика. При использовании приватных ключей на сервере ZeBeDee включится аутентификация, позволяющая соединяться только тем клиентам, у которых есть файл ключа.
Для создания ключа используем команду: ZeBeDee –p. Получим нечто вроде: privatekey "
ba077f6a42bea502f517cab5685e47
3ad38cb1f16957d5c535272ce27557
135f04050961d37553731250d5c6f7
На сервере ZeBeDee нужно в файл конфигурации добавить строку: checkidfile "path-to-dir/clients.ids" (файл clients.ids содержит строки из всех файлов client.id, которым разрешено соединяться с сервером ZeBeDee). Теперь, если клиент без ключа попытается соединиться с сервером, то аутентификация не пройдет, и сервер откажет клиенту в соединении.
Важным свойством ZeBeDee для интернет-решений является возможность сжатия пакетов. В клиент-серверных приложениях часто передаются большие объемы данных, например для отчетов - для интернета это будет очень неэффективно и медленно. Для этого в конфигурационном файле раскомментируем compression zlib:9 (можно попробовать коэффициенты сжатия менее 9).
Заключение
В результате проделанной работы была разработана система тестирования, рассмотрены основные современные методы защиты базы данных от похищения и клиент-серверного трафика от перехвата и подмены.
Среди множества средств для разработки систем тестирования была выбрана Embarcadero Delphi XE2, а система управления базами данных Firebird. Естественно, сравнивая используемые в настоящей работе программные продукты с их аналогами, в качестве основных достоинств можно отметить: цену (Firebird), быстродействие, надёжность, многоверсионность (Firebird), легкость установки, автоматическое восстановление после аварийных отказов и минимальные требования к администрированию (Firebird). Недостатками можно считать относительно большую цену на Embarcadero Delphi XE2, отсутствие встроенного шифрования трафика для подключений к базе данных, использование блокирующих сокетов.
Система тестирования может использоваться в различных учебных заведениях на уроках для промежуточного контроля знаний, а также на экзаменах для итоговой проверки усвоения материала. Количество клиентских машин может варьироваться от 1 до 65535.
В перспективе планируется (и уже начата) перенос программы клиента и сервера в свободно распространяемую среду Lazarus на базе не блокирующих сокетов Synapse. В конце 2012 года также планируется выпуск Firebird 3.0. Всё это позволит избавится от всех недостатков данной системы.
Список использованных источников
Приложение А (обязательное) Код программы
unit ExamUnit;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Menus, Grids, DBGrids, DB, IBCustomDataSet, IBDatabase, StdCtrls, jpeg, ExtCtrls, Buttons, ToolWin, ComCtrls, ScktComp, StrUtils, ActnList, DateUtils, IniFiles;
Type TServerExam = record
ClientSocket: TClientSocket;
ClientComputerName:string;
ClientManName:string;
Resultat: byte;
Status:integer;
ExamTeoryPK:longint;
Time:integer;
end;
type
TFmExamServer = class(TForm)
IBDsetEXAMTRwrite: TIBDataSet;
WriteIBTransaction: TIBTransaction;
Timer1: TTimer;
ServerSocket1: TServerSocket;
DataSourceEXAMtr: TDataSource;
IBDataSetEXAMtr: TIBDataSet;
ReadIBTransaction: TIBTransaction;
Panel3: TPanel;
Panel4: TPanel;
ToolBar1: TToolBar;
SpeedButton1: TSpeedButton;
SpeedButton3: TSpeedButton;
SpeedButton2: TSpeedButton;
StringGrid1: TStringGrid;
SpeedButton6: TSpeedButton;
Image15: TImage;
Label6: TLabel;
Image14: TImage;
Label7: TLabel;
Image1: TImage;
Label8: TLabel;
Image2: TImage;
Label9: TLabel;
Image6: TImage;
Label10: TLabel;
BitBtn1: TBitBtn;
Image5: TImage;
Image4: TImage;
IBDatabase1: TIBDatabase;
Image3: TImage;
Image7: TImage;
SpeedButton5: TSpeedButton;
SpeedButton4: TSpeedButton;
procedure FormCreate(Sender: TObject);
procedure StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
procedure ShowWorkPlases(
function IntSecToStrTime(IntSec:
procedure Timer1Timer(Sender: TObject);
procedure ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
procedure ClientSocket1Disconnect(
Socket: TCustomWinSocket);
procedure StartNewExam(RowNom:integer;
procedure SpeedButton1Click(Sender: TObject);
procedure ServerSocket1ClientRead(
Socket: TCustomWinSocket);
procedure Some(RecText:string);
function FindNomberByTag(Tag:integer):
procedure SpeedButton3Click(Sender: TObject);
procedure FinishExamAtAll(RowNom:
function StrTimeToIntSec(inpTime:
procedure EmercyFinishExam(RowNom:
procedure SpeedButton2Click(Sender: TObject);
function GetComputerNetName: string;
procedure AddAnAWorkPlace(Re,
procedure SetWPtoNull(nom:integer);
procedure SpeedButton6Click(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
procedure SpeedButton5Click(Sender: TObject);
procedure SpeedButton4Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
FmExamServer: TFmExamServer;
VOPR:byte=10;
TTTime:integer=600;
WorkPlaces:array of TServerExam;
JustStartingStantion:integer;
Stat:array[0..7] of string;
implementation
uses NewExam, ExamListUnit, Unit7, Settings;
{$R *.dfm}
procedure TFmExamServer.BitBtn1Click(
begin
FmExamServer.Close;
end;
function TFmExamServer.IntSecToStrTime(
var min,sec:string;
i:integer;
begin
min:=inttostr(IntSec div 60);
sec:=inttostr(IntSec mod 60);
for i:=2 downto length(min)+1 do min:='0'+min;
for i:=2 downto length(sec)+1 do sec:='0'+sec;
result:=min+':'+sec;
end;
function TFmExamServer.StrTimeToIntSec(
var StrTime:string;
begin
StrTime:=TimeToStr(inpTime);
if length(StrTime) = 7 then StrTime:='0'+StrTime;
if StrTime='' then result:=0
else
begin
result:=strtoint(copy(StrTime,
end;
end;
procedure TFmExamServer.FormCreate(
var Fname,tmpstr:string;
IniFile:TIniFile;
begin
Stat[0]:= '';
Stat[1]:= 'ожидание ответа';
Stat[2]:= 'готово к старту';
Stat[3]:= 'идет экзамен';
Stat[4]:= 'просмотр результатов';
Stat[5]:= 'просмотр неправильных';
Stat[6]:= 'прервано администратором';
Stat[7]:= 'Завершено';
try
IniFile:=TIniFile.Create(
Fname:=IniFile.ReadString('
tmpstr:=IniFile.ReadString('
IniFile.Free;
IBDatabase1.DatabaseName:=
IBDatabase1.Connected:=true;
IBDataSetEXAMtr.Open;
//AddAnAWorkPlace(-1,1);
except
MessageDlg('Не удалось соединиться с базой данных!', mtError, [mbOk], 0);
FmExamServer.close;
end;
ShowWorkPlases(-1);
end;
procedure TFmExamServer.StartNewExam(
var WpTag,nom:integer;
begin
JustStartingStantion:=-1;
if length(WorkPlaces)=0 then
begin
if speaker then MessageDlg('Нет подключенных рабочих станций.'+#13+
'Нельзя назначить новый экзамен пока нет подключенных станций.', mtinformation, [mbOk], 0);
exit;
end;
WpTag:=strtoint(StringGrid1.
nom:=FindNomberByTag(WpTag);
if nom=-1 then
BEGIN
if speaker then MessageDlg('Компьютер не доступен.'+#13+
'Нельзя назначить новый экзамен на недоступный компьютер', mtinformation, [mbOk], 0);
exit;
end;
if nom>=0 then
if WorkPlaces[nom].ExamTeoryPK<>0 then
BEGIN
if speaker then MessageDlg('На указанный компьютер уже назначен экзамен.'+#13+
'Нельзя назначить новый
exit;
end;
JustStartingStantion:=abs(
Application.CreateForm(
end;
procedure TFmExamServer.FinishExamAtAll(
var nom:integer;
stdate:String;
begin
if length(WorkPlaces)=0 then exit;
nom:=FindNomberByTag(strtoint(
if nom=-1 then nom:=FindNomberByTag(-
if (WorkPlaces[nom].Status<>7) and (WorkPlaces[nom].Status<>4) and (WorkPlaces[nom].Status<>5) then exit;
WorkPlaces[nom].ClientSocket.
IBDsetEXAMTRwrite.Close;
IBDsetEXAMTRwrite.SelectSQL.
IBDsetEXAMTRwrite.SelectSQL.
IBDsetEXAMTRwrite.Open;
IBDsetEXAMTRwrite.Edit;
IBDsetEXAMTRwrite.FieldByName(
IBDsetEXAMTRwrite.Post;
stdate:=IBDsetEXAMTRwrite.
IBDsetEXAMTRwrite.Close;
WriteIBTransaction.Commit;