Pisanie własnych reguł – część II

Dziś dalsza część o pisaniu własnych reguł. W w części pierwszej było o zasadzie zero dziś podstawy z wyrażeń regularnych Perla. Potężne narzędzie i dość skomplikowane na szczęście aby je używać w spamassassinie nei trzeba znać ich bardzo dobrze, ponieważ wystarczą podstawy.

Czym są wyrażenia regularne (RegExp)? Nie chodzi o dokładną definicje, powiedzmy, że opisem ciągu tekstowego. Możemy zdefiniować wyrażenie które będzie pasowało do wielu wersji tekstu. Przykłady to lepiej wyjaśnia. Chcemy sprawdzić czy e tekście występuje slowo Adam. Wyrażenie regularne wygląda
/Adam/

i pasuje ono do ciągów: ‚Adam’, ‚Adamowski’, ‚bardzo zły Adam‚. ‚Adamowicz’. itd. Od razu należy nadmienić ze regexpy rozróżniają wielkość liter o czym nalezż pamiętać. /Adam/ nie będzie pasować do słowo preadamita bo nie ma wielkiego A.

Jak to działa? Maszyna wyrażen regularnych zaczyna szukanie przed pierwszym znakiem tekstu. To ważne bo można wstawić znacznik, aby text był na początku. I pożniej próbuje dopasować tekst. Jak nie uda się idzie dalej i po kolei dopasowuje(próbuje). Aż do końca albo do dopasowanie. A co jak mamy tekst Adam z cyfrą na końcu? Trzeba 9 wyrażeń regularnych? Otóż nie. Mówimy znajdź Adam i cyfrę. Wygląda to tak

/Adam\d/

znacnzik \d oznacza 1 cyfrę. I już możemy dopasować Adam1,Adam0,Adam1998. W ostatnim przykładzie zostanie dopasowane pierwsza cyfra. takich klas znaków jest trochę

. Dowolny znak z wyjątkiem znaku nowej linii
\d Dowolna cyfra
\D Dowolna znak nie będący cyfrą
\s Dowolny biały znak
\S Dowolny znak nie będący białym znakiem
\w Dowolny znak alfanumeryczny (litera lub cyfra) lub znak _
\W Dowolny znak nie będący znakiem alfanumerycznym

Ważny jest symbol kropki , pasuje do każdego znaku. A co jeśli chcemy dopasować kropkę? trzeba użyć symbolu \

/\./

oznacza dopasowanie kropki.. Oprócz tego możemy sami definiować znaki

[a-z] oznacza male litery, [A-Z} wielkie litery, [A-Za-z] male i wielkie, [a-z.] oznacza male i kropkę(w klasach znaku nie musimy dodawać  przed kropką))

A co z ilością powtórzeń? Sa od tego kwantyfikatoiry które oznaczają

Kwantyfikator Dopasowanie
* 0 lub więcej wystąpień
+ 1 lub więcej wystąpień
? 0 lub 1 wystąpienie
{m} dokładnie m wystąpień
{m,} co najmniej m wystąpień
{,n} co najwyżej n wystąpień
{m,n} od m do n wystąpień
[…] jeden znak spośród zbioru znaków
[^…] jeden znak spoza zbioru znaków
A | B dopasowanie A lub B, operator alternatywy jest zachłanny

 

I tyle wystarczy do pisania reguł do spamassassina. I ostatnie. Rgexpy rozróżniaja wielkośc liter jak chcemy to wyłączyć używamy znacznika i

/adam/i     będzie pasować do Adam adam, AdAm itd

Przykłady

Jest sobie temat maila który składa się ze słowa Wezwanie do zapłaty i cyferki np

Wezwanie do zaplaty 2016/03/00345 wyrażenie regularne będzie wyglądać następująco:

/Wezwanie do zaplaty \d\d\d\d\/\d\d\/\d\d\d\d\d/ w ten sposób określiliśmy dokładnie ile ma być cyfr. A co jeśli się zmieni liczba cyfr? wtedy reguła nie spasuje i spam przejdzie. Trzeba to uogólnić:

/Wezwanie do zaplaty \d+\/\d+\/\d+/ między znakami / może wystapić dowolna liczba cyfr (ale co najmniej jedna). Która jest lepsza? Pierwsza jest wycelowana dokładnie w jeden rodzaj spamu i nie wychwyci delikatnej zmiany. druga uogólniona może wychwytywać dobre maile(w końcu wezwanie do zapłaty może być w mailu). Ten przykład zostanie rozbudowany w następnej częsci.Możemy sie bawić w dawanie większej ilości spacji miedzy wyrazami

/Wezwanie +do +zaplaty +\d+\/\d+\/\d+/ czyli wystepuje 1 lub więcej spacji. ale można iśc dalej i zamiast spacji dać białe znaki

/Wezwanie\s+do\s+zaplaty\s+\d+\/\d+\/\d+/ hmmm i wszystko gra tylko czym bardziej komplikujemy wyrażenie regularne tym ono jest dłużej przetwarzane. regexpy są wydajne ale wykonują się w czasie wiekszym jednak od zera:)

