Classic ASP ve Spam ile Mücadele
Günümüzde spam bot’ları web sitelerini hedef alarak çeşitli saldırılar gerçekleştiriyor. Özellikle e-posta adreslerini ve diğer kişisel bilgileri toplamak için kullanılan register formlarında bu saldırılar daha sık görülüyor. Spam’cılar, bu formlara manipüle edilmiş veriler girerek, sistemleri kötüye kullanabiliyor ve hedef e-posta adreslerine spam e-postalar gönderebiliyor. Bu tür saldırılara karşı koruma sağlamak, özellikle güvenlik açıklarını kapatmak adına kritik önem taşıyor.
Sorun ve Çözüm
Son birkaç gün içinde, sistemlerimde yaşadığım bir olay, bu tür saldırıların ne kadar yaygın olduğunu ve ne tür etkiler yaratabileceğini gösterdi. Sunucularıma ait veri merkezi (DC) firması, IP adresimden gelen yüksek bir şikayet oranı nedeniyle uyarı e-postası gönderdi.
1
2
3
4
5
6
7
8
9
10
11
12
13
Date: Fri, Sep 13, 2024 at 11:31 AM
Subject: [*****umine #23***2] High SNDS complaint rate on your IP ***.**.****.102
To: John Doe <info[a]my-company.mail>
Cc: <ba****un[a]gmail.com>
Subject: High SNDS complaint rate on your IP ***.**.****.102
Hello!
We have been notified by SNDS that your IP ***.**.****.102 has been sending out email traffic with a complaint rate of 11%, which is very frowned upon. A note on the report listing also mentions the following: "Abuse reported for: noreply[a]your-domain.com". Please take action to stop this harmful activity.
Lugupidamisega / Best regards / С уважением,
A******* T******
Gönderilen e-postada, e-posta trafiğiyle ilgili bir şikayet oranının yüksek olduğu ve kötüye kullanım raporunun bulunduğu belirtiliyordu. Bu, spam saldırılarının etkili bir şekilde nasıl gizlenebileceğinin ve ne tür sonuçlar doğurabileceğinin bir örneğiydi.
Yapılan analizler sonucunda, sistemlerin normal hareketlerinin aslında spam saldırılarından etkilendiği ve bu hareketlerin normal gibi göründüğü ortaya çıktı. Bu durumu fark ettikten sonra, sistemlere yönelik bir yama hazırladım. Bu yamanın amacı, spam bot’larının kelime oyunları yaparak form verilerini manipüle etmelerini engellemektir.
Classic ASP İçin Spam Koruma Fonksiyonu
Aşağıda, Classic ASP ile geliştirdiğim ve spam saldırılarını önlemeye yönelik bir fonksiyon örneğini bulabilirsiniz. Bu fonksiyon, olası spam saldırılarında kullanılan kelime oyunlarını tespit eder ve engeller. Sonuç olarak bir array döner, array’ın ilk parçası true ise, işlemi durdurabilirsiniz. Array’ın ikinci parçası, ihtiyaç halinde incelenen string’in hangi sebeple şüpheli olduğunu söyler.
Ben bu fonksiyonu register formlarında kullanıcı adı, soyadı gibi alanlar için kullandım. Parolalar zaten şifreleniyor ve e-posta için hem pattern hemde yasaklı provider listesi sunuyorum.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
Function SuspectCheck(ByVal text)
SuspectCheck = Array(False, "")
Set htmlRegex = New RegExp
htmlRegex.IgnoreCase = True
htmlRegex.Global = True
htmlRegex.Pattern = "<[^>]+>" ' HTML tag pattern
If htmlRegex.Test(text) Then
SuspectCheck = Array(True, "isHtml")
Exit Function
End If
Set htmlRegex = Nothing
Set urlRegex = New RegExp
urlRegex.IgnoreCase = True
urlRegex.Global = True
' urlRegex.Pattern = "((mailto|tel|ftp[s]|http[s])?://[^\s]+)" ' Web URL pattern
urlRegex.Pattern = "(http[s]?|ftp|mailto|tel|www)?(:\/\/)?[a-zA-Z0-9\-]+\.[a-zA-Z]{2,}([\/\?\=].*)?"
If urlRegex.Test(text) Then
SuspectCheck = Array(True, "isUrl")
Exit Function
End If
Set urlRegex = Nothing
Set emailRegex = New RegExp
emailRegex.IgnoreCase = True
emailRegex.Global = True
emailRegex.Pattern = "\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}\b" ' E-posta pattern (case insensitive)
If emailRegex.Test(text) Then
SuspectCheck = Array(True, "isEmail")
Exit Function
End If
Set emailRegex = Nothing
Set webRegex = New RegExp
webRegex.Global = true
webRegex.IgnoreCase = true
webRegex.Pattern = "((((ht|f)tps?://)|www\.)\S+[^\.*](\s)?)"
If webRegex.Test(text) Then
SuspectCheck = Array(True, "isWeb")
Exit Function
End If
Set webRegex = Nothing
Set nonSpecialRegex = New RegExp
nonSpecialRegex.Global = true
nonSpecialRegex.IgnoreCase = true
nonSpecialRegex.Pattern = "(--|<|>|'|(1=1)|/\*|\*/|//|%[0-9a-zA-Z]{2}|&#[0-9a-zA-Z]{2,3};?|(src|\(|\)|prompt|onerror|img|iframe)|((""+.*(script)+.*""+){1}))"
If nonSpecialRegex.Test(text) Then
SuspectCheck = Array(True, "isSpecial")
Exit Function
End If
Set nonSpecialRegex = Nothing
End Function