Docstoc

Sztuczna Inteligencja Tomasz Mac

Document Sample
Sztuczna Inteligencja Tomasz Mac Powered By Docstoc
					Sztuczna Inteligencja




                             Tomasz Mackało
                         Michał Kryszkiewicz
                        IS.SIP1.WIMiIP.AGH
Spis treści

1. Wprowadzenie…………………………………………………………………………2
     Sposoby rozpoznawania spamu..…........................................................................3
     Przyszłość bez spamu……………………………………………………………10
2. Cel projektu…………………………………………………………………………...12
3. Narzędzia……………………………………………………………………………...12
4. Zasada działania systemu……………………………………………………………..12
5. Opis okienek…………………………………………………………………………..13
     Logowanie……………………………………………………………………….13
     Rejestracja……………………………………………………………………….13
     Wysyłanie wiadomości…………………………………………………………..14
     Odbieranie wiadomości………………………………………………………….15
6. Opis działania systemu antyspamowego……………………………………………...16
7. Kod źródłowy klasy „Agent”………………………………………………………….17
8. Dodatki………………………………………………………...………………………18
     Dodatek A - Kod strony logowania…………...………………………………….18
     Dodatek B - Kod strony rejestrowania……………………………………………18
     Dodatek C – Kod strony wysyłania wiadomości…………………………………20
     Dodatek D – Kod strony odbierania wiadomości(pop-up window)……………....23
     Dodatek E – Kod pliku CSS………………………………………………………23
     Dodatek F – Kody pozostałych plików…………………………………………....24




                                                      1
1. Wprowadzenie

       Pierwszy spam wysłano w roku 1978. Wiadomość o nowym komputerze DEC-
System-20 od przedstawiciela handlowego Digital Equipment Corporation otrzymało
wówczas około 400 użytkowników sieci Arpanet. Obecnie niechciane oferty reklamowe
stanowią przeszło dwie trzecie wszystkich e-maili, co odpowiada miliardom przesyłek
każdego dnia. Dla co trzeciego użytkownika poczty elektronicznej około 80%
otrzymywanych dziś wiadomości to spam. Ostatnio stał się on jeszcze większym zagrożeniem
ze względu na coraz częstszy proceder podszywania się oszustów pod ludzi lub instytucje
zaufania publicznego. Adresatów nakłania się w ten sposób do ujawnienia numerów kart
kredytowych lub innych poufnych informacji. Z badań przeprowadzonych w roku 2004 przez
agencję Gartner Research wynika, że ataki tego typu powodują w Stanach Zjednoczonych
straty w wysokości około 1.2 mld dolarów rocznie.

Zjawisko spamu dotyczy nie tylko poczty elektronicznej. Na internetowych czatach można
spotkać "roboty", które udając ludzi, usiłują namówić rozmówców do odwiedzenia witryn
sieciowych o treści pornograficznej. Użytkownicy komunikatorów internetowych IM (instant
messaging) są narażeni na podobny do spamu tzw. spIM. Z kolei blogi padają ofiarą
"linkowych spamerów" (link spammers), którzy podając błędne odnośniki, zakłócają
działanie niektórych wyszukiwarek w Sieci, i wyraźnie zmniejszają ich użyteczność.

Narastające lawinowo zjawisko spamu może utrudnić, a nawet całkowicie uniemożliwić
komunikację internetową w znanej nam postaci. Sytuacja nie jest jednak beznadziejna. Znamy
już kilka sposobów na przechwytywanie spamu i gnębienie jego nadawców, a wkrótce mogą
pojawić się kolejne rozwiązania.

Wszechobecność niechcianych e-maili to wynik działania sił rynku sprzyjających oszustom:
rozsyłanie spamu jest bowiem niezwykle tanie. Szacujemy, że koszt wysłania jednego listu
elektronicznego wynosi zaledwie około setnej części centa. Spamer zarabiający na
pojedynczej transakcji 11 dolarów zyskuje nawet wtedy, gdy z odzewem spotka się jeden na
100 tys. wysłanych e-maili. Cierpią zatem wszyscy użytkownicy poczty elektronicznej, mimo
że tylko niewielu z nich korzysta z ofert zamieszczanych w spamie.

Bardzo denerwującą cechą spamu jest nieustanna zmienność jego formy. Zawsze gdy
informatycy opracują nowe zabezpieczenia, spamerzy znajdą sposób, aby je obejść.


                                             2
Obserwujemy wyścig technologiczny, w którym obydwie strony sięgają po coraz bardziej
wyrafinowane środki.

Już samo zdefiniowanie spamu to poważne wyzwanie. Prawnicy najczęściej określają tym
mianem "niezamawiane listy elektroniczne o tematyce komercyjnej pochodzące od
nadawców, z którymi nie nawiązywaliśmy wcześniej kontaktu". Taka definicja niekiedy jest
zbyt ogólna. Na przykład niedawno otrzymaliśmy wiadomość zawierającą propozycję
zrealizowania filmu na podstawie opowiadania, które zamieściliśmy w Internecie. Taki list
niewątpliwie odpowiadał wspomnianej definicji spamu - nie był oczekiwany, dotyczył
zagadnień komercyjnych i nie znaliśmy jego nadawcy - ale chyba nikt nie uznałby go za
spam. Aby sformułować alternatywną definicję, można by posłużyć się spostrzeżeniem,
że spam jest wysyłany masowo. Jednak kiedy organizowalibyśmy pewną konferencję,
zmuszeni bylibyśmy np. wysłać e-maile do 50 nieznanych nam osób. Listy zawierałyby
prośbę o zgłoszenie prac na tematy, które miały być dyskutowane na konferencji. Oczywiście
żaden z adresatów nie miałby do nas pretensji. Być może najtrafniej istotę spamu oddaje więc
stwierdzenie, że jest on rozsyłany do przypadkowych odbiorców, którzy nie są nim
zainteresowani. Podobnie jak w przypadku pornografii sformułowanie precyzyjnej definicji
spamu jest niezwykle trudne. Mimo to z łatwością go rozpoznajemy, gdy znajdzie się
w naszej skrzynce pocztowej.

Sposoby rozpoznawania spamu.

Pierwszy pomysł polegał na oznaczaniu wiadomości na podstawie znaków szczególnych.
Informatycy musieli znaleźć przykłady spamu i pozwolić oprogramowaniu na ich oznaczenie,
czyli określenie dzięki treści listu pewnej sumy kontrolnej - jednakowej w przypadku
podobnych lub identycznych wiadomości. W tym celu możemy zastosować na przykład taką
procedurę: do liczby odnalezionych w treści wiadomości liter A dodajemy pomnożoną przez
10 liczbę odnalezionych liter B, pomnożoną przez 100 liczbę liter C itd. Kiedy przychodzi
nowy list, filtr antyspamowy oblicza odpowiadającą mu wartość i porównuje ją z wartościami
typowymi dla spamu. Jeżeli są sobie równe, program usuwa lub archiwizuje daną wiadomość.

Niestety, spamerzy szybko obeszli tak proste zabezpieczenia, wstawiając w treść e-maila
przypadkowe litery. Filtry antyspamowe uzupełniono więc o procedury pozwalające
odnajdować i pomijać losowe ciągi znaków. Wtedy spamerzy zamiast liter zaczęli wstawiać
wyrazy mające upodobnić listy na przykład do prognozy pogody. Okazało się, że stworzenie


                                             3
systemu opartego na rozpoznawaniu znaków szczególnych i zarazem odpornego na triki
spamerów jest niezwykle trudne.

Postanowiono zmienić kierunek poszukiwań i podążyć tropem technik uczenia maszynowego.
Tworzone z ich wykorzystaniem wyspecjalizowane programy komputerowe potrafią nauczyć
się rozpoznawania spamu i trudno wyprowadzić je w pole, dodając kilka przypadkowych liter
lub wyrazów.

Zaczęto od najprostszej i najbardziej rozpowszechnionej metody. Naiwny klasyfikator Bayesa
posłużył do porównania prawdopodobieństw, z jakimi występują w tekście różne słowa. I tak
każdy z wyrazów "kliknij" (click), "tutaj" (here) i "anuluj" (unsubscribe) w spamie pojawia
się z prawdopodobieństwem 0.9, a w zwyczajnym liście - z prawdopodobieństwem 0.2 (1.0
oznacza pewność wystąpienia danego słowa w wiadomości). Mnożąc prawdopodobieństwa
wystąpienia każdego z wyrazów składających się na wiadomość i korzystając z zasady
statystycznej zwanej twierdzeniem Bayesa, można oszacować prawdopodobieństwo tego,
czy e-mail jest spamem.

Zastosowanie naiwnego klasyfikatora Bayesa pozwala trafnie wyznaczyć charakter listu
i zapewnia odporność na proste próby zmylenia programu filtrującego. Nie miejmy jednak
złudzeń, że jest to rozwiązanie doskonałe. Przyjęte w nim założenie, że wyrazy występują
niezależnie od siebie, w wielu przypadkach nie jest prawdziwe (słowa "kliknij" i "tutaj"
często będą pojawiać się obok siebie). Zwrócono się zatem w stronę liniowych modeli
dyskryminacyjnych, które umożliwiają przypisanie wag poszczególnym wyrazom, a także
uwzględnienie innych okoliczności - chociażby jednoczesnego wysyłania listu do wielu
odbiorców. Modele tego typu uczą się zależności pomiędzy wyrazami. Na przykład nie
przywiązują przesadnie dużego znaczenia do słów, które często występują razem, jak
"kliknij", "tutaj" i "anuluj". Próbując to wytłumaczyć prościej: powiedzmy, że filtr z naiwnym
klasyfikatorem Bayesa znalazł te trzy często spotykane w spamie wyrazy. Już na tej
podstawie mógł błędnie uznać, że zawierający je e-mail jest śmieciem, i skasować ważną
wiadomość. Tymczasem model dyskryminacyjny "rozumie", że wspomniane wyrazy często
tworzą jedną frazę i trzeba rozsądnie zredukować przypisywane im wagi. System może się też
nauczyć, że słowa takie jak "tutaj", które bardzo często można znaleźć w spamie, nie
ułatwiają rozpoznania charakteru wiadomości, a zatem w ogóle nie należy zwracać na nie
uwagi. Metody dyskryminacyjne pozwalają nawet uwzględnić fakt, że podejrzane znaczenie
niektórych słów bywa osłabiane przez inne słowa. Chociaż wyraz "wilgotne" często pojawia


                                              4
się w spamie, to jednoczesna obecność wyrazu "pogoda" sugeruje, że mamy do czynienia ze
zwyczajną prognozą pogody.

Zaletą systemów z naiwnym klasyfikatorem Bayesa jest ich łatwość uczenia się. W przypadku
metod dyskryminacyjnych wyznaczenie wag jest dużo trudniejsze: aby jak najskuteczniej
wyławiać spam, trzeba sprawdzić wiele zestawów wag przypisanych słowom i zależnych od
kontekstu. Na szczęście badacze zrobili w tej dziedzinie istotne postępy. Algorytmy, takie jak
Sequential Minimal Optimization opracowany przez Johna C. Platta z Microsoftu
czy zaproponowany przez Goodmana Sequential Conditional Generalized Iterative Scaling
(SCGIS), są dziesiątki, a nawet setki razy szybsze od swoich poprzedników. A większa
wydajność algorytmów ma kluczowe znaczenie, gdy trzeba poradzić sobie z milionami e-
maili i setkami tysięcy wag.

Od początku wiadomo było, że strategie oparte na uczeniu maszynowym i analizie słów
wiadomości będą wystawione na próbę polegającą na zniekształcaniu wyrazów. Spamerzy
zauważyli, że mogą napisać "0PŁATA" (zastępując literę "O" cyfrą zero) albo skorzystać
z możliwości języka znaczników HTML (hypertext markup language) i podzielić słowa na
części (np. "kl" i "iknij", zamiast "kliknij"). Usunięcie z tekstu charakterystycznych wyrazów
"opłata" i "kliknij" może zakłócić działanie filtru. Na szczęście techniki uczenia
maszynowego pozwalają rozpoznać takie sztuczki i dostosowują do nich swe działanie.

