Bu güvenli bir PHP posta işlevi mi?

2 Cevap php

I finally Bu PHP e-posta komut dosyası (... localhost işe yaramadı) çalışan, ama benim endişe güvenli değil olmasıdır var.

Yani - bu spam ve ben farkında değilim, başka bir güvenlik tuzaklar için güvenli mi?

<?php
$email = 'notification@domain.com';
$subject = 'Notify about stuff';
$notify = $_REQUEST['email'];

if (!preg_match("/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/", $notify)) {
    echo "<h4>Your email address doesn't validate, please check that you typed it correct.</h4>";
    echo "<a href='javascript:history.back(1);'>Back</a>";
}

elseif(mail($email, $subject, $notify)) {
    echo "<h4>Thank you, you will be notified.</h4>";
} else {
    echo "<h4>Sorry, your email didn't get registered.</h4>";
}
?>

İlgisiz: yerine ben kullanabileceğiniz bir PHP fonksiyonu var javascript:history.back(1)?

Edit: filter yerine RegEx'in kullanarak komut dosyası

<?php
$email = 'notification@domain.com';
$subject = 'Notify about stuff';
$notify = $_REQUEST['email'];

if (!filter_var($notify, FILTER_VALIDATE_EMAIL)) {
    echo "<h4>This email address ($notify) is not considered valid, please check that you typed it correct.</h4>";
    echo "<a href='javascript:history.back(1);'>Back</a>";
}

elseif(mail($email, $subject, $notify)) {
    echo "<h4>Thank you, you will be notified.</h4>";
} else {
    echo "<h4>Sorry, your email didn't get registered.</h4>";
}
?>

2 Cevap

Id kullanımı $_SERVER['HTTP_REFERER'] geri gitmek eğer ben bilmiyorum. O isteği ile ayarlanan beri saldırıya açık bırakmak gibi hissediyorum. Bunu yapmak için yolu önceki sayfada oturumları kullanmak olacaktır. Bu şekilde sitenizin üzerine güvenilmez veri damping değiliz.

Ben herhangi bir güvenlik riski görmüyorum, ama id e-postaların geçerliliğini kontrol ederken filter kullanımını önermek istiyorum. Onun REs ile karıştırmasını çok daha kolay.

Tüm geçerli şekilde oluşturulmuş e-posta adresleri kabul ve tüm geçerli olmayan birini reddetmek istiyorsanız sadece sıradanifade kısa sıradanifade desen karşı bir e-posta adresi maç olamaz. Bir ayrıştırıcı kullanın (1, 2) aslında geçerliliğini denetlemek için ilgili RFC'lere karşı uygulamak.

Yapabileceğiniz başka şeyler Chacha102 önce belirtildiği gibi emin istek, etki içinden gelen yapmak için HTTP_REFERER kontrol ediyor. Sadece tüm ajan HTTP_REFERER göndermek değil unutmayın, ve isteğe bağlı olarak kapalı veya kullanıcılar tarafından sahte olabilir ki.

Emin onlar size geçerli bir e-posta adresi vererek yapmak için ekstra mil gitmek istiyorsanız, (A, MX, veya AAAA) belirtilen etki alanındaki posta sunucuları için varolan DNS kayıt için kontrol edebilirsiniz. Ve bunun üstüne, geri arama doğrulama yapabilirsiniz. Yani posta sunucusuna bağlanmak nerede, size bu e-posta adresine göndermek istediğiniz söylemek ve onlar Tamam derseniz bakın bulunuyor.

Arama doğrulama için, hatta bir garanti değildir bu yüzden sunucular her şeyi Tamam söylemek grilisteleme dikkat etmelisiniz. İşte böyle bir komut dosyası gerektiğinde ben kullanılan bazı kod. Bu (1) gelen çözümleyici üzerine bir yama.

    #
    # Email callback verification
    # Based on http://uk2.php.net/manual/en/function.getmxrr.php
    #

    if (strlen($bits['domain-literal'])){
        $records = array($bits['domain-literal']);
    }elseif (!getmxrr($bits['domain'], $mx_records, $mx_weight)){
        $records = array($bits['domain']);
    }else{
        $mxs = array();

        for ($i = 0; $i < count($mx_records); $i++){
            $mxs[$mx_records[$i]] = $mx_weight[$i];
        }

        asort($mxs);

        $records = array_keys($mxs);
    }

    $user_okay = false;
    for ($j = 0; $j < count($records) && !$user_okay; $j++){
        $fp = @fsockopen($records[$j], 25, $errno, $errstr, 2);
        if($fp){
            $ms_resp = "";

            $ms_resp .= send_command($fp, "HELO ******.com");
            $ms_resp .= send_command($fp, "MAIL FROM:<>");

            $rcpt_text = send_command($fp, "RCPT TO:<" . $email . ">");
            $ms_resp .= $rcpt_text;

            $ms_code = intval(substr($rcpt_text, 0, 3));
            if ($ms_code == 250 || $ms_code == 451){ // Accept all user account on greylisting server
                $user_okay = true;
            }

            $ms_resp .= send_command($fp, "QUIT");

            fclose($fp);
        }
    }

return $user_okay ? 1 : 0;