← Previous · All Episodes · Next →
İstenmeyen Otomatik E-postalarla (Spam) Mücadele Planı (A Plan for Spam) Episode 5

İstenmeyen Otomatik E-postalarla (Spam) Mücadele Planı (A Plan for Spam)

· 40:52

|
"Paul Graham'ın 2002'de yazdığı bu makale, içerik tabanlı filtrelerin spam e-postaları durdurabileceğini savunuyor. Graham, spamların belirli özelliklerini tanımlamak yerine, her bir kelimenin spam olma olasılığını Bayes teoremi ile hesaplamanın daha etkili olduğunu belirtiyor. Bu yaklaşımın, spamın evrimine ayak uydurabileceğini ve spam gönderenlerin mesajlarını masum e-postalarla ayırt edilemez hale getirmeleri gerektiğini ifade ediyor. Ayrıca, bu makalede Graham, spam filtreleme tekniklerini daha da geliştirmek için bazı öneriler sunuyor.

---

# İstenmeyen Otomatik E-postalarla (Spam) Mücadele Planı (A Plan for Spam)

Ağustos 2002

_(Bu makale, Arc ile oluşturduğumuz spam konusunda dayanıklı web tabanlı e-posta okuyucumuzun kullandığı spam filtreleme yöntemlerini anlatıyor. Daha İyi Bayesian Filtreleme adlı yazıda ise daha gelişmiş bir algoritma anlatılmaktadır.)_

Spam, her birimizin hayatında bir noktada karşılaştığı bir sorun. Ancak ben, spam'ı durdurmanın mümkün olduğuna inanıyorum. Evet, doğru duydunuz. İnanıyorum ve bunun için içerik tabanlı filtrelerin kullanılması gerektiğini düşünüyorum. Çünkü spammerların zayıf noktası mesajlarıdır. Ne kadar engel koyarsanız koyun, onların mesajlarını iletme zorunluluğu vardır. Eğer mesajlarını tanıyan bir yazılım yazabilirsek, bunu aşmanın bir yolu olmayacak.

---

Spam, alıcısı için kolayca ayırt edilebilir bir şey. Eğer postalarınızı okuyup spam olanları ayıklamak üzere birini işe alırsanız, onun bu işi yaparken hiç zorlanmayacağına emin olabilirsiniz. Peki, yapay zeka kullanmadan bu işlemi nasıl otomatikleştirebiliriz ve bunun için ne kadar uğraşmalıyız?

Benim düşünceme göre, bu sorunu oldukça basit algoritmalar kullanarak çözebiliriz. Hatta, bizzat deneyimlerim, bireysel kelimelerin spam olasılıklarını Bayes'in teoremiyle birleştirerek, günümüzün spam maillerini kabul edilebilir bir seviyede filtreleyebildiğimizi gösterdi. Küçük bir ayarlama yaparak kullandığımız Bayes filtresiyle, spam maillerin yalnızca 1000'de 5'ini kaçırıyoruz ve yanlış alarm verme oranımız sıfır.

İstatistiksel yaklaşım, genellikle insanların spam filtreleri yazarken ilk tercih ettikleri yöntem olmaz. Çoğu hacker'ın ilk içgüdüsü, spamın bireysel özelliklerini tanıyabilecek bir yazılım yazmaktır. Spam maillere baktığınızda, ”Bu adamların yüzü kızarmadan bana 'Sevgili Dostum' diye başlayan ya da sadece büyük harflerle yazılmış ve sekiz ünlemle biten bir konu satırı içeren mail göndermeye çalışmalarına bakar mısınız?"" diye düşünürsünüz. Ben bu tür mailleri tek bir kod satırıyla hemen elemeye alabilirim.

Ve işte böylece başlıyorsunuz ve başlangıçta işler yolunda gidiyor. Birkaç basit kural, gelen spamlerin büyük bir kısmını engellemenize yardımcı olur. Sadece ""tıkla"" kelimesini aramak bile, spam kutumda bulunan e-postaların %79.7'sinin tespit edilmesini sağlar, yanıltıcı sonuçlar ise sadece %1.2'dir.

Yaklaşık altı ay boyunca, spam'ların belirgin özelliklerini tespit eden bir yazılım üzerinde çalıştım, tüm bunları istatistiksel bir yaklaşım denemeden önce yaptım. Ancak gördüm ki, spam'ların son birkaç yüzdesini doğrulamak oldukça zorlaşıyor ve filtreleri sıkılaştırdıkça yanlış alarm sayısı artıyordu.

Yanlış pozitifler, aslında spam olmayan e-postaların yanlışlıkla spam olarak nitelendirilmesidir. Çoğu kullanıcı için, gerçekten önemli bir e-postayı kaçırmak, spam almakla kıyaslanmayacak kadar kötüdür. Yani, yanlış pozitif sonuç veren bir filtre, hasta için ölüm riski taşıyan bir sivilce ilacına benzer.

Kullanıcı ne kadar çok spam alırsa, spam klasöründe bekleyen masum bir e-postayı fark etmesi o kadar zor olur. İlginç bir şekilde, spam filtreleriniz ne kadar iyi olursa, yanlış pozitif sonuçlar da o kadar tehlikeli olur. Çünkü filtreler çok iyi çalıştığında, kullanıcılar yakaladıkları her şeyi yok saymaya daha meyilli olurlar.

