Kullanıcı tarafından sağlanan tüm girdiler, veri tabanına kaydedilmeden önce doğrulanmalıdır ve hizmet ettikleri önemli rol göz önünde bulundurularak e-posta adresleri için iki katına çıkarılmalıdır.

Çoğu sistem, sözdizimi doğrulaması için e-posta adresine karşı basit bir normal ifade kontrolü çalıştırarak ve kullanıcı tarafından sağlanan adrese bir e-posta göndererek bu işlevi uygular. Ancak bu pek çok sistem için yeterli olmayabilir.

Doğrulama neden yeterli değil?

Kötü e-posta adreslerini ayıklamanın en basit yolu, onları doğrulamaktır. Doğrulama, yalnızca istemci tarafından sağlanan e-posta adresinin sözdizimsel olarak doğru olmasını sağlar. En katı koşullarda, geçerli bir e-posta adresi RFC 2822 spesifikasyonuna karşılık gelmelidir . Bununla birlikte, çoğu uygulama, kötü oyuncuları ayıklamak için şartnamenin izin verdiğinden biraz daha katı olmaktan kurtulabilir.

E-posta doğrulaması nispeten basit bir sorundur. Tek ihtiyacınız olan basit bir normal ifade ve iyisiniz. Uygulamanız için gereksinimler daha az engelleyici ise, sağlanan e-posta adresinde bir '@' işareti olup olmadığını tespit etmekle bile kurtulabilirsiniz.

E-posta doğrulaması kendi başına farklı bir sorundur. Uygulamaların aşağıdakileri yapmak için e-posta adreslerini doğrulayabilmesi gerekir:

i) E-postanın mevcut olduğundan emin olun.
ii) E-postanın söz konusu kullanıcıya ait olduğundan emin olun.

Bu kılavuz, sorunun ilk kısmına odaklanacaktır (verilen e-posta adresinin mevcut olduğundan emin olun.) Uygulamanızın bir e-posta adresinin sahipliğini doğrulaması gerekiyorsa, büyük olasılıkla adresine gerçek bir e-posta göndermekten kurtulamayacaksınız. Kullanıcı.

Bir e-posta adresini doğrulama

Bir e-posta adresini doğrulamak için birçok farklı faktör kullanılabilir; bunların sayısı ve kapsamı en iyi şekilde bireysel uygulamalara bırakılır. Ancak, dikkat çekmek istediğiniz bazı genel sorunlar şunlardır:

  • Var olmayan e-posta adresleri
  • Geçici e-posta adresi
  • Yaygın yazım hataları

Var olmayan e-posta adresleri

Var olmayan e-posta adresleri iki biçimde gelir - geçerli alan adlarına sahip olanlar ve geçersiz olanlar.

İkinci tür e-posta adreslerinin ayıklanması nispeten kolaydır - etki alanının gerçekten var olduğundan emin olmak için basit bir DNS kontrolü yapabiliriz. Aksi takdirde, e-posta adresi kesinlikle sahtedir.

Geçerli bir alan adına sahip sahte e-posta adreslerinin tespit edilmesi nispeten daha zordur. Onları tespit etmenin basit bir yolu, gerçek bir e-posta adresi göndermek ve mesajın teslim edilmesini veya geri dönmesini beklemektir. Geri dönen bir e-posta, geçersiz bir e-posta adresini açıkça gösterecektir.

Aynı sonucu elde etmenin daha sofistike bir yolunu daha sonra keşfedeceğiz.

Geçici e-posta adresleri

Geçici e-posta adresleri geçicidir - kısa bir süre için mevcutturlar ve büyük olasılıkla sistemdeki başka bir kullanıcıya asla atanmayacaktır. Tek başlarına bir sorun değiller - onlar için pek çok meşru kullanım var - ancak spam yapan çevrelerde oldukça popüler olma eğilimindeler.

Platformunuz bu tür e-posta adreslerinin yüksek oranda görülmesi durumunda, muhtemelen kayıt sırasında bunları filtrelemeye başlamalısınız.

Yaygın yazım hatalarını algılama

