PHP Güvenli E-posta
- Önceki Sayfa PHP E-posta
- Sonraki Sayfa PHP Hata
Bir önceki bölümden PHP e-posta betiğinde bir güvenlik açığı vardır.
PHP E-posta İçi
Öncelikle, bir önceki bölümden PHP koduna bakın:
<html> <body> <?php if (isset($_REQUEST['email'])) //eğer "email" doldurulmuşsa, e-posta gönder { //e-posta gönder $email = $_REQUEST['email'] ; $subject = $_REQUEST['subject'] ; $message = $_REQUEST['message'] ; mail("someone@example.com", "Subject: $subject", $message, "From: $email" ); echo "Thank you for using our mail form"; } else //eğer "email" doldurulmamışsa, formu göster { echo "<form method='post' action='mailform.php'> E-posta: <input name='email' type='text' /><br /> Konu: <input name='subject' type='text' /><br /> Mesaj:<br /> <textarea name='message' rows='15' cols='40'> </textarea><br /> <input type='submit' /> </form>"; } ?> </body> </html>
Bu kodun içindeki sorun, izinsiz kullanıcıların formu kullanarak e-posta başlığına veri eklemesi olabilir.
Eğer kullanıcı formdaki metin kutularına bu metinleri eklerse ne olur?
someone@example.com%0ACc:person2@example.com %0ABcc:person3@example.com,person3@example.com, anotherperson4@example.com,person5@example.com %0ABTo:person6@example.com
Gibi, mail() fonksiyonu yukarıdaki metni e-posta başlığına koyar, bu yüzden şimdi başlıkta ekstra Cc:, Bcc: ve To: alanları var. Kullanıcı gönder butonuna tıkladığında, bu e-posta yukarıdaki tüm adreslere gönderilecek!
PHP E-posta Enjekte Önleme
E-posta enjekte edilmesini önlemek için en iyi yöntem, girişleri doğrulamaktır.
Aşağıdaki kod, önceki bölüme benzerdir, ancak formdaki e-posta alanının girdi doğrulama programını artırdık:
<html> <body> <?php function spamcheck($field) { //filter_var() e-posta'yı temizler $field=filter_var($field, FILTER_SANITIZE_EMAIL); //filter_var() e-posta'yı doğrular if(filter_var($field, FILTER_VALIDATE_EMAIL)) { return TRUE; } else { return FALSE; } } if (isset($_REQUEST['email'])) //"e-posta" doldurulmuşsa, devam et //e-posta adresinin geçersiz olup olmadığını kontrol et $mailcheck = spamcheck($_REQUEST['email']); if ($mailcheck==FALSE) { echo "Geçersiz girdi"; } else //gönder e-posta $email = $_REQUEST['email'] ; $subject = $_REQUEST['subject'] ; $message = $_REQUEST['message'] ; mail("someone@example.com", "Subject: $subject", $message, "From: $email" ); echo "Thank you for using our mail form"; } } else //if "email" is not filled out, display the form echo "<form method='post' action='mailform.php'> E-posta: <input name='email' type='text' /><br /> Konu: <input name='subject' type='text' /><br /> Mesaj:<br /> <textarea name='message' rows='15' cols='40'> </textarea><br /> <input type='submit' /> </form>"; } ?> </body> </html>
Yukarıdaki kodda, girdiyi doğrulamak için PHP filtreleyicisini kullandık:
- FILTER_SANITIZE_EMAIL e-postanın yasadışı karakterlerini dize'den kaldırır
- FILTER_VALIDATE_EMAIL e-posta adresini doğrular
Sitemizde PHP FiltreleyiciBu bölümde filtreleyici hakkında daha fazla içerik okuyabilirsiniz.
- Önceki Sayfa PHP E-posta
- Sonraki Sayfa PHP Hata