Neden istatistiksel yaklaşımı denemekten bu kadar uzun süre kaçındığımı bilemiyorum. Sanırım, kendim spam özelliklerini belirlemeye çalışırken, sanki spam gönderenlerle bir yarış içindeymişim gibi hissetmiş olabilirim. (Çoğu kişi bunu bilmez ama hackerlar genellikle oldukça rekabetçidir.) İstatistiksel analizi denediğimde ise, benimkinden çok daha zeki olduğunu hemen anladım. Tabii ki ""Virtumundo"" ve ""teens"" gibi ifadelerin spam için iyi belirleyiciler olduğunu hemen buldu. Ancak ""per"", ""FL"" ve ""ff0000"" gibi ifadelerin de aslında spam için iyi belirleyiciler olduğunu keşfetti. Hatta ""ff0000"" (parlak kırmızının html kodu) herhangi bir pornografik terim kadar iyi bir spam belirleyicisi olarak çıktı.

---

İstatistiksel filtrelemeyi nasıl yaptığımı biraz anlatayım. Başlangıçta bir yığın spam ve bir yığın spam olmayan e-postam bulunuyor.Her bir kümede yaklaşık 4.000 mesaj bulunuyor. Ben de bu mesajları tek tek tarıyorum, başlıklarından, gömülü HTML ve JavaScript kodlarına kadar her şeyi inceliyorum. Şu anda alfanumerik karakterleri, tireleri, kesme işaretlerini ve dolar işaretlerini 'token' olarak kabul ediyorum. Diğer her şey ise 'token' ayıracı olarak görülüyor. (Bu konuda belki daha da iyileştirme yapabiliriz, ne dersiniz?) Sadece rakamlardan oluşan 'token'ları görmezden geliyorum, aynı şekilde HTML yorumlarını da dikkate almıyorum, hatta onları bile 'token' ayıracı olarak kabul etmiyorum.

Her bir metindeki her kelimenin (büyük-küçük harf ayrımı yapmadan) kaç defa geçtiğini sayıyorum. Bu aşamada, her bir metin için kelime ve geçiş sayılarını eşleştiren iki büyük tablo elde ediyorum.

Sonra üçüncü bir hash tablosu oluşturuyorum. Bu sefer her bir 'token'ı, içinde bulunduğu bir e-postanın spam olma ihtimaline bağlıyorum. Bu ihtimali şu şekilde hesaplıyorum: 
```
(let ((g (* 2 (or (gethash word good) 0))) 
      (b (or (gethash word bad) 0))) 
  (unless (< (+ g b) 5) 
    (max .01 (min .99 (float (/ (min 1 (/ b nbad)) (+ (min 1 (/ g ngood)) (min 1 (/ b nbad)))))))))
```
Burada 'word', hesapladığımız olasılığın 'token'ı, 'good' ve 'bad' ise ilk adımda oluşturduğum hash tablolarını temsil ediyor. 'ngood' ve 'nbad' ise sırasıyla spam olmayan ve spam mesajların sayısını ifade ediyor.

Birkaç önemli ayrıntıyı göstermek için bunu bir kod şeklinde açıklıyorum. Yanıltıcı sonuçları önlemek için olasılıkları biraz çarpıtmak istiyorum ve deneme yanılmayla, 'iyi' kategorisindeki tüm sayıları iki katına çıkarmak bunun için iyi bir yöntem olduğunu fark ettim. Bu, nadiren meşru e-postalarda görülen kelimelerle hemen hemen hiç görülmeyen kelimeler arasında ayrım yapmayı kolaylaştırıyor. Sadece toplamda beş kez veya daha fazla geçen kelimeleri dikkate alıyorum (aslında, sayıları iki katına çıkardığım için, istenmeyen postada üç kez geçmesi bile yeterli olacaktır). Sonra, bir metinde geçen ama diğerinde geçmeyen kelimelere ne tür bir olasılık atayacağımızı belirlememiz gerekiyor. Deneme yanılma yoluyla, .01 ve .99 oranlarını seçtim. Belki burada biraz daha ayarlama yapmak mümkün olabilir, ancak metinler büyüdükçe bu ayarlama zaten otomatik olarak gerçekleşecektir.

Özellikle dikkatli olanlar, belki de bir detayı gözden kaçırmıyor olabilirler: bir kelimenin kaç kere geçtiğini sayarken, her bir metin yığınını tek bir uzun metin gibi görüyorum. Ancak, spam olasılıklarını hesaplarken toplam metin uzunluğunu değil, her bir e-postanın sayısını bölen olarak kullanıyorum. İşte bu küçük ayrıntı, yanlış pozitif sonuçları önlemek için ekstra bir önlem olarak karşımıza çıkıyor.

Yeni bir e-posta geldiğinde, onu parçalara ayırıyoruz ve bu parçaların en ilginç olan on beş tanesini, spam olma olasılıklarının ne kadar nötr olan .5 değerinden farklı olduğuna dayanarak, e-postanın spam olup olmadığını belirlemek için kullanıyoruz. Eğer 'probs' dediğimiz şey, bu on beş parçanın tek tek olasılıklarının bir listesi ise, onların toplam olasılığını şu şekilde hesaplıyoruz: 
```
(let ((prod (apply #'* probs))) 
  (/ prod (+ prod (apply #'* (mapcar #'(lambda (x) (- 1 x)) probs))))) 
```

Pratikte karşılaşılan bir soru ise, daha önce hiç görmediğimiz bir kelimeye hangi olasılığı atamamız gerektiği. Deneme yanılmayla, .4 değerinin bu tür kelimeler için iyi bir seçim olduğunu buldum. Daha önce karşılaşmadığınız bir kelime genellikle masum olma eğilimindedir; çünkü spam kelimeler genellikle aşina olduğumuz kelimelerdir.

Bu algoritmanın gerçek e-postalara uygulama örneklerini, yazının sonundaki ekte bulabilirsiniz.

Eğer bahsettiğim algoritma, bir e-postanın spam olma ihtimalini %90'dan fazla gösteriyorsa, ben o e-postayı spam olarak kabul ediyorum. Ama aslında bu eşiği nereye koyduğum çok da önemli olmuyor çünkü çoğu kez olasılıklar bu aralığın ortasında yer almıyor.

