design

Laravel PHP Spam Korumasının 6 Aşaması

March 13, 2025

Ve neden olmasın ki? Yakın çevrenizin dışındaki hiç kimse bunun varlığından bile haberdar değil. Bu aşamada, "mutlu yol"un yeterli olduğunu varsaymak yeterli. Bazı temel form doğrulamaları işe yarayacaktır. " Yeni bir konu oluşturmak için bir başlık ve açıklama sağlamalısınız. "

İnsanlar genelde iyidir. Elbette yeni platformunuzdan faydalanmayacaklardır. Değil mi?

Aşama 1

İlk birkaç hafta boyunca forumunuz giderek büyüyor. Her bir ilgili başlıkta sohbetler oluşmaya başlıyor. Ne kadar heyecan verici! Arnold Schwarzenegger'in alışılmadık öğretim tekniğinin anaokulu öğrencileriyle işe yaramaya başladığını fark ettiği Kindergarten Cop'taki sahneyi hatırlıyor musunuz? " Evet - işe yarıyor. İşe yarıyor! " diyor. ...Elbette o sahneyi hatırlamıyorsunuz. Ama ben hatırlıyorum - ve yeni kurulan forumunuzun büyümesini izlemek tam olarak böyle hissettiriyor.


Ancak bir gün uyanırsınız, foruma göz atarsınız ve ilk spam'inizi fark edersiniz. Konu başlığı şöyledir:

Selamlar. Bu sitedeki öğretilerden çok keyif alıyorum. HD megavideo akışı için buraya tıklayın.

Kahretsin. Bizi buldular. Nasıl olduğunu bilmiyorum ama bizi buldular.

Anahtar Kelime Sansürü

Omuz silkip geçiyorsunuz. Önemli değil. Belki de bazı temel anahtar kelime doğrulamaları işe yarayacaktır. Laravel'de, kolayca özel bir doğrulama kuralı oluşturabiliriz:


Öncelikle Terminalde Çalışıtıralım

php artisan make:rule NoInvalidKeywords


Birkaç satır kod yazdıktan sonra, elimizde geçersiz anahtar kelimelerden oluşan bir liste var - "MegaVideo" ile başlıyor.


request()->validate([

'body' => ['required', new NoInvalidKeywords]

]);



Sorun çözüldü! …Değil mi?

Aşama 2

Spam gönderenler dinozorlar gibidir: hayat bir yolunu bulur. Temel anahtar kelime dizesi denetleyiciniz, " MEGA%%VID%EO İndirme H%D Bağlantısı " gibi akıllı biçimlendirmeleri hesaba katmamıştır. Yani bir kez daha, yeni bir spam kabına uyanıyorsunuz. Çizim tahtasına geri dönüyoruz.


E-posta Onayı

Belki bir sonraki adım doğrulama değil, e-posta onayıdır. E-posta adresinizi doğrulayana kadar forumuma katılamazsınız. Bu, aniden gördüğünüz tüm adsfasfaasfadsf@domain.com kayıtlarını ortadan kaldırmalıdır.


Laravel - yine kurtarmaya geliyor - MustVerifyEmailsözleşme aracılığıyla e-posta onayı sağlıyor. Bunu modelinize ekleyin Userve kişi kaydolduktan sonra otomatik olarak bir onay e-postası alacaktır. Daha sonra verifiedara yazılımı uygulayarak r otalarınızı koruyabilirsiniz.


Route::post('threads', function () {

//

})->middleware('verified');


Bu değişiklikle artık etkili bir şekilde şunu söylüyoruz: " E-posta adresinizi doğrulamadığınız sürece forum başlığı oluşturamazsınız. "

Sorun çözüldü! …Değil mi?


Aşama 3

E-posta onayı kesinlikle yardımcı olur, ancak belki de başlangıçta umduğunuz ölçüde değil. Filmin sonunda ölmeyen kötü adam gibi, spam devam ediyor.


Yakında belirli yabancı dillerde yazılmış spam'lerle karşılaşmaya başlayacaksınız. Bunu yapmanızın motivasyonu nedir? Kim bilir, ama dalgalar halinde gelir.

Sabah için planladığınız projeleri bırakın. Bunu düzeltmemiz gerekiyor.

Dil Algılama

Bir sonraki saati belirli dillere karşı doğrulamanın nasıl yapılacağını araştırmaya ayırmanın zamanı geldi. Komik bir şekilde, arama sonuçları sizin kendi forumunuza bir bağlantı döndürüyor. Aşağıdaki düzenli ifadeyi öneren bir konu başlığı buluyorsunuz.



