Email Aman PHP
Ada kelemahan di skrip e-mail PHP di bagian sebelumnya.
PHP E-mail Injeksi
Pertama, lihat kode PHP di bagian sebelumnya:
<html> <body> <?php if (isset($_REQUEST['email'])) //jika "email" diisi, kirim email { //kirim email $email = $_REQUEST['email'] ; $subject = $_REQUEST['subject'] ; $message = $_REQUEST['message'] ; mail("someone@example.com", "Tajuk: $subject", $message, "Dari: $email" ); echo "Terima kasih kerana menggunakan borang e-mel kami"; } else //jika "email" belum diisi, tampilkan formulir { echo "<form method='post' action='mailform.php'> E-mel: <input name='email' type='text' /><br /> Tajuk: <input name='subject' type='text' /><br /> Pesan:<br /> <textarea name='message' rows='15' cols='40'> </textarea><br /> <input type='submit' /> </form>"; } ?> </body> </html>
Masalah yang ada dalam kode di atas adalah pengguna yang belum berhak dapat memasukkan data di header email melalui formulir yang diisi.
Jika pengguna menambahkan teks ini ke dalam kotak input formulir, apa yang akan terjadi?
someone@example.com%0ACc:person2@example.com %0ABcc:person3@example.com,person3@example.com, anotherperson4@example.com,person5@example.com %0ABTo:person6@example.com
seperti biasa, fungsi mail() mengisi teks di atas ke kop surat, jadi sekarang kop memiliki keterangan tambahan Cc:, Bcc: serta medan To:. Ketika pengguna mengklik tombol submit, e-mail ini akan dihantar ke semua alamat di atas!
Pencegahan E-mail PHP
cara terbaik untuk mencegah pemasukan e-mail adalah untuk memvalidasi input.
Kod di bawah ini hampir sama seperti di bab sebelumnya, tetapi kami telah menambahkan program pengesahan input untuk medan email dalam borang:
<html> <body> <?php function spamcheck($field) { //filter_var() membersihkan e-mel $field=filter_var($field, FILTER_SANITIZE_EMAIL); //filter_var() memvalidasi e-mel if(filter_var($field, FILTER_VALIDATE_EMAIL)) { return TRUE; } else { return FALSE; } } if (isset($_REQUEST['email'])) //jika "email" diisi, lanjutkan //cek jika alamat email tidak sah $mailcheck = spamcheck($_REQUEST['email']); if ($mailcheck==FALSE) { echo "Input tidak sah"; } else //hantar email $email = $_REQUEST['email'] ; $subject = $_REQUEST['subject'] ; $message = $_REQUEST['message'] ; mail("someone@example.com", "Tajuk: $subject", $message, "Dari: $email" ); echo "Terima kasih kerana menggunakan borang e-mel kami"; } } else {//jika "email" belum diisi, papar borang echo "<form method='post' action='mailform.php'> E-mel: <input name='email' type='text' /><br /> Tajuk: <input name='subject' type='text' /><br /> Pesan:<br /> <textarea name='message' rows='15' cols='40'> </textarea><br /> <input type='submit' /> </form>"; } ?> </body> </html>
Dalam kod di atas, kami menggunakan penapis PHP untuk mengesahkan input:
- FILTER_SANITIZE_EMAIL menghapus aksara yang haram daripada alamat e-mel daripada string
- FILTER_VALIDATE_EMAIL mengesahkan alamat e-mel
Anda boleh dalam Penapis PHPBaca lebih banyak tentang penapis di dalam bab ini.