---

İstatistiksel yaklaşımın en büyük avantajlarından biri, sayısız spam okumanızı gerektirmemesidir. Son altı ayda, gerçekten binlerce spam okudum ve bu durum insanı aşırı derecede moral bozucu oluyor.""Norbert Wiener, eğer kölelerle yarışırsanız sonunda kendinizin de bir köle olacağını söylemişti."" Bu söz, sadece kölelikle ilgili bir felsefi düşünceyi ifade etmiyor, aynı zamanda spam gönderenlerle yarışmanın da insana benzer şekilde aşağılık bir his verdiğini belirtiyor. Spam'lerin özelliklerini anlamak için spam gönderenlerin zihniyetine girmeniz gerekiyor ve dürüst olmak gerekirse, spam gönderenlerin zihinlerinde geçireceğim süreyi olabildiğince azaltmak istiyorum.

Bayesci yaklaşımın gerçek avantajı, neyi ölçtüğünüzü tam olarak bilmeniz. Özellik tanıma filtreleri, mesela SpamAssassin, bir e-postaya belirli bir 'spam puanı' verir. Bayesci yaklaşımda ise bir e-postaya net bir olasılık değer atarsınız. 'Puan' kavramının problemi, ne anlama geldiğini tam olarak kimsenin bilememesi. Kullanıcı ne anlama geldiğini bilemez ve daha da kötüsü, filtre geliştiricisi de ne anlama geldiğini tam olarak bilemez. Bir e-posta, içinde 'sex' kelimesi bulunduğu için kaç puan almalı? Bir olasılık değeri hatalı olabilir ama ne anlama geldiği konusunda çok az belirsizlik vardır ve kanıtların nasıl birleştirilip hesaplanacağı da oldukça net. Örneğin, benim veri tabanıma göre 'sex' kelimesi, bir e-postanın spam olma olasılığını %97 olarak gösterirken, 'sexy' kelimesi ise %99 olasılık gösteriyor. Ve Bayes'in Kuralları da, çok net bir biçimde, her iki kelimeyi de içeren bir e-postanın spam olma şansının (eğer başka hiçbir kanıt yoksa) %99.97 olduğunu söylüyor.

Bayes yaklaşımı, olasılıkları ölçerken e-postadaki tüm delilleri, yani hem olumlu hem de olumsuz tüm unsurları dikkate alır. Spam e-postalarda orantısız bir şekilde ""nadiren"" görülen kelimeler (örneğin ""ne var ki"", ""bu akşam"" veya ""anlaşılan"" gibi kelimeler) olasılığı düşürmekte, ""abonelikten çık"" ve ""katılın"" gibi tipik spam kelimeleri ise olasılığı arttırmaktadır. Yani, içinde sadece ""seks"" kelimesi bulunan fakat başka konuları da içeren bir e-posta, otomatik olarak spam olarak etiketlenmez.

Elbette, ideal olan her kullanıcı için olasılıkların ayrı ayrı hesaplanmasıdır. ""Lisp"" kelimesini içeren bir sürü e-posta alıyorum ve (şimdilik) hiç spam almadım. Bu yüzden, ""Lisp"" gibi bir kelime, bana e-posta göndermek için bir tür şifre gibi işlev görüyor. Eski spam filtreleme yazılımımda, kullanıcılar bu tür kelimeleri bir liste oluşturabilir ve bu kelimeleri içeren e-postalar otomatik olarak filtrelerden geçebilirdi. Ben de kendi listeme ""Lisp"" ve posta kodum gibi kelimeler ekledim, böylece online alışverişlerimden gelen (genellikle spam gibi görünen) faturalar filtreden geçebilirdi. Kendimi oldukça zeki sanıyordum, ancak sonra Bayesian filtresinin benim için aynı işi yaptığını ve dahası benim düşünemediğim birçok kelimeyi bulduğunu fark ettim.

Başlangıçta filtrelerimizin her 1000 spamden sadece 5'ini yanıltıcı olmayan bir şekilde geçirdiğini söylediğimde, kendi e-postalarımın bir toplamına dayanarak e-postalarımı filtrelemekten bahsediyorum. Ama bu rakamlar yanıltıcı değil, çünkü benim savunduğum nokta tam olarak bu: her kullanıcının e-postalarını, ona ulaşan spam ve spam olmayan e-postalar temel alınarak filtrelemeliyiz. Esasında, her kullanıcının iki tür silme butonu olmalı: normal silme ve spam-olarak-silme. Spam olarak silinen her şey spam veri tabanına eklenir ve geri kalan her şey spam olmayan veri tabanına gider.

Kullanıcıları bir başlangıç filtresi ile yola çıkarabilirsiniz, ama sonuçta her kullanıcının, kendisine gelen gerçek e-postalar temelinde, her kelime için kendi olasılıklarını belirlemesi gerektiğini unutmayın. Bu durum (a) filtrelerin daha etkin çalışmasını sağlar, (b) her kullanıcının 'spam'ı kendi tanımlamasına olanak verir ve belki de (c) en güzeli, spam gönderenlerin filtreleri aşmasını zorlaştırır.E-posta filtrelerinin dünyasına hoş geldiniz! Bu dünya, spam gönderenlerle savaşan ve biz kullanıcıların gelen kutularını temiz tutmaya çalışan birçok farklı filtre türünü içeriyor. Ama bir dakika, filtrelerin beyni neresi? Evet, doğru tahmin ettiniz, **kişiselleştirilmiş veri tabanları**. Ancak, spam gönderenlerin sadece başlangıç filtrelerini aşmak için e-postalarını düzenlemesi, bu e-postaların her kullanıcının kişiye özel ve çok daha iyi eğitilmiş filtrelerinden ne kadar başarılı bir şekilde geçeceği konusunda bir garantisi olmayacaktır.