PHP Rule

php

php
<?php

namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;

class EnglishOnly implements Rule
{
    public function passes($attribute, $value)
    {
        return ! preg_match("/\p{Han}+/u", $value);
    }

    public function message()
    {
        return 'Please use English for the :attribute.';
    }
} 

Gülümsemek için bir an ayırıyorsunuz. Vay canına, başkalarına yardım etmek için oluşturduğum araç, aracın kendisini geliştirmeme yardımcı oldu. Bu çok harika.

Neyse, odaklan Daniel-san. İşe geri dön.

Bu doğrulama kuralı tam olarak doğru değil, ancak önleyici bir çözümü hızla uygulamaya koymak için yeterince iyi bir ilk adım.

Validation

IndeController.php

php
request()->validate([
    'body' => [
        'required',
        new NoInvalidKeywords,
        new EnglishOnly
    ]
]); 

Sorun çözüldü! …Değil mi?

Aşama 4

Defnelerinize çok uzun süre güvenmeyin. Bir sonraki aşama - ve sorun - spam gönderenlerden veya botlardan değil, forumunuza aktif olarak katılan insanlardan kaynaklanıyor! Görünüşe göre birileri sizin yeni konuları veya yanıtları engellemediğinizi fark etmiş. Kötü bir Grinch benzeri sırıtma yüzlerini şekillendirmeye başlıyor.


Peki ya bu ileti dizisine her beş saniyede bir anlamsız ifadelerle cevap veren bir komut dosyası yazsam?

Şimdi kendinize şunu düşünüyorsunuzdur, " Ama neden? Anlamı ne? " Hayattaki pek çok şey gibi, cevap da basittir: " Yapıp yapamayacaklarını görmek için. " Birinci kural: En kötüsünü varsayın. İnsanlar doğası gereği iyi değildir.

Kısma

Eski halinizden daha az neşeli, bir çözüm arayışında kod tabanınıza geri dönüyorsunuz. Belki de yeni konu başlıkları veya yanıtlar oluşturma sıklığınızı sınırlamalıyım. Aynı kullanıcının tek bir dakikada birden fazla kez yanıt vermesi kesinlikle kötü niyetli bir niyetin işaretidir. …O veya Red Bull.


Laravel'in özel doğrulama kurallarına bayıldım. Vermeye devam eden bir hediye.

PostThrottling

PostThrottling .php

php
<?php

namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;
use App\User;

class PostThrottling implements Rule
{
    public function __construct(protected User $user)
    {
    }

    public function passes($attribute, $value)
    {
        return $this->user->latestThread?->created_at->lt(
            now()->subMinutes(2)
        );
    }

    public function message()
    {
        return 'You are posting too frequently.';
    }
} 

Bu hızlı kural, belirtilen kullanıcının son iki dakika içinde bir konu oluşturup oluşturmadığını belirler. Eğer öyleyse, bu bizim için bir hayır olacak, dog . Bu yeni kuralı birincil doğrulama mantığımıza ekleyelim.

PostThrottling

IndexController.php

php
request()->validate([
    'body' => [
        'required',
   	new PostThrottling($user),
        new NoInvalidKeywords,
        new EnglishOnly
    ]
]); 

Bu noktada, forumunuzu hizmet etmesi gereken kullanıcılardan korumak için sabahı bir taahhütte bulunduğunuz için biraz buruksunuz. Ama en azından bitti. Hadi bunu üretime geçirelim ve işe geri dönelim.

Sorun çözüldü! …Değil mi?


Aşama 5

Bir hafta tek bir spam parçası olmadan geçiyor. Bağımsızlık Günü'nün sonundan kutlama müziğini çalın. Kazandınız.


Telgrafa geçin ve dünyanın dört bir yanındaki filoya haber verin. Onlara o orospu çocuklarını nasıl alt edeceklerini anlatın!

…Keşke.

Günümüzdeki birçok Hollywood filminde olduğu gibi, her zaman bir devam filmi vardır. Spam gönderenler gitmedi. Sadece yeniden bir araya geliyorlar; saldırmak için doğru zamanı bekliyorlar. Yaklaşan aile tatilinizin doğru zaman olduğuna karar verildi. " Şafakta saldırıyoruz " Sanırım kendi aralarında kıkırdaşıyorlardır.

