Podejrzany klient

Odprawa przed startem

Kolumny tabeli monitorowania zawierają następujące wartości informacyjne:

  • Login_Time - data i czas zalogowania się do systemu (rozpoczęcia pracy z aplikacją);

  • Userid - identyfikator użytkownika zgodny z nazwą podawaną przy logowaniu się do programu;

  • Host_Name - nazwa stacji roboczej, tutaj nazwa komputera w systemie Windows;

  • Objectid - nazwa otwartej planszy programu;

  • Last_Action_Time - data i czas ostatnio wykonanej akcji podlegającej monitorowaniu;

  • Flag - liczba monitorowanych zmian plansz podczas aktualnej sesji;

  • Blokada - identyfikator edytowanego aktualnie zasobu danych.
Aby uzyskać dane o środowisku stacji roboczej, należy podczas uruchamiania programu zadbać o pobranie pewnych specyficznych danych środowiskowych. Dla uproszczenia analizy przyjęto w opisie procedurę, że zmienne programu mają takie same nazwy, jak nazwy kolumn w tabeli. W zmiennych programu przez cały czas trwania sesji są pamiętane wartości ustanowione na początku. Należą do nich: czas rozpoczęcia pracy (Login_Time), identyfikator użytkownika (Userid) i nazwa komputera (Host_Name). Służą one jako kluczowe dane identyfikacyjne do odnalezienia oraz porównania wartości zapisanych w tabeli monitorowania. Instrukcja języka SQL w implementacji MS SQL Server 2000 dostarczająca nazwę komputera wygląda dość trywialnie:

select Host_Name() as Host_Name

Programista musi mieć na uwadze fakt, że jest to instrukcja zwracająca dane, ale wykonująca się na serwerze. Pozostałe atrybuty, do których należą: identyfikator użytkownika i czas rozpoczęcia pracy, są pobierane bez udziału środowiska języka SQL. Identyfikator użytkownika zależy od sposobu rejestrowania użytkowników przez daną aplikację, za moment rozpoczęcia pracy natomiast przyjmuje się czas systemowy stacji roboczej w chwili uruchomienia programu. Zwracam tu uwagę na konieczność wcześniejszego zsynchronizowania parametrów czasu stacji z parametrami czasu serwera. Wszystkie dalej przedstawione funkcje są zapisane w notacji języka Visual Basic. Nie udokumentowana tutaj, a używana funkcja WYKONAJ_SQL (strSQL) powoduje wysłanie stosownych instrukcji języka SQL do wykonania na serwerze.

Z czystym kątem

Podejrzany klient

Algorytm monitorowania

Wraz z rozpoczęciem pracy aplikacji należy wywołać jednorazowo funkcję LOGIN wykonującą wpis do tabeli TM, który rejestruje rozpoczęcie pracy użytkownika. Moment jej wywołania powinien przypadać na chwilę, gdy w środowisku programu są już znane wartości Login_Time, Userid, Host_Name, ale nie później niż pierwsze użycie którejkolwiek z opisanych tu innych funkcji. Zauważmy, że wielokrotne wywołanie funkcji LOGIN, np. wskutek błędu programisty, nie powoduje, z wyjątkiem dodatkowego obciążenia serwera, żadnych negatywnych skutków ubocznych, albowiem na początku funkcja ta uruchamia procedurę REMOVE_OWNER, usuwającą własne wpisy.

Function LOGIN()

REMOVE_OWNER

strSQL = "insert into TM (Login_Time, Userid, Host_Name) values ('" & Login_Time & "', '" & Userid & "', '" & Host_Name & "')"

WYKONAJ_SQL (strSQL)

End Function

Można polemizować, czy funkcja LOGIN powinna także wykonywać wpis do kolumny Last_Action_Time, który byłby tu równy wartości Login_Time, czy też pozostawić tę sprawę "odłogiem". Zakładając, co właśnie ma miejsce w opisywanej implementacji, że następującą z kolei procedurą będzie określenie bieżącej aktywności użytkownika za pomocą funkcji ACTIVITY, funkcja LOGIN pełni tutaj podstawową rolę rejestracji, polegającą na wpisaniu wiersza, określając tylko do kogo on należy. Odrębna uwaga należy się procedurze usuwania własnych wpisów osieroconych, co odbywa się jeszcze przed zarejestrowaniem rekordu stacji. Zmiana sekwencji (najpierw rejestrowanie, potem usuwanie własnych wpisów osieroconych) skutkowałaby tym, że żaden wiersz w tabeli TM nigdy by się nie pojawił. Funkcja REMOVE_OWNER działa bardzo pospolicie, usuwając wszystkie wiersze, mające nazwę komputera identyczną z nazwą stacji tę funkcję wywołującą.

Function REMOVE_OWNER()

strSQL = "delete TM where Host_Name='" & Host _Name & "'"

WYKONAJ_SQL (strSQL)

End Function


TOP 200