İçerik bazlı spam filtreleme genellikle, filtrelemeye gerek duyulmayan kişilerin listesi olan bir **beyaz liste** ile birleştirilir. Bu beyaz listeyi oluşturmanın kolay bir yolu, kullanıcının daha önce e-posta gönderdiği her adresi bir liste halinde tutmaktır. Eğer e-posta okuyucunuzda bir 'spam olarak sil' butonu varsa, kullanıcının sıradan çöp olarak sildiği her e-postanın gönderen adresini de beyaz listeye ekleyebilirsiniz.

Beyaz listelerin savunucusuyum ama bu daha çok hesaplama işlemlerinden tasarruf etmek için, filtrelemeyi geliştirmek amacıyla değil. Önceden, beyaz listelerin e-posta filtrelemeyi kolaylaştıracağını düşünürdüm. Çünkü sadece tanımadığınız kişilerden gelen e-postaları filtrelemeniz gerekecekti ve biri size ilk kez e-posta gönderirken ne söyleyebileceği genelde sınırlı olurdu. Tanıdığınız biri size seks hakkında e-posta atabilir ama ilk kez e-posta gönderen biri bunu yapmayacaktır. Ancak sorun şu, insanların birden fazla e-posta adresi olabilir. Bu yüzden yeni bir gönderen adresi, gönderenin size ilk kez yazıyor olmasını garanti etmez. Özellikle hacker olan bir eski dostunuzun, birdenbire yeni bir e-posta adresinden size e-posta göndermesi gayet olasıdır. Bu yüzden, bilinmeyen adreslerden gelen e-postaları kesinlikle filtrelemek yanıltıcı sonuçlara neden olabilir.

Bir anlamda, filtrelerim aslında bir çeşit beyaz liste (ve kara liste) oluşturuyor çünkü başlıkları dahil tüm mesajları temel alıyorlar. Bu yüzden güvendiğim kişilerin e-posta adreslerini ve hatta postaların bana nasıl geldiğini ""biliyorlar"". Aynı şekilde, spam e-postalar hakkındaki bilgileri de biliyorlar. Yani spam e-postaların hangi sunuculardan geldiğini, hangi mailer versiyonlarını kullandığını ve hangi protokollerle gönderildiğini biliyorlar.

---

Eğer mevcut spam filtreleme oranlarını sürdürebileceğime inanıyor olsaydım, bu sorunu çözülmüş sayardım. Ancak bugünkü spamlerin çoğunu filtreleyebiliyor olmak çok da büyük bir başarı sayılmaz çünkü spamler sürekli bir evrim içindedirler. Hatta şimdiye kadar geliştirilen birçok antispam teknikleri, yeni ve daha dirençli bir böcek türü yaratmaktan başka bir işe yaramayan bir böcek ilacı gibidir.

Bayes filtreleri konusunda daha umutluyum çünkü spam'le birlikte evrimleşiyorlar. Öyle ki, spamcılar bireysel kelime bazlı basit spam filtrelerini aşmak için ""cock"" yerine ""c0ck"" kullanmaya başladığında, Bayes filtreleri durumu otomatik olarak fark ediyor. Hatta, ""c0ck"" ifadesi ""cock""tan çok daha güçlü bir delil oluşturuyor ve Bayes filtreleri bu farkı tam olarak ne kadar olduğunu biliyor.

Ancak elbette, herhangi bir spam filtreleme planı yürütürken şu soruya cevap vermek zorundasınız: eğer spam yapanlar tam olarak ne yaptığınızı bilseydi, sizin engellerinizi ne kadar iyi aşarlardı? Mesela, eğer kontrol toplamına dayalı spam filtrelemesi ciddi bir engel oluşturursa, bence spamcılar hemen mesaj metinlerini oluşturmak için kelime oyunlarına dayalı tekniklere başvururlar.

Bayesian filtrelerini aşmak için, spamcıların e-postalarını benzersiz yapmak ya da belirli kelimeleri kullanmamak yeterli olmaz. E-postalarını sıradan postalarınızdan ayırt edilemez hale getirmeleri gerekiyor. Bence bu, onları büyük ölçüde kısıtlayacak. Spamler genellikle satış teklifleridir, dolayısıyla normal postalarınız tamamen satış teklifleriyle dolu değilse, spamlerin farklı bir karakteri olması kaçınılmazdır. Ve tabii ki, spamcıların tüm altyapılarını değiştirmesi ve bu değişikliği sürdürmesi gerekecek. Çünkü aksi takdirde, mesajın içeriğinde ne kadar değişiklik yaparlarsa yapsınlar, başlıklar Bayesian filtrelerine hala kötü görünecek.Spamcıların hangi taktikleri kullandığını tam olarak bilemeyebiliriz, ama bir e-posta başlığını masum göstermek, mesajı masum göstermekten daha zor olabilir. 

Gelecekte spam mailleri hakkında biraz düşünelim. Eğer e-posta başlıklarını çözebilirsek, muhtemelen şöyle bir şey göreceğiz: ""Merhaba! Şuna bir göz atmanı öneririm: http://www.27meg.com/foo."" İçerik tabanlı filtreleme, spamcıların bu tür satış tekliflerini yapmalarına izin verecek. (Aslında, filtrelerden geçirmek bile zor olacak. Çünkü e-postanın geri kalanı nötr olduğunda, spam olasılığı URL'ye dayanacak ve bunu nötr göstermek biraz çaba gerektirecek.)