Niesłusznie założono, że niewiele osób zechce odpowiadać na niechciane e-maile, które
przedarły się przez filtr antyspamowy. Kupujący nielegalne produkty wcale nie oczekują,
że sprzedawcy będą je reklamować w sposób zgodny z prawem. Dlatego trzeba było
zmodyfikować systemy, uzupełniając je o tzw. n-gramy. Pozwalają one analizować sekwencje
wyrazów, poszukując w nich słów kluczowych charakterystycznych dla spamu. Na przykład
jeżeli w liście elektronicznym znajdzie się wyrażenie "n@gie l@ski", skonstruowany dla
niego n-gram będzie zawierać elementy takie jak "<spacja>n@g", "n@gi", "@gie" itd.
Ponieważ takie fragmenty wyrazów występują w wiadomościach, które niewątpliwie są
spamem, ich znalezienie stanowi dla programu filtrującego ważną wskazówkę.

N-gramy zwiększają skuteczność filtrów także w odniesieniu do tekstów obcojęzycznych.
W chińskim czy japońskim nie występują na przykład spacje, które oddzielają wyrazy,
ułatwiając rozpoznawanie ich znaczenia. N-gramy umożliwiają analizowanie każdego słowa
lub jego fragmentu.


                                               5
Spamerzy ukrywają swój przekaz również pod postacią obrazu, uniemożliwiając analizę jego
zawartości (chociaż nadal można wyciągać wnioski na jej temat z podanych w niej linków,
informacji o reputacji nadawcy itd.). Nadzieję na wyeliminowanie tej odmiany spamu dają
techniki optycznego rozpoznawania znaków (OCR - optical character recognition).
Technologia OCR używana do skanowania dokumentów umożliwia znajdowanie
i odczytywanie napisów w obrazie. Tekst następnie przesyła się do filtru antyspamowego.

Jedną z najbardziej agresywnych form spamu są odnajdowane w skrzynkach pocztowych
obrazy o treści pornograficznej. Na szczęście specjaliści w dziedzinie przetwarzania obrazów
zrobili olbrzymie postępy w automatycznym rozpoznawaniu pornografii. Podejmowane są
wysiłki na dużą skalę ze względu na konieczność zabezpieczenia dzieci przed dostępem do
stron internetowych o tematyce seksualnej oraz zamiar odcięcia osób rozpowszechniających
pornografię od bezpłatnych serwerów. Niestety, rozpoznawanie obrazów nadal jest operacją
czasochłonną, której skuteczność pozostawia wiele do życzenia. Za pornografię bywają
uznawane na przykład nieszkodliwe zdjęcia przedstawiające fragmenty odsłoniętego ciała.

Zastanawiając się, jak rozpoznać spam, analizujemy też dane o uniwersalnym lokalizatorze
zasobu - URL (universal resource locator) - czyli adresie identyfikującym strony WWW
i inne elementy Sieci. Adres URL pojawia się w 95% spamu, ponieważ głównym celem
większości jego nadawców jest zachęcenie adresatów do odwiedzin ich witryn internetowych
(tylko niewielka grupa spamerów proponuje inny rodzaj kontaktu, np. telefoniczny). Dlatego
też dane zawarte w URL są dogodnym celem działania programów zabezpieczających przed
niechcianą pocztą.

Filtr może wykorzystać te informacje na wiele różnych sposobów. Niektórzy dostawcy usług
sieciowych zaczęli już blokować e-maile zawierające linki do witryn związanych ze spamem.
Również odwołania do nieznanych wcześniej domen należy traktować jako podejrzane.
Domeny tworzone przez spamerów zwykle funkcjonują krótko, podczas gdy adresy godne
zaufania - przez długi czas. Z drugiej strony sam fakt pojawienia się w wiadomości adresu
URL jest cenną wskazówką przy ocenie, czy dana wiadomość jest, czy nie jest spamem.
Najprawdopodobniej nie są nim listy zawierające odwołania tylko do stron o ustalonej
renomie albo nie zawierające takich odnośników.

Metody polegające na filtrowaniu są dość skuteczne, ale nie miejmy złudzeń, że spamerzy nie
będą podejmować próby ich obejścia. Zamiast uczestniczyć w nieustannej rywalizacji, na


                                             6
dłuższą metę korzystniej byłoby odpowiednio zmodyfikować reguły gry. Dlatego rozważa się
wprowadzenie systemów weryfikacji, które będą wymagały od spamerów spełnienia tak
trudnych kryteriów, że przestanie to być opłacalne.

Początkowo spam rozsyłano, wpisując ręcznie adresy odbiorców. Dziś jest on wysyłany
najczęściej przez automaty. Jeżeli zatem nadawcą jest człowiek, to list najprawdopodobniej
nie jest spamem. Takie spostrzeżenie wykorzystywały pierwsze systemy weryfikacji
zaproponowane przez Moniego Naora z Instytutu Weizmanna w Izraelu. Naor opracował
procedury weryfikacji "udziału człowieka" nazywane czasem HIP (human interactive proof),
"w pełni automatyczny test Turinga odróżniający komputer od człowieka" CAPTCHA
(completely automated public Turing test to tell computers and humans apart)
czy tzw. odwrotne testy Turinga. Mówiąc najprościej, HIP to zadanie lub zagadka łatwe do
rozwiązania przez człowieka, ale bardzo trudne dla komputera. Dobrym przykładem jest
rozpoznawanie liter, których obraz został częściowo przesłonięty lub zniekształcony.

Za pomocą testów HIP można sprawdzić, czy e-mail został wysłany przez człowieka. Przed
dostarczeniem wiadomości system sprawdza obecność jej autora na ukrytej liście zaufanych
nadawców. Jeżeli autor jest na liście, wiadomość trafia od razu do adresata. Jeżeli nie - do
nadawcy jest przesyłany test HIP. Dopiero po jego poprawnym rozwiązaniu wiadomość
umieszczana jest w skrzynce pocztowej adresata.

Oczywiście użytkownicy mogą uznać taki interaktywny system za irytujący. Mało kto,
wysyłając list, ma ochotę rozwiązywać zagadki. Alternatywny, całkowicie automatyczny
mechanizm kontrolny, który opracowali Naor i Cynthia Dwork, opiera się na zadaniach
obliczeniowych. Dostarczenie wiadomości jest uwarunkowane wykonaniem przez program
pocztowy nadawcy zadania przesłanego przez system adresata. Nadawca musi wykazać,
że przeznaczył na wysłanie pojedynczego listu więcej czasu, niż jest to możliwe w przypadku
spamera. Wspomniane zagadki obliczeniowe trudno rozwiązać, ale łatwo sprawdzić. Z reguły
ich rozwikłanie wymaga wielu sekund, a nawet minut pracy procesora. Chcąc skrócić ten
czas, spamerzy musieliby korzystać z wielu komputerów, co podniosłoby koszty
rozpowszechniania wiadomości powyżej opłacalnego poziomu.

Można też wprowadzić pieniężny system weryfikacji. Wyobraźmy sobie, że do każdego e-
maila dołączamy czek elektroniczny opiewający na małą kwotę, powiedzmy, 1 centa, który
otwiera drogę przez antyspamowe filtry. Jeżeli wiadomość nie jest spamem, odbiorca nie


                                               7
realizuje czeku. W przeciwnym razie adresat może go spieniężyć (lub przeznaczyć na cele
charytatywne). Specjalne oprogramowanie uniemożliwiałoby nadawcy wysłanie e-maili
w liczbie większej niż wynikająca ze stanu konta. Dla zwykłych nadawców takie rozwiązanie
pozostawałoby całkowicie bezpłatne, ale dla spamerów opłata 1 centa za list, mniej więcej
100 razy wyższa od obecnych kosztów, byłaby nie do przyjęcia. Niewielki depozyt na
wirtualnych kontach indywidualnych użytkowników wnosiliby (po wliczeniu go w cenę)
dostawcy usług internetowych albo producenci oprogramowania. Dla większości z nas takie
rozwiązanie nie pociągałoby za sobą żadnych dodatkowych kosztów.

Pomimo przejrzystej koncepcji system opłat niełatwo zrealizować. Tak jak inne systemy
elektroniczne wymagałby nadzoru, a więc jego użytkowanie nie byłoby bezpłatne. Bez
odpowiedzi pozostaje też wiele pytań o szczegóły rozliczeń. Skąd mają pochodzić pieniądze
na działanie systemu? Jak mają być realizowane operacje i kto miałby czerpać z nich
korzyści? Kto pobierałby opłaty i jak zapobiegano by ewentualnym nadużyciom? Chociaż
każdy z tych problemów można rozwiązać, realizacja całego pomysłu jest kłopotliwa.

Dobrym rozwiązaniem jest przyjęcie strategii łączącej proste filtrowanie poczty oraz wiele
zróżnicowanych systemów weryfikacji: testów HIP, zadań obliczeniowych i mikropłatności.
W przypadku, gdy nadawca nie znajduje się na liście zaufania, e-mail jest kierowany do
"agresywnego" filtru antyspamowego wykorzystującego metody uczenia maszynowego.
Jeżeli pojawi się choćby cień podejrzenia, nadawca zostanie sprawdzony pozostałymi
metodami. Oczywiście większość listów przesyłanych między ludźmi (a nie rozsyłanych
między wyspecjalizowanymi programami - przyp. red.) nie będzie sprawdzana wszystkimi
metodami, co ograniczy do minimum liczbę niezbędnych weryfikacji. Nadawca ma do
wyboru rozwiązanie testu HIP, wykonanie zadania obliczeniowego albo zapłacenie
mikrokaucji. Jeżeli na jego komputerze zainstalowane zostanie odpowiednie
oprogramowanie, będzie mogło ono przystąpić automatycznie do rozwiązywania zadania
obliczeniowego, nie zaprzątając uwagi człowieka. W przeciwnym razie użytkownik musi
poddać się testowi HIP albo złożyć mikrokaucję.

Niezależnie jak firmy czy instytucje są potężne, nie mogą zrobić wiele więcej, by uwolnić się
od spamu. Rozwiązania kompleksowe wymagają współdziałania wszystkich
zainteresowanych stron - producentów komputerów, oprogramowania, a także rządów.




                                              8
Mniej więcej dwie trzecie krążących dzisiaj w Sieci e-maili pochodzi ze spreparowanych,
nieprawdziwych adresów. Używane obecnie protokoły pocztowe oparto na zasadzie zaufania:
nadawcy przedstawiają się, a odbiorcy im wierzą. Takie rozwiązanie sprawdzało się
w początkach Internetu, zanim rozprzestrzenił się spam i zanim pocztę elektroniczną zaczęto
wykorzystywać w celach komercyjnych.

Dokonywanie zmian w standardach internetowych jest zadaniem trudnym, a w przypadku
protokołów pocztowych szczególnie uciążliwym. Na szczęście projektując nowy standard,
którego podstawą jest identyfikator nadawcy Sender-ID, zwrócono uwagę na zjawisko
podszywania się oszustów pod cudze komputery w Sieci. Proponowane rozwiązanie polega
na uzupełnieniu wpisów w serwerach nazw DNS (domain name server) o adresy IP
uprawnione w danej domenie do wysyłania poczty elektronicznej. Uzupełniony DNS
domeny, powiedzmy, o nazwie "przyklad.com" - zawiera listę komputerów mających prawo
do wysyłania poczty elektronicznej. IP komputera należącego do spamera spoza domeny
"przyklad.com" nie będzie zatem odpowiadać żadnemu wpisowi na liście legalnych
nadawców tej domeny. Program pocztowy z łatwością rozpozna wiadomości wysłane
bezprawnie.

Możliwość identyfikacji nadawcy jest zasadniczym krokiem w kierunku wyeliminowania
takich nadużyć, jak "phishing", czyli prób wyłudzania ważnych danych osobistych. Samo
rozpoznawanie adresów IP nie rozwiązuje jednak problemu spamu. Nic nie powstrzyma
spamerów przed dokonywaniem - nawet co kilka minut - zmian tożsamości. Dlatego też
będzie rosło znaczenie usług uwierzytelniających pozwalających nadawcom na udowodnienie
swej wiarygodności. Taką właśnie procedurę pozwala przeprowadzić na przykład program
Bonded Sender firmy Iron Port. Jego użytkownicy deponują pewną kwotę jako kaucję
gwarancyjną: jeżeli skargi na nich formułowane przez innych użytkowników poczty
elektronicznej przekroczą pewien ustalony poziom, kaucja zostanie przekazana na cel
charytatywny. Filtry antyspamowe mają dostęp do listy użytkowników programu Bonded
Sender i umożliwiają doręczenie ich e-maili, mimo że ich treść budzi podejrzenia. Programy
tego typu są użyteczne nawet dla osób wysyłających niewiele listów. Z systemów
uwierzytelniających mogą również skorzystać tacy dostawcy usług internetowych, jak MSN
czy AOL. Na podstawie liczby wysyłanych e-maili i częstości reklamacji upewnią się,
że żaden z ich klientów nie jest spamerem.




                                             9
