devblog, portfolio

movie producer, zend framework, php, jquery pluginy



jQuery, PHP: Ochrona adresów e-mail

Przy okazji tworzenia serwisu guitarway.pl pojawiła się potrzeba chronienia adresów e-mail, które w niektórych miejscach są wyświetlane nawet dla niezalogowanych. Oznacza to, że również dla botów. Wiadomo nie od dziś, że dla "inteligentnych" botów zamiana kropki na (dot), a małpy na (at) nie jest zabezpieczeniem. Aby dobrze chronić dane naszych użytkowników postanowiłem stworzyć skrypt, który będzie "rozkodowywał" wcześniej odpowiednio "zakodowane" adresy e-mail. Efekty przedstawiam tutaj.

JavaScript

Wiadomą sprawą jest, że tego typu zabezpieczenia wykonuje się zazwyczaj korzystając z języka javascript, ponieważ jest on wykonywany po stronie przeglądarki i boty sobie z nim nie radzą (tak jak pajączki wyszukiwarek internetowych). Skoro mam już tworzyć kod js, to muszę zadbać o to, żeby był on jak najbardziej profesjonalny. Postanowiłem więc napisać dodatek do biblioteki jQuery.

Samo tworzenie dodatków opiszę w oddzielnym artykule, bo jest to dość obszerny temat. Teraz opiszę mały plugin, który stworzyłem.

Kod znajduje się na listingDump  - (listing 1). Plugin testowałem korzystając z jQuery 1.6.1, ale jestem pewien, że będzie działał także z najstarszymi wersjami biblioteki.

Jak to działa?

W linii ósmej tworzę obiekt zawierający domyślne ustawienia. Jeśli korzystający z tego dodatku nie ustawi swoich w parametrze options zostaną użyte właśnie te. Z reguły jednak definiujemy przynajmniej code, który zawiera ciąg znaków, które trzeba usunąć z "zakodowanego" adresu e-mail. Domyślnie jest to __DELETE__. W linii 13 tworzymy nowy obiekt o nazwie opts. Dane w nim są połączeniem defaults i options. Funkcja jQuery.extend działa tak, że łączy podane jako parametry obiekty w jeden. Odbywa się to w takiej kolejności w jakiej zostały one podane. To znaczy, że u nas najpierw w obiekcie opts znajdą się wszystkie elementy defaults, a następnie zostaną do niego dodane wszystkie elementy obiektu options. Jeśli element o danym kluczu już istnieje, to zostanie nadpisany. Tak więc, jeśli nie zostanie podane któreś z ustawień, to jego wartość będzie taka jak ustawiona w defaults.

Dalej wykorzystuję funkcję jQuery.each, aby dokonać zamaiany ciągów podanych w opts.code we wszystkich wybranych elementach. Pojawiają się tam znane wszystkim funkcje obiektu String. Na koniec wymieniam ciąg zawarty w danym elemencie na ten, w którym nie występują już żadne "śmieci". Jeśli w options dodamy wartość link: true, to zostanie dodany odpowiedni link.

Co dalej z emailProtector?

Jest to bardzo prosty dodatek, jednak jego ograniczona funkcjonalność w zupełności mi wystarczyła. Nie oznacza to jednak, że nie będę doskonalił swojego dzieła. A ponieważ js jest dla mnie takim oderwaniem się od codziennego "kodzenia", to możecie spodziewać się, że niedługo uczynię emailProtector bardziej elastycznym i zaawansowanym pluginem jQuery. Na pewno podzielę się na tym blogu efektami :)

Genrator śmieci w php

Ale powróćmy do naszego zadania, czyli chronienia adresów e-mail. Napisałem również funkcję, która doda "śmietnik" do wybranego przez nas ciągu znaków. Ponieważ jak już wspominałem na problem zabezpieczania adresów e-mail natknąłem się przy pracy nad guitarway.pl, to funkcję przetwarzającą nasz adres e-mail, na mało wartościowy dla botów kod uczyniłem metodą klasy sf_filter należącą do Spawn Framework. Poprawka ta znajdzie się w mojej modyfikacji Spawn.

Kod samej funkcji możecie zobaczyć na listingDump - (listing 2).

Sama funkcja jest dość dobrze opisana w komentarzach (wolę ten sposób ;)

Podczas korzystania z tego zestawu zalecam zmianę dodawanego ciągu na jakiś inny. Skoro stworzyliśmy już taką "armatę" przeciw botom, to niech ciąg znaków także będzie jakiś zaawansowany ;) Przestrzegam jednak przed znakami: /, #, @. Rozpoczynają one i kończą wyrażenia regularne, a metody obiektu String (javascript) jako argument mogą takie wyrażenie przyjąć. Wtedy może być "klapa" :) Osobiście zalecam jakiś ciąg znaków zakodowany w md5.

Kamil www Opera/9.80 (Windows NT 5.1; U; pl) Presto/2.9.168 Version/11.50

Można dużo prościej: http://superuser.com/questions/235937/does-e-mail-address-obfuscation-actually-work :-)

Kacper Kołodziej www Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.112 Safari/535.1

Można, ale zauważ, że w każdym z przypadków także trzeba użyć jakiegoś skryptu php i js.

Kamil Brenk www Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/15.0.849.0 Safari/535.1

Wejdź pod podany adres i przekonaj się, że najlepiej sprawdzającymi się technikami są te z wykorzystaniem CSS :-)

CSS Codedirection 0 MB

moc.elpmaxe@zyx


CSS display:none 0 MB
xyzfoo@example.com

Kacper Kołodziej www Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.112 Safari/535.1

Czy nie rozumiesz mojej uwagi. Żeby odwrócić wpisany przez użytkownika adres tak, żeby był pisany od prawej do lewej, musisz użyć jakiegoś skryptu. Podany adres odwiedziłem i widziałem te rozwiązania. Kiedy wpisujesz adres samemu, możesz sobie ręcznie odwrócić adres, ale zwykłego użytkownika chyba nie zamierzasz tym obarczać. Nie wiem skąd mają diagram skuteczności, ale jeśli ja bym tworzył bota, to korzystałbym ze źródła HTML i display: none nie byłoby dla mnie problemem. Co do codedirection, to myślę, że to może być najskuteczniejsza metoda. Jednak zaprezentowałem swoją. Uważam, że jest ona na tyle dobra, by mogła funkcjonować z powodzeniem w wielu projektach.

lisek Mozilla/5.0 (Windows NT 6.1; rv:7.0.1) Gecko/20100101 Firefox/7.0.1

też kiedyś się w to bawiłem, tylko zamiast dorzucania śmieci przesuwałem każdy znak na zmianę o 2, 3 i 4, i od nowa. Czyli "mailto" stawało się "odlnws" czy jakoś tak. No i znikały też małpy i kropki. A cudzysłowy i nawiasy trójkątne były "poza zasięgiem" w tablicy ASCII dla typowego adresu e-mail nawet z zamienionymi znakami.

Dodaj komentarz »