Spam gönderenler, kimliklerini saklamayan ve sözde ""opt-in"" listeleri yöneten firmalardan, pornografik siteleri tanıtmak için e-posta sunucularını kaçıran kişilere kadar çeşitlilik gösterir. E-postalarını filtrelemeyi kullanarak seçeneklerini yukarıdaki gibi mesajlara indirgersek, bu durum ""meşru"" spam gönderenleri büyük ölçüde iş dışı bırakmalıdır. Çünkü birçok eyalet yasası gereği, spamlerinin aslında spam olmadığını ve ""aboneliğinizi"" nasıl iptal edeceğinizi açıklamak zorundalar. İşte bu tür metinler kolayca fark edilir.

(Eskiden, daha sıkı yasaların spam miktarını azaltacağına inanmanın naif bir düşünce olduğunu düşünürdüm. Ancak şimdi, daha sert yasaların spamcıların gönderdiği spam miktarını azaltmayacağını kabul ediyorum ama bu yasaların, alıcıların gerçekten gördüğü spam miktarını azaltmada filtrelemeye yardımcı olacağına inanıyorum.)

Tüm spektrumda, spamların yapabileceği satış tekliflerini sınırlarsanız, kaçınılmaz olarak onları iş yapamaz hale getirebilirsiniz. Burada 'iş' kelimesi aklınızda kalmalı. Spamcılar aslında iş adamlarıdır. Spam gönderiyorlar çünkü bu işe yarıyor. İyi tarafından bakılırsa, yanıt oranı çok düşük (en iyi ihtimalle milyonda 15, katalog postası için milyon başına 3000'e karşı) ama onlara maliyeti neredeyse hiç yok. Alıcılar için maliyet oldukça yüksek, her milyon alıcı spam'i silmek için bir saniye harcadığında bu toplamda yaklaşık 5 adam-hafta eder, ancak spam gönderenler bu maliyeti ödemek zorunda değiller.

Ancak spam göndermek, spamcılara da belirli bir maliyet oluşturuyor. [2] Dolayısıyla, yanıt oranını ne kadar düşürebilirsek -ister filtreleme, ister spamcıları tekliflerini seyreltmek zorunda bırakarak- spam göndermeyi planlayan o kadar az işletme, bu işlemi maliyetine değer bulacak.

Spamcıların bu çeşit satış vaatlerini kullanmalarının sebebi, alınan yanıtların sayısını artırmaktır. Bu durum belki de bir spamcının aklının içine girmekten daha tüyler ürpertici olabilir, ama hadi gelin bir de spam mesajlarına yanıt veren bir kişinin düşüncelerine hızlıca bir göz atalım. Bu kişi ya inanılmaz derecede saf ya da cinsel ilgilerini derinden inkar ediyor olmalı. Her iki durumda da, bize itici ya da saçma gelen spam mesajları, onlar için heyecan verici. Spamcılar bu tür ifadeleri kullanmazlardı eğer onlar heyecan verici olmasaydı. Ve ""aşağıdakilere bir göz atmanızı öneriyorum"" cümlesi, şu an spamcıların kullandıkları cümleler kadar spam alıcısını çekemez. Sonuç: Eğer heyecan verici satış vaatleri içermezse, spam pazarlama aracı olarak etkisini yitirir ve daha az işletme tarafından kullanılmak istenir.

İşte bu, sonunda büyük kazanç olacak. Spam filtreleme yazılımı yazmaya başlamamın nedeni, artık bu tür mesajlara bakmak istemememdi. Ancak eğer spam filtrelemeyi gerçekten iyi bir hale getirirsek, spam mesajların etkisiz hale geleceği ve spam gönderenlerin bu mesajları göndermeyi bırakacağı bir noktaya gelebiliriz.

---

Spamla savaşta, yazılımdan yasalara kadar çeşitli yöntemler arasında, Bayes filtrelemesinin en etkili tek çözüm olacağına inanıyorum. Ancak aynı zamanda, ne kadar çeşitli anti-spam çabaları sarf edersek, sonuçların o kadar iyi olacağını düşünüyorum. Çünkü spam gönderenlerin hareket alanını kısıtlayan her önlem, filtrelemeyi daha da kolaylaştırır. Dahası, içerik tabanlı filtreleme dünyasında bile, birçok farklı yazılımın aynı anda kullanılıyor olması, bence iyi bir durum.Spam filtrelerinin sayısı ne kadar çok olursa, spamcıların bu filtrelerin arasından sıyrılması o kadar zorlaşır. Bu konuyu daha iyi anlamak için birlikte **Filtreleme Örnekleri**ne bakalım.

Öncelikle, bu makaleyi yazarken bana gelen bir spam mesajının örneğini paylaşmak istiyorum. Bu spam'deki en ilginç on beş kelime şunlar: qvp0045 indira mx-05 intimail $7500 freeyankeedom cdo bluefoxmedia jpg teminatsız platin 3d0 qves 7c5 7c266675. Bu kelimeler, başlıklar ile mesaj içeriğinden alınmış bir karışım, bu da tipik bir spam özelliği. Ayrıca, spamın bir diğer tipik özelliği de, bu kelimelerin her birinin, benim veritabanımda, .99'luk bir spam olasılığına sahip olması. Aslında, .99'luk bir olasılığa sahip on beşten fazla kelime var ve bunlar sadece ilk görünen on beş tanesi.

Ne yazık ki bu durum, bu e-postayı Bayes'in Kuralı'nın kullanımının sıkıcı bir örneği haline getiriyor. İlginç olasılıklar çeşitliliğini görmek için oldukça alışılmadık bir spam olan bu e-postaya bakmalıyız.

Bu spam'deki en ilginç 15 kelime ve olasılıkları şunlar: madam 0.99, promosyon 0.99, cumhuriyet 0.99, en kısa 0.047225013, zorunlu 0.047225013, standardizasyon 0.07347802, üzgünüm 0.08221981, desteklenen 0.09019077, halkın 0.09019077, girin 0.9075001, kalite 0.8921298, organizasyon 0.12454646, yatırım 0.8568143, çok 0.14758544, değerli 0.82347786. Bu seferki deliller hem iyi hem de kötü yönde. ""En kısa"" gibi bir kelime, ""madam"" veya ""promosyon"" kadar suçlamaya delilken, aynı zamanda masumiyeti de kanıtlar. Ancak hala suçlama lehine olan durum daha güçlü. Bayes Kuralı'na göre bu sayıları birleştirirsek, sonuçta çıkan olasılık 0.9027 oluyor.

""Madam"" kelimesi genellikle ""Sayın Bey ya da Hanım"" diye başlayan spam e-postaların bir özelliği. Çok sık karşımıza çıkmasa da, ""madam"" kelimesi hiçbir zaman gerçek e-postalarımda geçmiyor ve buradaki asıl önemli olan konu oran.

""Cumhuriyet"" kelimesi yüksek puan alıyor çünkü genellikle Nijerya dolandırıcılık e-postalarında karşımıza çıkıyor ve ayrıca Kore ve Güney Afrika ile ilgili birkaç spamda da geçiyor. İlk bakışta, ""Cumhuriyet"" kelimesinin bu tür spam e-postalarını belirlemede yardımcı olmasının tamamen tesadüf olduğunu düşünebiliriz. Ancak, spam olasılıklarını incelediğimde, bu tür ""tesadüfler"" ile sıkça karşılaştığımı ve bu tesadüflerin genellikle işleri yanlış yöne değil, doğru yöne doğru sürüklemeye meyilli olduğunu gördüm. Bu durumda, ""Cumhuriyet"" kelimesinin Nijerya dolandırıcılık e-postalarında ve bu spamda geçmesi tamamen rastlantısal bir durum değil. Az gelişmiş ülkelerle ilgili şüpheli iş teklifleri türü var ve bu teklifler, cumhuriyet olduklarını açıkça belirten isimlere sahip olma olasılığı daha yüksek.

Diğer yandan, ""enter"" kelimesi gerçekten gözden kaçmış. Genellikle abonelik iptali talimatlarında karşımıza çıkıyor, ancak burada tamamen masum bir şekilde kullanılmış. Neyse ki, istatistiksel yöntem oldukça sağlam ve sonuçlar etkilenmeye başlamadan önce birçok hatayı tolere edebilir.

Karşılaştırma yapabilmek için, burada filtrelerden sıyrılıp geçebilen nadir rastlanan bir spam örneği bulabilirsiniz. Peki bu nasıl mümkün oluyor? Tamamen rastlantı eseri bu spam e-posta, gerçek e-postalarımda sıkça geçen kelimeleri içeriyor: perl 0.01 python 0.01 tcl 0.01 komut dosyası 0.01 morris 0.01 graham 0.01491078 garanti 0.9762507 cgi 0.9734398 paul 0.027040077 oldukça 0.030676773 pop3 0.042199217 çeşitli 0.06080265 fiyatlar 0.9359873 yönetilmiş 0.06451222 zor 0.071706355 Ama burada iki parça iyi haber var. Birincisi, bu e-posta muhtemelen programlama dilleri üzerine yoğunlaşmış veya Morris isminde iyi bir arkadaşı olmayan birinin filtrelerinden geçemez. Ortalama bir kullanıcı için, buradaki en yüksek beş kelime nötr olacaktır ve spam ihtimaline etki etmeyecektir.

İkincisi, kelime çiftlerine dayalı bir filtreleme sistemi (aşağıda daha detaylı bahsedeceğim) ile bu tür durumları yakalamamızın mümkün olabileceğini düşünüyorum: ""maliyet etkin"", ""kurulum ücreti"", ""para iadesi"" - bu ifadeler oldukça suçlayıcı.Bir e-posta kutusunda spam mesajları ararken, bazen ilginç şeylerle karşılaşabilirsiniz. Örneğin, ""tanımla"" kelimesini düşünün. Bu kelime, 4000 spam e-posta içinde hiçbir zaman karşıma çıkmadı. Bu, spamcıların ne kadar dar bir dil alanında operasyon yaptığının bir göstergesi. 

Spam metinlerini analiz ettiğinizde, spamcıların ne kadar dar bir dil alanında operasyon yaptığını öğreniyorsunuz. İşte bu özellik, her kullanıcının kendine özgü kelime dağarcığı ile birlikte, Bayesci filtrelemenin neden iyi bir yöntem olduğunu bizlere gösteriyor.

**Daha Fazla Fikir**

Henüz denemediğim bir şey, tek tek kelimeler yerine kelime çiftleri veya hatta üçlüler üzerinden filtreleme yapmak. Bu, olasılıkların çok daha keskin bir tahminini sağlamalıdır. Örneğin, şu anki veritabanımda ""teklifler"" kelimesinin %96 olasılığı var. Kelime çiftlerine dayalı olasılıklar kullanırsanız, ""özel teklifler"" ve ""değerli teklifler"" ifadelerinin olasılıkları %99'a çıkabilir ve diyelim ki ""yaklaşım teklifler"" (yani ""bu yaklaşım teklifler"") ifadesinin olasılığı %10 veya daha az olabilir.

Bunu yapmamış olmamın sebebi, kelime bazlı filtrelemenin zaten son derece etkili olması. Ancak bu, eğer spam tespiti daha zorlaşırsa, filtreleri daha da sıkılaştırma olanağımız olduğunu gösteriyor. (İlginç bir şekilde, kelime çiftlerine dayalı bir filtre aslında geriye dönük bir Markov zinciri metin oluşturucu gibi çalışıyor olacaktır.)

Belirli spam özelliklerinin (örneğin, 'kime:' alanında alıcının adresini görememek gibi) spam'i tanımakta değeri olduğu kesin. Bu özellikleri, bu algoritma içerisinde sanki sanal kelimelermiş gibi değerlendirebiliriz. Gelecekteki versiyonlarda, en azından en belirgin spam göstergeleri için bunu yapmayı düşünüyorum. Özellikleri tanıyan spam filtreleri birçok detayda haklı; ama onların eksik olduğu nokta, tüm bu kanıtları bir araya getirmek için genel bir düzendir.

Spam olmayan özellikleri tespit etmek, spam özelliklerini tespit etmekten daha önemli olabilir. Yanıltıcı pozitif sonuçlar öyle bir endişe yaratır ki, bunları önlemek için sıradışı önlemler almak gerekebilir. Büyük ihtimalle gelecekteki sürümlere, yanıltıcı pozitif sonuçları önlemek için özellikle tasarlanmış ikinci bir test seviyesi ekleyeceğim. Bir e-posta bu ikinci seviyedeki filtreleri harekete geçirirse, spam olasılığı kabul edilebilir seviyenin üzerinde bile olsa, yine de kabul edilecektir.

Bu ikinci filtreleme aşamasının Bayes teorisi ile ilgili olacağını pek sanmıyorum. Bu aşama kaçınılmaz bir şekilde sadece duruma özgü olacak ve tahminlere dayanacak, çünkü yanıltıcı pozitif sonuçların sayısı genellikle bir düzeni fark etmek için yeterli olmayacak. (Zaten bir yedekleme sisteminin, ana sistemin kullandığı teknolojiye bağımlı olmaması iyi olur.)

Gelecekte belki de yapmayı düşündüğüm bir şey, e-postaların belirli kısımlarına daha çok odaklanmak. Örneğin, şu anki spam e-postaların yaklaşık %95'i, sizi ziyaret etmenizi istedikleri bir siteye yönlendiren bir link içeriyor.(Geride kalan %5'lik kısım ise sizden bir telefon numarasını aramanızı, e-posta ile cevap vermenizi, bir ABD posta adresine mektup göndermenizi ya da bazı durumlarda belirli bir hisse senedi satın almanızı istiyor.) Bu durumlarda, site linki tek başına e-postanın spam olup olmadığını anlamanız için neredeyse yeterli oluyor.

Alan adları, (Almanca dışında bir) e-postadaki diğer metinden farklıdırlar, çünkü genellikle birbirine yapışmış birkaç kelimenin birleşiminden oluşurlar. Genel durumda hesaplama açısından maliyetli olsa da, bunları ayırmayı denemek faydalı olabilir. Örneğin, bir filtre daha önce ""xxxporn"" ifadesini hiç görmediyse, bu ifadenin tek başına spam olasılığı %40'tır. Ancak ""xxx"" ve ""porn"" kelimeleri ayrı ayrı ele alındığında, benim veri setimde spam olasılıkları sırasıyla %98.89 ve %99'dur ve birlikte kullanıldıklarında spam olasılığı %99.98'e yükselir.

Spammerlerin mesaj metinlerindeki suçlayıcı kelimeleri kullanmayı yavaşça bırakmak zorunda kalacakları düşünüldüğünde, domain adlarını ayrıştırmanın daha da önemli hale geleceğini tahmin ediyorum. (Bir IP adresi olan bir URL, birkaç sistem yöneticisinin postaları hariç, son derece kuşkulu bir işaret olacaktır.)

Spammer'lar tarafından öne çıkarılan URL'lerin işbirliği içinde ortaklaşa oluşturulan bir listesi olması aslında iyi bir fikir olabilir. Elbette, kötü niyetli ya da yeteneksiz girişimleri engellemek adına Raph Levien'in çalıştığı türden bir güven ölçütüne ihtiyacımız olacak. Eğer böyle bir sistem kurabilirsek, bu, her türlü filtreleme yazılımına ekstra bir ivme sağlayabilir. Ayrıca, boykotlar için de kullanışlı bir temel oluşturabilir.