Son olarak, yaygın yazım hatalarını da araştırmalısınız. Bu, çoğunlukla meşru kullanıcılar tarafından yapılan genel yazım hatalarını düzeltmek için yararlı olacaktır, ancak aynı zamanda doğrulama kontrollerinizi aldatmaya çalışan kişilerin hesaplarını reddetmesi için de kullanışlı olabilir.

Projeyi önyükleme

İstek gövdesinde bir e-posta ve şifreyi kabul eden ve e-posta geçerliyse bir 200 durum kodu veya isteğin başka türlü neden başarısız olduğunu açıklayan bir mesajla birlikte bir 400 hata kodu döndüren basit bir uç nokta oluşturacağız.

Tek bir bağımlılığa ihtiyacımız olacak: Deep E-mail Validator

Yüklemek için şunu çalıştırın:

npm install deep-email-validator

Bu bağımlılık bizim için tüm ağır yükleri halledecek. Aşağıdaki testleri gerçekleştirir:

E-posta normal ifadesini doğrular

  • Yaygın yazım hatalarını denetler
  • Bir e-postanın tek kullanımlık e-posta hizmeti tarafından oluşturulup oluşturulmadığını belirler.
  • DNS sunucusunda MX kayıtlarını kontrol eder.
  • SMTP sunucusunun çalışıp çalışmadığını belirler.
  • SMTP sunucusunda posta kutusunun varlığını doğrular.

Mantığımız şu şekildedir:

const express = require('express');
const router = express.Router();
const emailValidator = require('deep-email-validator');

async function isEmailValid(email) {
 return emailValidator.validate(email)
}

Bu işlev çalıştırıldığında şuna benzer bir yanıt verir:

{
  valid: false,
  validators: {
    regex: { valid: true },
    typo: { valid: true },
    disposable: { valid: true },
    mx: { valid: true },
    smtp: { valid: false, reason: 'Mailbox not found.' }
  },
  reason: 'smtp'
}

Doğrulayıcı beş farklı kontrolü çalıştırır ve bize sağlanan e-posta adresinin bu kriterlerin her birini karşılayıp karşılamadığını gösteren bir sonuç verir.

Diyelim markaları bu mantık kullandığını basit route oluşturmak:

router.post('/register', async function(req, res, next) {
  const {email, password} = req.body;

  if (!email || !password){
    return res.status(400).send({
      message: "Email or password missing."
    })
  }

  const {valid, reason, validators} = await isEmailValid(email);

  if (valid) return res.send({message: "OK"});

  return res.status(400).send({
    message: "Please provide a valid email address.",
    reason: validators[reason].reason
  })

});

Bu, gerçek kodun sonunu işaret eder, NodeJS'de bir e-posta adresi göndermeden bir e-posta adresini doğrulamamız gerekir.

Ancak her şey bir kara kutu içinde yapılır. Kütüphanede neler olup bittiğini anlamaya yardımcı olur, böylece sistemimizden gerçekçi beklentiler belirleyebilir ve ortaya çıkan sorunlarla nasıl başa çıkacağımızı biliriz.

Dahili Olarak Nasıl Çalışır?

Yaygın yazım hatalarını algılama

Kullanıcıların e-posta doğrulama kontrollerini denemenin ve atlatmanın basit yolu, adreslerinin alan kısmının yazımını biraz değiştirmektir. (Alternatif olarak, elbette, bu kullanıcı açısından tamamen masum bir hata olabilir.)

Derin E-posta Doğrulayıcı, dahili olarak Mailcheck'e güvenir . Basit bir e-posta yazım hatası algılama kitaplığıdır. Ortak alan adlarının bir listesini içerir ve sağlanan e-postanın etki alanı ile dahili liste arasındaki mesafeyi bulmak için Sift4 algoritmasını kullanır .

Dize manipülasyonunda çok derinlere inmeyeceğiz, ancak algoritmanın nasıl çalıştığını anlamak için Levenshtein Distance ile aşina olmak faydalı olacaktır . Bu, bir dizeyi diğerine dönüştürmek için yapılması gereken minimum tek karakterli düzenleme sayısıdır.

