Zaman sekarang ini ada sangat banyak cyber army berkeliaran dimana-mana. Mereka sangat suka membuat akun-akun palsu, akun-akun duplikat, spam, dan segala macamnya yang sangat mengganggu. Kalau misalnya sistem / website kita mempunyai fitur login/registrasi, apakah Anda sudah melakukan filtering dan validasi email dengan ketat? Di post kali ini saya akan membagikan trik spam apa saja yang umum dilakukan, beserta script pencegahannya. 

 

1. Registrasi Menggunakan Email yang Tidak Pernah Ada

Ini adalah trik spam yang paling standar, dimana ketika user mendaftar di website kita menggunakan alamat email yang sebenarnya tidak pernah ada. Misalnya 'blabla@qhwebasd.com', 'keongracun@adasd8wj.co.id', dan sebagainya. Tentu saja trik spam semacam ini nggak terlalu ngefek untuk sistem web yang mewajibkan user melakukan validasi dengan mengirimkan kode ke email yang bersangkutan

 

2. Registrasi Menggunakan Disposable Email

Kalau kita googling "disposable email", maka kita akan menemukan sangat banyak aplikasi online gratis yang menawarkan jasa email sekali pakai. Jadi user bisa dengan mudah membuat email palsu. Cara paling masuk akal melawan trik ini adalah dengan melakukan blacklist pada domain tertentu. Cukup repot, tapi nggak terlalu sulit diterapkan kok.

 

3. Registrasi Menggunakan Email Google

Wait, memang apanya yang salah kalau user registrasi menggunakan email google? Emang nggak salah sih, tapi Google punya sebuah "fitur" yang sebenarnya cukup membantu, tapi jika disalahgunakan justru bisa jadi sarang spam. Coba cek screenshot dibawah ini 

dan juga ini

Merasa ada yang aneh? Ya, sebagai contoh email saya yang sebenarnya adalah tianrosandhy[at]gmail.com, tapi Google juga akan mengizinkan seluruh email dengan nama tersebut sekalipun disisipi tanda titik sebanyak apapun pada usernamenya. Artinya, saya bisa login dengan banyak username seperti : tian.rosandhy, ti.an.ro.sa.nd.hy, tian.....rosandhy, dan gabungan2 lainnya. 

Dengan kata lain, sistem registrasi di web kita masih rawan spam user jika pengguna dengan email berbeda tapi sama tersebut masih lolos atau dianggap berbeda. Cara mengatasinya adalah dengan memformat ulang email yang diinputkan user khusus untuk domain gmail. Format ulang tersebut hanya menghilangkan tanda titik pada email google sebelum disimpan ke database.

 

 

Sekian teorinya, sekarang saya akan membagikan script validasi email yang bisa kita terapkan. Scriptnya saya siapkan dalam model berbasis objek supaya bisa mudah disesuaikan baik untuk PHP native maupun framework. 

<?php
namespace TianRosandhy;

Class MailValidator{

	public 
		$email,
		$name,
		$host,
		$blacklist,
		$error;

	public function __construct($email=''){
		#email dipecah menjadi name dan host
		$pecah = explode('@', $email);
		if(count($pecah) == 2){
			$this->name = $pecah[0];
			$this->host = $pecah[1];
		}

		#langsung jalankan reformat gmail (menghilangkan titik khusus di host gmail)
		self::reformatGmail($email);
		
		/**
		* contoh file blacklist
		* @source : https://raw.githubusercontent.com/desbma/referer-spam-domains-blacklist/master/spammers.txt
		*/
		#kalau punya file blacklist sendiri juga bisa dipakai
		$file = 'blacklist.tx';
		if(!is_file($file)){
			#source default asli
			$file = 'https://raw.githubusercontent.com/desbma/referer-spam-domains-blacklist/master/spammers.txt';
		}

		$this->blacklist = file_get_contents($file);
	}

	protected function reformatGmail(){
		if($this->host == 'gmail.com'){
			//abaikan seluruh tanda titik jika ada
			$formattedName = str_replace('.', '', $this->name);
			$this->email = $formattedName . '@' . $this->host;
		}
		else{
			$this->email = $this->name . '@' . $this->host;
		}
	}


	public function validate(){
		self::basic_validation();
		self::check_dns();
		self::check_blacklist();

		#jika tidak ada error ditemukan, return email yang sudah direformat
		if(count($this->error) == 0){
			return $this->email;
		}
		else{
			return [
				'error' => $this->error
			];
		}
	}



	#validasi dasar untuk mengecek apakah email sudah diinput dalam format yang sesuai atau tidak
	protected function basic_validation(){
		$cek = filter_var($this->email, FILTER_VALIDATE_EMAIL);
		if(!$cek){
			$this->error = 'Invalid email format specified';
		}
	}

	#memeriksa apakah host pada email yang diinputkan masuk ke blacklist atau tidak
	protected function check_blacklist(){
		$list = preg_split("/[\r\n]+/", $this->blacklist);
		if(in_array($this->host, $list)){
			$this->error = 'Sorry, your mail provider listed in blacklisted domain.';
		}
		return false;
	}

	#memeriksa apakah host pada email yang diinputkan merupakan website yang aktif, atau website tidak aktif
	protected function check_dns(){
		if(strlen($this->host) > 0){
			if(checkdnsrr($this->host, 'MX')){
				return false;
			}
		}
		$this->error = 'Sorry, your email contain invalid host specified. Please check again';
	}

}

 

Class validasinya cukup simpel kan ya, nggak sampai 100 baris. Inti dari script tersebut adalah, ada 3 metode validasi yang dilakukan disana (basic_validation, check_blacklist, dan check_dns). Selain itu juga ada dilakukan format ulang email di method reformatGmail. Sekarang kita akan tes class tersebut, saya menggunakan PHP native biasa saja untuk pengujiannya, berikut ini contoh script pengujiannya

<?php
require ('MailValidator.php');
?>
<!doctype html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
<form action="" method="get">
	<input type="text" name="email">
	<button type="submit">Proses</button>
</form>
<?php
use TianRosandhy\MailValidator;
if(isset($_GET['email'])){

	$vmail = new MailValidator($_GET['email']); //mendaftarkan email ke __construct()
	echo '<textarea style="width:100%; height:300px;">';
	print_r($vmail->validate()); //ini adalah script validasi sekaligus mengembalikan nilai email yang valid
	echo '</textarea>';
}
?>
</body>
</html>

 

Apabila dijalankan, kita dapat menginput contoh email pada textbox yang tersedia untuk melihat output yang ditampilkan dari berbagai email yang diinputkan. Jika email tidak valid, maka akan muncul array error untuk diolah kembali, dan jika email valid, maka sistem akan mengembalikan email dalam bentuk normal tanpa titik-titik. Email yang sudah divalidasi ini baru deh aman untuk kita olah, Berikut ini contoh screenshot hasil output class validasi dengan berbagai inputan yang berbeda-beda

 

 

Demikian snippet validasi email yang bisa saya bagikan, kalau ada pertanyaan atau trik lainnya yang belum dimasukkan boleh dishare di kolom komentar dibawah ya..

 

[Males baca, dan mau langsung download source codenya? Download langsung disini]