Şüpheli URL'leri denetlemek için başka bir yöntem daha var: Kullanıcı e-postayı incelemeden önce bir web tarayıcı gönderip sitenin üzerinden geçebiliriz. Bir e-posta gibi siteyi de değerlendirmek için Bayes filtresi kullanabiliriz ve web sitesinde bulunan her şey, e-postanın spam olma olasılığını hesaplarken dahil edilebilir. Tabii ki, bir başka sayfaya yönlendiren bir URL özellikle şüpheli olur.

Gerçekten harika bir fikir olduğunu düşündüğüm bir ortak proje, devasa bir spam veri tabanı oluşturmak olurdu. Büyük ve temiz bir veri tabanı, Bayes filtresinin iyi çalışmasının anahtarıdır. Bayes filtreleri, bu veri tabanını girdi olarak kullanabilir. Ancak bu tür bir veri tabanı, diğer filtre türlerini test etmek için de oldukça işe yarar olabilir.

Böyle bir veri tabanı oluşturmak teknik açıdan bazı zorlukları beraberinde getirebilir. Tabii ki, kötü niyetli ya da yetersiz katkıları engellemek için güvenlik ölçütlerine ihtiyacımız olacak. Ayrıca, veri tabanındaki e-postalardan kişisel bilgileri silme yollarını da bulmamız gerekiyor. Bu, sadece 'kime' ve 'cc' bilgileri değil, aynı zamanda örneğin, 'abonelikten çık' linklerindeki argümanlar gibi, genellikle e-posta adresini içeren bilgileri de içerir. Eğer bu projeyi üstlenmek isteyen biri olursa, bu kesinlikle dünyamız için iyi bir adım olacaktır.

**Ek: Spam'i Tanımlama**