Jeżeli większość przestrzegających prawa użytkowników Internetu zaakceptuje taką strategię
(a trudno znaleźć argumenty przemawiające przeciwko tej propozycji), filtry antyspamowe
będą znacznie brutalniej obchodzić się z pozostałymi e-mailami, eliminując przeważającą
część niechcianej korespondencji. Pozostali użytkownicy Sieci nie ucierpią na tym, ponieważ
systemy uwierzytelniające mogą współpracować z systemami weryfikującymi.

Działaniem dopełniającym byłaby zmiana ustawodawstwa. W Stanach Zjednoczonych
w styczniu 2004 roku weszła w życie ustawa CAN-SPAM. Nie zdelegalizowała wysyłania
spamu, ale zakazała szczególnie bezczelnych zachowań w Sieci - na przykład podszywania
się pod innego nadawcę. Niestety, na razie trudno dostrzec skutki jej działania. Odkąd
obowiązuje, odsetek spamu generowanego przez nadawców-oszustów wzrósł z 41% do 67%.
Bardziej rygorystyczne prawo europejskie zakazuje wysyłania wiadomości zawierających
oferty komercyjne bez uzyskania wcześniejszej zgody adresata (w Polsce od marca 2003 roku
obowiązuje "Ustawa o świadczeniu usług drogą elektroniczną" -). Przyjęte regulacje
częściowo odniosły pozytywny skutek, ponieważ przynajmniej duże firmy zaprzestały
wysyłania spamu.

Oczywiście żadne prawo obowiązujące w jednym tylko państwie nie rozwiąże problemu.
Zaledwie połowa wszystkich niechcianych e-maili jest wysyłana w Stanach Zjednoczonych,
reszta pochodzi z innych krajów. Sprzedawca tylko co trzeciego produktu oferowanego za
pośrednictwem spamu (np. ubezpieczeń czy kredytów refinansujących) musi mieć siedzibę na
terytorium USA. Inne podejrzane interesy, w szczególności związane z pornografią, handlem
ziołowymi eliksirami, są prowadzone z zagranicy, mogą się tam w każdej chwili przenieść
albo są po prostu nielegalne.

Przyszłość bez spamu?

Jak wyeliminować spam? Problemem tym zajmują się nieustannie przemysł, ruchy wolnego
oprogramowania (free and open source software) i środowisko akademickie. Na pierwszej
oficjalnej konferencji poświęconej tematowi poczty elektronicznej i spamu, która zgromadziła
naukowców z całego świata, inżynierowie z IBM wyjaśnili, jak można wykorzystać
technologie bioinformatyczne opracowane z myślą o analizie genów do rozpoznawania
prawidłowości w spamie. Naukowcy z AOL wykazali skuteczność wielopoziomowych
systemów rozpoznawania znaków szczególnych wyposażonych w zestawy różnych
słowników. Zespół z University of California w Davis udowodnił, że dodając do treści e-


                                             10
maila kilka często powtarzających się słów, można skutecznie zaatakować inteligentne filtry.
Wskazał też, jak "wyszkolić" filtry, aby stały się bardziej odporne na podobny atak.

Miejmy nadzieję, że połączenie dzisiejszych technik i metod następnych generacji zatriumfuje
w końcu nad spamem. Oczywiście zawsze znajdzie się paru spamerów, ale wartki strumień
niechcianej poczty elektronicznej bez wątpienia uda się zamienić w strużkę.

Źródło: Świat Nauki




                                              11
2. Cel projektu

Celem projektu było pokazanie różnych metod rozpoznawania spamu a także sposobów walki
ze spamerami. Większość sposobów została opisana we Wprowadzeniu.




3. Narzędzia

Do stworzenia systemu posłużyliśmy się następującymi technologiami:
   - HTML
   – CSS
   - JavaScript
   - PHP
   - MySQL




4. Zasada działania systemu

Stworzony przez nas system opiera się na następujących metodach wykrywania spamu:



1. Przefiltrowanie tematu i treści wiadomości pod kątem słów uznanych za występujące w
treści spamu.
2. Zabezpieczenie przed próbą obejścia filtru słownikowego poprzez analizę użytych znaków
alfanumerycznych mogących zastąpić litery w słowach (zamiana "0" na "o", "@" na "a" itp).




                                            12
5. Opis okienek

Logowanie




       Chcąc korzystać z systemu musisz się zalogować. Wpisz własny identyfikator w pole
„Name” oraz hasło w pole „Pass”, następnie kliknij przycisk „OK”.
Jeżeli nie posiadasz jeszcze własnego identyfikatora kliknij odnośnik „Zarejestruj się!”.
Twoim oczom ukaże się poniższy formularz rejestracyjny:




                                              13
Po wypełnieniu wszystkich pól kliknij „Rejestruj”. Jeżeli nie popełniłeś błędu powinieneś
zobaczyć poniższy komunikat:




Następnie kliknij „Wróć!” aby powrócić do ekranu logowania. Teraz, gdy posiadasz już swój
identyfikator oraz hasło możesz zalogować się do systemu.




Wysyłanie wiadomości

Po zalogowaniu się zobaczysz poniższy formularz:




Po lewej stronie ekranu znajduje się lista zarejestrowanych użytkowników systemu. Trzeba
wiedzieć iż wiadomości możemy wysyłać tylko do zarejestrowanych w systemie osób, czyli
do użytkowników widocznych na liście.

Aby wysłać wiadomość należy wypełnić wszystkie pola formularza. W pole „Do” należy
wpisać użytkownika z listy „Użytkownicy”, do którego chcemy wysłać wiadomość. W polu
„Temat” wpisujemy temat wiadomości, a w polu „Tresc” – treść wiadomości. Po wypełnieniu
formularza należy kliknąć przycisk „Wyślij”. Jeżeli wszystko zostało wykonane prawidłowo,
zobaczysz komunikat „Wiadomość wysłana”.




                                             14
Odbieranie wiadomości

Po zalogowaniu się zobaczysz poniższy formularz:




Jeżeli na twoim koncie znajdują się wiadomości od innych użytkowników, zostaniesz o tym
powiadomiony poprzez niebieski lub czerwony komunikat pod formularzem wysyłania
wiadomości(patrz rysunek powyżej). Komunikat składa się z następujących informacji:

          Nadawca wiadomości : Temat wiadomości – Data wysłania wiadomości

Kolor komunikatu informuje cię, czy wiadomość została sklasyfikowana przez system
antyspamowy jako normalna wiadomość, czy też jako spam.
- kolor niebieski : normalna wiadomość
- kolor czerwony : spam

Komunikaty wyświetlone są według daty wysłania wiadomości.




Aby odczytać wiadomość należy kliknąć na komunikat, stanowiący jednocześnie odnośnik do
wiadomości. Po kliknięciu na interesujący cię komunikat – otworzy się nowe okno
przeglądarki, a w nim zobaczysz tabelkę, podobną do tej pokazanej na następnej stronie:




                                             15
Wiersze tabelki oznaczają kolejno:

 - Temat wiadomości oraz data otrzymania wiadomości
 - Nadawca wiadomości
 - Treść wiadomości
 - Numer identyfikacyjny wiadomości oraz informacja czy dana wiadomość została
sklasyfikowana jako spam, czy też nie.




6. Opis działania systemu antyspamowego

Za rozpoznawanie spamu odpowiedzialna jest klasa „Agent”. Przechowuje ona w swoich
zmiennych temat i treść odbieranej wiadomości oraz wartość klasyfikującą wiadomość jako
spam lub nie. Posiada też wbudowaną funkcję wewnętrzną, która operuje na zmiennych treść
i temat w następujący sposób:
- treść wiadomości dzielona jest na wyrazy, które zostają wpisane do tablicy
- do drugiej tablicy zostają wpisane słowa pobrane z zewnętrznego pliku, stanowiącego
słownik wyrazów używanych w wiadomościach uważanych za spam
- dla każdego wyrazu z tablicy treści wiadomości wykonywane są instrukcje warunkowe
sprawdzające kody ASCII znaków. Wielkie litery zamieniane są na małe, a znaki mogące w
spamie zastąpić litery – zamieniane na litery(np. „@” na „a”, „0” na „o” itp.).
- po zamianie liter i znaków na litery, każde słowo z tablicy treści wiadomości jest w pętli
porównywane do kolejnych wyrazów tablicy słów zew. pliku
- w przypadku dopasowania słów zostaje nadana wartość klasyfikującą wiadomość jako
spam




                                              16
7. Kod źródłowy klasy „Agent”

<?php

class agent {

 var $trescmaila;
 var $nadawca;
 public $spam;

function agent($trescmaila,$nadawca)
    {
    $this->trescmaila=$trescmaila;
    $this->nadawca=$nadawca;
    }

public function wykryjspam()
    {
    $this->trescmaila = explode(" ", $this->trescmaila);
    $d=0;
    $i=0;
    $a=0;
    while ($this->trescmaila[$i]!="")
       {
       $i++;
       $a++;
       }
    $wyrazy = file('slownik.txt');
    for ($i=0;$i<=$a;$i++)
       {
       foreach ($wyrazy as $wiersz)
          {
          $wiersz = rtrim($wiersz);
          $slowo = $this->trescmaila[$i];
          $j=0;
          while ($slowo[$j]!="")
             {
              // Zamiana wielkich liter na małe:
              if ( (ord($slowo[$j])>64) && (ord($slowo[$j])<91) )
$slowo[$j] = chr(ord($slowo[$j])+32);
              // Zamiana znaczka @ na a:
              if ( ord($slowo[$j])==64 ) $slowo[$j] = chr(97);
              // Zamiana 0 na o:
              if ( ord($slowo[$j])==48 ) $slowo[$j] = chr(111);
              // Zamiana znaczka 1 na l:
              if ( ord($slowo[$j])==49 ) $slowo[$j] = chr(108);
              // Zamiana znaczka | na i:
              if ( ord($slowo[$j])==124 ) $slowo[$j] = chr(105);
               $j++;
               }
          if ($wiersz == $slowo ) $this->spam = 1;
          if ($wiersz == $this->trescmaila[$i] ) $this->spam=1;
          }
       }
    }
}
?>




                                       17
8. Dodatki

Dodatek A - Kod strony logowania

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body bgcolor="#ffffff">
<?php
include ("config.inc.php");
include ("functions.inc.php");
if ($errors == 0) error_reporting(0); else error_reporting(1);
?>
<br><br>
<h1 align="center" style="color:#000000">SI - Rozponawanie Spamu</h1>
<br><br><br><br><br>
<form action="message.php" method="post">
<table align="center" width="200" border="0" cellspacing="3"
cellpadding="0">
   <tr>
     <td align="right"><div class="login">Name:</div></td>
     <td align="left"><input type="text" name="username" size="14"></td>
         <td></td>
   </tr>
   <tr>
     <td align="right"><div class="login">Pass:</div></td>
     <td align="left"><input type="password" name="pass" size="14"></td>
         <td><button type="submit">OK</button></td>
   </tr>
   <tr>
     <td colspan="3" align="right"><a href="zarejestruj.php"
class="login">Zarejestruj sie!</a></td>
   </tr>
</table>
</form>
</body>
</html>




Dodatek B - Kod strony rejestrowania

<?php
include ("config.inc.php");
include ("functions.inc.php");
if ($errors == 0) error_reporting(0); else error_reporting(1);
if($true == 1) {
        if ($pass == $pass_w ) {
                if ($user != "") {
                        connect();
                        select_db();
                        $pass = md5($pass);




                                    18
                       $sql = "INSERT INTO users(username,password)
VALUES('$user','$pass')";
                       $result = mysql_query($sql);
                       $errno = mysql_errno();
                       $error = mysql_error();

                       if ($errno == 1062) echo "<center>Taki uzytkownik
juz istnieje!</center>";

                       if ($mysql_errors == 1) {
                               print ("<b>$errno:</b> ");
                               print ("$error<BR>");
                       }

               } else echo "<center>Wpisz nazwe uzytkownika!</center>";
       } else echo "<center>Hasla sa rózne!</center>";

        if($result) {
                echo "<center><b>Uzytkownik dodany do bazy.</b><br><a
href=\"index.php\">Wróc!<a></center>"; }
                else echo "<b><center>Nie udalo sie dodac nowego
uzytkowinka!</b><br><a href=\"index.php\">Wróc!<a></center>";
        mysql_free_result ($result);

         disconnect();
}
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body bgcolor="#ffffff">
<br>
<h1 align="center" style="color:#000000">Rejestracja</h1>
<br>
<form action="zarejestruj.php" method="post">
<table align="center" width="1" border="0" cellspacing="3" cellpadding="0">
   <tr>
     <td align="right" nowrap="nowrap"><div class="login">Podaj nazwe
uzytkowinika:</div></td>
     <td align="left"><input type="text" name="user" size="21"></td>
   </tr>
   <tr>
     <td align="right" nowrap="nowrap"><div class="login">Podaj
haslo:</div></td>
     <td align="left"><input type="password" name="pass" size="21"></td>
   </tr>
   <tr>
     <td align="right" nowrap="nowrap"><div class="login">Powtórz
haslo:</div></td>
     <td align="left"><input type="password" name="pass_w" size="21"></td>
   </tr>
   <tr>
     <td colspan="2" align="right"><input type="hidden" name="true"
value="1"><button type="reset">Resetuj</button><button
type="submit"><b>Rejestruj</b></button></td>
   </tr>
</table>
</form>
</body>
</html>



                                     19
Dodatek C - Kod strony wysyłania wiadomości

<?php
include ("agent.php");
include ("config.inc.php");
include ("functions.inc.php");
if ($errors == 0) error_reporting(0); else error_reporting(1);
//error_reporting(E_ALL);
connect();
select_db();

session_start();
if ($username && $pass) {
        $sql = "SELECT * FROM users WHERE username='$username'";
        $result = mysql_query($sql) or die(mysql_error());
        $row = mysql_fetch_array($result);

        if ($username == $row["username"] && md5($pass) ==
$row["password"]) {
        $_SESSION['user'] = $username;
        $_SESSION['auth'] = "True";

} else {
           echo "Niepoprawna nazwa użytkownika lub hasło";
           $_SESSION['auth'] = "False";
}
}


?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2" />
<title>Message</title>
<link href="style.css" type="text/css" rel="stylesheet">
<SCRIPT LANGUAGE="JavaScript">

function pokaz(adres) {
noweOkno = window.open(adres, 'pokaz', 'menubar=no, toolbar=no,
location=no, scrollbars=yes, resizable=yes, status=no, width=620,
height=200');
noweOkno.focus();
}

</script>
</head>
<body bgcolor="#ffffff">
<table width="100%" border="0">
  <tr>
    <td valign="top"><b>Użytkownicy:</b><br>

<?
       if ($_SESSION['auth'] == "True"){
               $sql = "SELECT username FROM users ORDER BY username ASC";
               $result = mysql_query($sql) or die(mysql_error());
               while ($row = mysql_fetch_array($result)){
                       $name = $row['username'];
                       print "$name<br>";
               }



                                       20
       }
?>
       </td>
       <td>
<?
if ($_SESSION['auth'] == "True"){
if ($adresat && $temat && tresc){
        $sql = "SELECT id FROM users WHERE username='$_SESSION[user]'";
        $result = mysql_query($sql) or die(mysql_error());
        $row = mysql_fetch_array($result);
        $user_s_id = $row[id];

       $sql = "SELECT id FROM users WHERE username='$adresat'";
       $result = mysql_query($sql) or die(mysql_error());
       $row = mysql_fetch_array($result);
       $user_r_id = $row[id];

               if ($user_r_id) {
                       $date = date("Y-m-d H:i:s");
                       $sql = "INSERT INTO
message(user_r_id,user_s_id,topic,message,date,spam)
VALUES('$user_r_id','$user_s_id','$temat','$tresc','$date','0')";
                       $result = mysql_query($sql) or die(mysql_error());
                       if ($result) echo "Wiadomość wysłana!";

               } else echo "Nieznany odbriorca!";
} else if ($submit == "True") echo "Wypełnij wszystkie pola!";
?>

         <form action="message.php" method="post">
<table align="center" border="0" cellspacing="3" cellpadding="0">
   <tr>
     <td>Do:</td>
     <td><input type="text" width="320" maxlength="20" name="adresat" ></td>
   </tr>
   <tr>
     <td>Temat:</td>
     <td><input type="text" width="320" maxlength="60" name="temat" ></td>
   </tr>
   <tr>
     <td>Tresc:</td>
     <td><textarea name="tresc" cols="50" rows="5"></textarea></td>
   </tr>
   <tr>
     <td colspan="2" align="right"><button type="submit" name="submit"
value="True">Wyslij</button></td>
   </tr>
</table>
</form>
         </td>
   </tr>
</table>
<br>
<?
}
         $sql = "SELECT id FROM users WHERE username='$_SESSION[user]'";
         $result = mysql_query($sql) or die(mysql_error());
         $row = mysql_fetch_array($result);
         $user_s_id = $row[id];




                                     21
       $sql = "SELECT * FROM message WHERE user_r_id = '$user_s_id'";
       $result = mysql_query($sql) or die(mysql_error());

        while($row = mysql_fetch_array($result)){
                $sqlr = "SELECT username FROM users WHERE id =
'$row[user_r_id]'";
                $resultr = mysql_query($sqlr) or die(mysql_error());
                $rowr = mysql_fetch_array($resultr);

               $sqls = "SELECT username FROM users WHERE id =
'$row[user_s_id]'";
               $results = mysql_query($sqls) or die(mysql_error());
               $rows = mysql_fetch_array($results);


                $message = nl2br($row[message]);


                $tresc=$message;
                $temat=$row[topic];
                $nadawc=$rows[username];
                //$spam=0;

                $wiadomosc=new agent($tresc,$nadawc);
                $wiadomosc->wykryjspam();
//              if ($wiadomosc->spam==1) echo 'sadzac po tresci to jest
spam<br>';

                $wiadomosc2=new agent($temat,$nadawc);
                $wiadomosc2->wykryjspam();
                //echo $wiadomosc->data;
//              if ($wiadomosc2->spam==1) echo 'sadzac po temacie to jest
spam<br>';

                if (($wiadomosc->spam == 1)||($wiadomosc2->spam == 1)) $spam
= "Tak"; else   $spam = "Nie";

               if ($spam == "Tak") {
                               print ("<table align=\"center\" width=\"600\"
border=\"0\" cellspacing=\"0\" cellpadding=\"2\">
                               <tr>
                               <td><a class=\"spam\"
href=\"javascript:pokaz('pokaz.php?id=$row[id]&spam=$spam')\"><b>$rows[user
name]: </b>$row[topic] - <i>$row[date]</i></a></td>
                               </tr>");
               } else {
                               print ("<table align=\"center\" width=\"600\"
border=\"0\" cellspacing=\"0\" cellpadding=\"2\">
                               <tr>
                               <td><a class=\"wiad\"
href=\"javascript:pokaz('pokaz.php?id=$row[id]&spam=$spam')\"><b>$rows[user
name]: </b>$row[topic] - <i>$row[date]</i></a></td>
                               </tr>");
               }
        }

disconnect();
echo $cos;
?>
</body>
</html>



                                     22
Dodatek D - Kod strony odbierania wiadomości(pop-up window)

<?php
include ("config.inc.php");
include ("functions.inc.php");
if ($errors == 0) error_reporting(0); else error_reporting(1);
connect();
select_db();

                 $sqlr = "SELECT * FROM message WHERE id = $id";
                 $resultr = mysql_query($sqlr) or die(mysql_error());
                 $row = mysql_fetch_array($resultr);

               $sqls = "SELECT username FROM users WHERE id =
'$row[user_s_id]'";
               $results = mysql_query($sqls) or die(mysql_error());
               $rows = mysql_fetch_array($results);


                 $message = nl2br($row[message]);

               print ("<table align=\"center\" width=\"600\" border=\"1\"
cellspacing=\"0\" cellpadding=\"1\">
                         <tr>
                               <td>Temat: $row[topic] - $row[date];</td>
                         </tr>
                         <tr>
                               <td>Nadawca: $rows[username]</td>
                         </tr>
                         <tr>
                               <td>$message</td>
                          </tr>
                          <tr>
                               <td>ID: $row[id] Spam: $spam</td>
                          </tr>
                       </table><br> ");
disconnect();
?>



Dodatek E - Kod pliku CSS

BODY {
         background-color:#FFFFFF;
         margin-top:0px;
         margin-bottom:0px;
         margin-left:0px;
         margin-right:0px;
}

A.wiad:link {
        font-size:14px;
        font-family:Arial, Helvetica, sans-serif;
        color: #0000ff;
        text-decoration:none;
}

A.wiad:hover {


                                      23
       font-size:14px;
       font-family:Arial, Helvetica, sans-serif;
       color: #0000ff;
       text-decoration:none;
}

A.wiad:visited {
        font-size:14px;
        font-family:Arial, Helvetica, sans-serif;
        color: #0000ff;
        text-decoration:none;
}

A.spam:link {
        font-size:14px;
        font-family:Arial, Helvetica, sans-serif;
        color: #ff0000;
        text-decoration:none;
}

A.spam:hover {
        font-size:14px;
        font-family:Arial, Helvetica, sans-serif;
        color: #ff0000;
        text-decoration:none;
}

A.spam:visited {
        font-size:14px;
        font-family:Arial, Helvetica, sans-serif;
        color: #ff0000;
        text-decoration:none;
}



Dodatek F – Kody pozostałych plików

config.inf.php:
<?php
$mysql_host = "localhost";
$mysql_user = "fd";
$mysql_pass = "0913";
$mysql_db   = "si";

$errors = 1;
$mysql_errors = 0;
?>

functions.inc.php:
<?php
function connect() {
        global $mysql_host;
        global $mysql_user;
        global $mysql_pass;

        $mysql_connect = mysql_connect($mysql_host, $mysql_user,
$mysql_pass);
        $errno = mysql_errno();
        $error = mysql_error();



                                     24
       global $mysql_errors;
       if ($mysql_errors == 1) {
                      print ("<b>$errno:</b> ");
                      print ("$error<BR>");
       }
}
function select_db() {
        global $mysql_db;
        mysql_select_db($mysql_db);
        $errno = mysql_errno();
        $error = mysql_error();
        global $mysql_errors;
        if ($mysql_errors == 1) {
                       print ("<b>$errno:</b> ");
                       print ("$error<BR>");
        }
}
function disconnect() {
        global $mysql_connect;
        mysql_close();

       $errno = mysql_errno();
       $error = mysql_error();

       global $mysql_errors;
       if ($mysql_errors == 1) {
                      print ("<b>$errno:</b> ");
                      print ("$error<BR>");
       }
}
?>

sql.txt:
use si;

CREATE TABLE users (
id             INT(111) NOT NULL auto_increment,
username       VARCHAR(255) NOT NULL default '',
password       VARCHAR(255) NOT NULL default '',
PRIMARY KEY (id),
UNIQUE (username),
INDEX (username)
);


CREATE TABLE message (
id             INT(111) NOT NULL auto_increment,
user_r_id      INT(111) NOT NULL default '',
user_s_id      INT(111) NOT NULL default '',
topic          VARCHAR(64) NOT NULL default '',
message        MEDIUMTEXT NOT NULL,
date           DATETIME NOT NULL default '',
spam           INT(1) NOT NULL default '',
PRIMARY KEY (id),
INDEX (user_r_id, user_s_id)
);




                                    25

				
DOCUMENT INFO
Shared By:
Categories:
Stats:
views:94
posted:4/16/2010
language:Polish
pages:26