Şimdi 3. Bölgeye biniyoruz " diyor uçuş görevlisi. Ayağa kalkıyorsunuz, çantalarınızı topluyorsunuz ve biniş girişine doğru ilerliyorsunuz. Sol cebinizde hafif bir vızıltı hissediyorsunuz. Yeni bir e-posta. " Bu lanet bildirimleri gerçekten devre dışı bırakmam gerek " diye düşünüyorsunuz. Tatilde olduğunuzu ve iş e-postalarıyla ilgilenmediğinizi kendinize hatırlatıyorsunuz. Ve yine de, hepimizi tuzağa düşüren şey bilmemek. Ya önemliyse? Ya site kapalıysa? Hadi ama, slot makinesini sadece bir kez çekmeniz yeterli. Ve sonra onu kapatacaksınız. Elbette kapatacaksınız.

Çantalarınızı yere koyuyorsunuz, cebinize uzanıyorsunuz ve gizlice (eşinizin yargılayıcı bakışlarından kaçınmak için) telefonunuzu kontrol ediyorsunuz. Forumunuzun ana sayfası spam ile dolu. Saldırı altındayız! Savunmalarımızı nasıl aştılar?

Üzgünüm tatlım. Bununla başa çıkmam gerek. " diye utanarak eşinize söylüyorsunuz. Adımlarınızda canlılıkla, size tahsis edilen koltuğa doğru ilerliyorsunuz, dizüstü bilgisayarınızı çıkarıyorsunuz ve kod düzenleyicinizi hızla başlatıyorsunuz. Uçak 25 dakika sonra kalkacak. Hala zaman var! Bunu düzeltebilirim.

Bal küpleri

Belki daha düşünceli olmalıyız. Bu botları kandırmanın, onları aktif kullanıcılarımızın gönderilerinden ayırmanın bir yolu var mı?


Cevap, ortaya çıktığı üzere, evet! Kurtarmaya gelen bal tuzakları. Neyse ki, eğer odaklanmaya devam edersek, uçak havalanmadan önce uygulayabileceğimiz yeterince basit bir teknik.

Bal tuzağı , formunuza görünmez girdiler eklemeyi içeren bir desen veya tekniktir. Bir bot formunuzu tarayacak, bu alanlarla karşılaşacak ve bunları en iyi şekilde dolduracaktır .

Şimdi, yapmamız gereken tek şey bu belirli istek alanlarının mevcut olup olmadığını doğrulamak. Eğer öyleyse, ding ding ding: Elimizde bir spam gönderici var. Hiç şüphe yok. İptal, iptal!

Bu, şaşırtıcı derecede etkili olan çok basit bir çözüm. Keşke bunu forumun lansmanında uygulasaydık. Ne yazık ki, bariz çözüm nadiren ilk düşündüğümüz çözüm oluyor.

Sorun çözüldü! …Değil mi?


Aşama 6

Tebrikler. Zamanınız bolken harikalar yarattınız. Kalkışa beş dakika kala tatilinizi geri kazandınız. Söz verdiğiniz gibi bildirimleri devre dışı bırakmayı unutmayın .


Birkaç ay ileri saralım, spam bir zamanlar olduğu şeyin çok küçük bir parçası. Ve yine de, yine de, bir parça hiçbir şey değil . En iyi çabalarınıza rağmen, savaşı gerçekten kazanmadınız. Neredeyse yenilmiş canavar gibi, hala size doğru sürünerek, son bir tutuş umuduyla ilerliyor.

Görünüşe göre bir reCAPTCHA hizmetine ihtiyacımız var. Bu amansız sorunu çözmek için şeytanla anlaşma mı yapmalıyız? " Kalıcı spam sorunumu çözmeme yardım edin, kullanıcılarım yapay zekanızın dur işaretini nasıl algılayacağını öğrenmesine yardımcı olsun. "

Web'deki her lanet şey gibi, bunu uygulamak da hiç bu kadar kolay değildir. Ancak, birkaç tarayıcı sekmesi sonra, bir çözüm bulmayı başarırsınız.

Elbette, anahtar kelime sansürleme, e-posta onayı, dil tespiti, gönderi sınırlaması, honeypot'lar ve reCAPTCHA'nın birleşimi bu canavarı öldürmeye yeter. Kesinlikle öyle görünüyor. Üç gündür tek bir spam parçası yok.

Sorun çözüldü! …Değil mi ?

4 + 2 =