Spam'ın ne olduğuna dair kabaca bir fikir birliği olduğunu düşünüyorum, fakat net bir tanımın faydası olacaktır. Eğer bir spam veritabanı oluşturmak ya da spam filtreleme oranlarını anlamlı bir şekilde karşılaştırmak istiyorsak, bu net tanıma ihtiyacımız olacak.

Baştan söyleyeyim, spam, istenmeyen ticari e-posta değil. Diyelim ki mahallemdeki biri, iyi durumda eski bir Raleigh üç vitesli bisiklet aradığımı duydu ve bana bir tane satmak için e-posta attı. Ben bu durumdan oldukça memnun olurum, hâlbuki bu e-posta hem ticari hem de talep etmediğim bir mesaj. Ancak spam'ı spam yapan (gerçekten de _var oluş nedeni_), istenmeyen olması değil, otomatik olarak gönderilmesi.

Spam'ın genellikle ticari olması da tamamen tesadüfidir. Örneğin, biri bir politik durumu desteklemek için toplu e-postalar göndermeye başlasa, bu da bir porno sitesini tanıtan bir e-posta kadar çok spam olurdu.

Spam'ı **istenmeyen otomatik e-posta** olarak tanımlamamızı öneriyorum. Bu tanım, birçok yasal spam tanımının dahil etmediği bazı e-postaları da kapsar.Spam, her birimizin hayatının bir parçası. Büyük ihtimalle lobicilerin etkisiyle, alıcının ""zaten bir ilişkisi olduğu"" şirketler tarafından gönderilen postalar genellikle spam tanımının dışında kalıyor. Ama bir şirketten bir şey satın almak, onlardan sürekli e-posta almayı istediğiniz anlamına gelmez, değil mi? Örneğin, bir online mağazadan bir şeyler satın alırsanız ve onlar size durmaksızın spam e-postaları gönderirse, bu hâlâ spam olur.

Spam gönderen şirketler genellikle size ""abonelikten çıkma"" seçeneği sunar ya da spam almayı durdurmak istiyorsanız, web sitelerine gidip ""hesap tercihlerinizi"" değiştirmenizi önerirler. Ama bu, bir e-postanın spam olup olmadığını belirlemek için yeterli değildir. Çünkü abonelikten çıkmak, abone olma anlamına gelmez. Eğer alıcı, e-postaları almayı kabul edeceğini belirten, net bir şekilde etiketlenmiş bir kutucuğu (varsayılanı 'hayır' olan) açıkça işaretlememişse, o zaman o e-posta bir spam'dir.

Bazı iş ilişkilerinde, dolaylı yoldan belirli türdeki mailleri istemiş olabilirsiniz. Örneğin, online bir alışveriş yaptığınızda, bence dolaylı olarak bir fiş ya da siparişinizin kargolandığına dair bir bildirim bekliyorsunuzdur. Verisign’ın bana bir alan adının süresinin dolmak üzere olduğuna dair e-posta gönderdiğinde bu durumdan rahatsız olmam (tabii ki, eğer gerçekten o alan adının kayıt yetkilisi ise). Ama Verisign bana 'E-Ticaret Web Sitemi Nasıl Kurarım?' konulu ÜCRETSİZ bir rehber sunan bir e-posta gönderdiğinde, işte bu tamamen spam.

#### Notlar

1] İnanın ya da inanmayın, bu yazıdaki örnekler daha fazla kişiye ulaşmak için Common Lisp diline çevrildi. Burada bahsettiğimiz uygulama, henüz çıkmamış yeni bir Lisp lehçesi olan [Arc’ı denemek amacıyla yazdığımız bir uygulamadır.

[2] Şu an en uygun fiyat, bir milyon spam mail göndermek için 200 dolar gibi görünüyor. Bu, her bir spam mail başına 1/50 cent, yani çok ucuz. Ancak, diyelim ki %95 spam filtreledik, bu durumda spam gönderenlerin belirli bir kitleye ulaşma maliyeti 20 katına çıkar. Bu ekstra maliyeti karşılayabilecek kadar geniş bir kar marjına sahip olan çok az kişi vardır.

[3] Bir kurala göre, bir ülkenin adının önündeki sıfatlar ne kadar çok olursa, yöneticiler de o kadar yolsuz olur. 'Sosyalist Halkın Demokratik X Cumhuriyeti' gibi bir isme sahip bir ülke, belki de dünyada yaşamak isteyeceğiniz en son yer olur.

**Özel Teşekkürler**:Sarah Harlin'a taslakları okuduğu için, Daniel Giffin'e süzgeçleme hakkındaki harika fikirleri ve e-posta altyapımızı oluşturması için, Robert Morris, Trevor Blackwell ve Erann Gat'e spam hakkında yaptığımız tartışmalar için, Raph Levien'e güven metrikleri hakkında verdiği tavsiyeler için ve Chip Coldwell ile Sam Steingold'a istatistikler hakkında bilgilendirici önerileri için teşekkür ederim.""""

---

İlişkili Konseptler: spam filtreleme teknikleri, Bayes spam filtreleme, içerik tabanlı spam filtreler, spam filtrelemede yanlış pozitiflerin önlenmesi, spam tanıma yazılımı, spam filtreleme algoritmaları, otomatik email spamı, istenmeyen otomatik email, spam filtreleme evrimi, spam tespit stratejileri, spam ve spam olmayan mail, spam filtreleme yazılım geliştirme, spam filtre etkinliği, spam filtre yanlış pozitifleri, spam filtre iyileştirme, spam filtre testi, spam filtre özellikleri, spam filtre kelime çiftleri, spam filtre güven metrikleri, spam filtre kooperatif projeleri, spam tanımlama."

Subscribe

Listen to Yiğit Konur'un Okuma Listesi using one of many popular podcasting apps or directories.

Spotify Pocket Casts Amazon Music YouTube
← Previous · All Episodes · Next →