Örneğin, '[email protected]' ve '[email protected]' 1 LD'ye sahiptir - ilk dizeyi ikinciye dönüştürmek için yalnızca bir düzenleme ('o' karakterinin silinmesi) gerekir. Ancak, '[email protected]' ve '[email protected]' 6 LD'ye sahiptir - iki dizeyi eşit hale getirmek için 6 silme işlemi ('yandex' kısmını kaldırarak) gerekir. Bu nedenle, kullanıcı büyük olasılıkla '[email protected]' girmek istemiştir.

Geçici bir e-posta adresini algılama

Geçici e-posta adresleri, tek kullanımlık e- posta adresleri kullanılarak tespit edilir . Wikipedia'dan alınan yaygın tek kullanımlık e-posta adresi ana bilgisayarlarının bir listesini tutar . Bunlar, sağlanan e-posta adresi ile eşleştirilir ve doğrulanır.

MX kayıtlarını kontrol etme

Her e-posta adresi yerel kısım ve etki alanından oluşur.

Mail Exchanger (MX) kaydı, bir alan adı adına e-posta mesajlarını kabul etmekten sorumlu e-posta sunucusunu belirtir. Bu nedenle, hangi MX kayıtlarının geçerli olduğunu bulmak için Düğümün yerleşik 'dns' modülünü kullanarak DNS sunucularını sorgulayabiliriz. Var olmayan veya geçersiz MX kayıtlarına sahip alanlar bir hata oluşturur.

Bu, kütüphanenin dahili olarak yaptığı şeydir.

Bir SMTP sunucusunun çevrimiçi olup olmadığını belirleme

Bir e-posta adresini gerçekten göndermek için, Posta Aktarım Aracısı (MTA), SMTP sunucusuna bağlanmaktan, posta kutusunu sorgulamaktan ve adres varsa e-postayı teslim etmekten sorumludur.

Varsayılan SMTP bağlantı noktası 25'e bağlanmak ve verilen posta kutusunun var olup olmadığını sorgulamak için Düğümün yerleşik 'net' kitaplığını kullanabiliriz. Varsa, sunucu 250 OK mesajıyla yanıt verir. Yukarıdaki işlevsellik bu dosyada uygulanmıştır .

Potansiyel tuzaklar

Bu çözüm oldukça iyi çalışsa da mükemmel değil. Sisteminiz çok sayıda sahte e-posta kaydı alırsa, bir e-postanın var olup olmadığını belirlemek için e-posta gelen kutusuna ping atmak, veritabanınızdaki kötü veri sayısını önemli ölçüde azaltabilir.

Ancak, bu işlevselliği uygulamanıza eklemenin, kodun bakımıyla birlikte gelen zaman ve çabaya değip değmeyeceğini düşünmeye değer.

Aslında çoğu uygulama için bu doğrulama yöntemi tek başına yeterli olmayacaktır. E-posta adresinin tek başına varlığını doğrulamak yerine muhtemelen sahipliğini doğrulamak isteyeceksiniz. Bunu bugün yapmanın en basit ve en verimli yolu, benzersiz bir şekilde tanımlamak için kullanıcının sisteminize tıklayabileceği veya girebileceği bir bağlantı veya kod göndermektir.

Örneğin, '[email protected]' gibi bir e-posta adresini düşünün. Sözdizimsel olarak tamamen geçerli olmasına ve tüm testlerimizi geçmesine rağmen, açıkçası gerçek bir kullanıcıya ait olamaz.

Tüm kötü aktörleri dışarıda tutmak imkansız olduğundan, sisteminizin sağlam bir hesap etkinleştirme ve devre dışı bırakma biçimi uyguladığından emin olun. Yalnızca etkinleştirilen (doğrulanan) kullanıcılar uygulamanızın önemli kısımlarına erişebilmelidir. Depolama ucuzdur. Tek bir e-posta adresi ve rastgele doldurulmuş diğer sütunlar, uygulamanızda ciddi spam sorunları olmadığı sürece depolama alanınızı zedelemeyecektir.

Son olarak, bu uygulamanın kodu burada bulunabilir.