Kilka uwag:

  • jeśli jest kropka to piszmy \. a nie sam znak . Oba spasują lecz szybciej będzie sprawdzony znak \.
  • zapisując rok w postaci 4 cyfr można napisac : \d\d\d\d jak i \d{4}, jak dla mnie czytelniejszy jest pierwszy zapis który jest samodokumentujący się
  • pamietajmy ze dodanie znacnzika /i (brak rozróżnienia wielkości liter) spowalnia proces. Nieraz to niezbędne ale uzywajmy tam gdzie naprrawdę potrzeba.
  • polskie litery jak chcemy zaznaczyć można /.{1,8}/ w różnych kodowaniach spasuje

Warto poczytać o tym zagadnieniu ale jak ktoś nie zna wyrażeń wystarcza podstawy. Pamiętajmy, że SA używa wersji Perla.W następnych częściach będzie o tym i nie tylko:)

Każdy może poszukać w necie materiałów na ten temat. Dobry startem jest strona podstawy wyrażeń (wystarczy skończyć na zachłannosci operatorów). Ale oólnie polecam zaznajomienie jest tym ciekawym narzędziem

 

9 thoughts on “Pisanie własnych reguł – część II

  1. Od jakiegos czasu szukam rozwiazania w ww temacie, ale choc
    „Świstak mówi; niemożliwe”,
    to moze sie myle i jest rozwiazanie tematu ?

    Jest taka domena spamerska .instytutmarketingu.
    To, ze na poczatku i na koncu to juz cuda i wianki, to pol biedy 🙂 ale aby sie ukryc, a pozostac w ulubionym wyrazeniu, wstawiaja znaki w srodek tego zwrotu. np .instytutmarke-tingu. insty_tutmarketingu.
    Nie dalo by sie tej slabosci zapisac dla przyszlych ich poczynan ?

  2. ha !
    Jak to dobrze sie zapytac – wowczas odpowiedz szybko (przy|na)chodzi
    🙂
    jak komus dokuczaja to moja regula, jak nie dokuczaja to i tak polecam 🙂 rozwiazanie na czas kiedy znaki po sylabach tylko wstawiaja 🙂

    #instytutmarketingu
    body ZABOJCASPAMU_INSTYTUTMARKETINGU /\.in(|.)sty(|.)tut(|.)mar(|.)ke(|.)tin(|.)gu\./i
    describe ZABOJCASPAMU_INSTYTUTMARKETINGU spam reklamowy
    score ZABOJCASPAMU_INSTYTUTMARKETINGU 10

    1. czyli sposob na viagre:) ilez bylo sposobow aby poprzestawiac litery i oni tez moga w nieskonczonosc. Prosciej bedzie szukać adresu IP ich serwera poczty 212.91.7.33 w polu received. oczywiscie dopoki go nie zmienia

      1. z tym IP to nie jest juz zadna prawda, maja ich w cholere, a jak dotad trzymaja sie tej zasranej nazwy i w tym nadzieja,
        ostatnio z 81… i 84… i 87 …
        W logach mam np w ciagu 4 minut 3 maile z 3 roznych IP
        Mam nadzieje, ze po wymysleniu powyzszego zapisu – bede mial ich z glowy na jakis czas !

          1. Mają SPFa:) tym nie rozbawili. Bo ktoś móglby sie pod nich podszyć:)
            instytutmarketingu.com descriptive text „v=spf1 ip4:199.193.6.51 +a +mx +ip4:104.219.248.62 +ip4:104.219.248.63 +ip4:104.219.248.64 +ip4:104.219.248.65 +ip4:104.219.248.66 +ip4:104.219.248.67 include:_spf.redlink.pl -all”
            $ host -t txt _spf.redlink.pl
            _spf.redlink.pl descriptive text „v=spf1 a mx ip4:91.230.36.0/23 ip4:178.249.92.0/28 ip4:185.70.36.0/23 ip4:185.100.228.0/22 ~all”

  3. ha ha zabawne faktycznie !
    ze tez od razu na to nie wpadlem ! i to jaka duza pula IP
    usmiech po pachy !
    no ale widzisz moj spf wyglada inaczej bo badalem z kreska – a trzeba bedzie obadac wszystkie kreski ??

    „v=spf1 ip4:81.219.253.192/26 ip4:5.226.102.16/29 ip4:87.204.106.40/29 ip4:87.204.106.48/28 ip4:87.204.106.64/27 ip4:87.204.106.96/29 ip4:213.241.51.192/27 ip4:213.241.51.160/28 ip4:213.241.67.112/28 +all”

    a juz widze np ip 212.91.7.33 dla instytutmarketingu.pl. 212.91.6.58
    a tych koncowek bylo juz troche z kreskami i bez
    NA wszystkie na razie lapia sie z nowo wymyslonym zapisem ! tak dlugo jak dlugo beda trzymac sie tej nazwy mam ich od dzisiaj z glowy !

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *