PHP скрипт электронной почты


Это мой первый скрипт ООП в PHP написать скрипт, предназначенный для сайта, я работаю на: ndkutz(.)чистая. Я хочу, чтобы пользователь мог отправить письмо владельцу парикмахерской с сайта. Я самоучка и хотя я знаю, что я на правильном пути, я чувствую себя абсолютно потерянной. Мой код хорош?

<?php

 $error = '';
 $errormsg = '';
 $finalMessage = '';
 $finalName = '';
 $finalSubject = '';
 $finalTo = '';
 $finalHeader = '';
 $sendingEmail = '';

class emailConstruction 
{
    private $from = "";
    private $name = "";
    private $message = "";

    public function scrubAll($data) {
        $data = htmlspecialchars($data);
        $data = trim($data);
        $data = strip_tags($data);
        return $data;
    }

    public function setfrom($from){
        $this->from = stripslashes($from);
        $this->from = $from;
    }

    public function getFrom(){
        return $this->from;
    }

    public function setName($name){
        $this->name = scrubAll($name);
        $this->name = $name;
    }

    public function getName(){
        return $this->name;
    }


    public function setMessage($message){
        $this->message = scrubAll($data);
        $this->message = wordwrap($data,70,"<br />");
        $this->message = $message;
    }

    public function getMessage(){
        return $this->message;
    }
}

if(isset($_POST['submit']))
    {
        if(empty($_POST['uname']))
        {
            $error = 1;
            $errormsg = "Your name is required.";
            return false;
        }else{
            $error = 0;
            $createEmail = new emailConstruction;
            $createEmail->setName($_POST['uname']);
        }
        if(empty($_POST['umail']))
        {
            $error = 1;
            $errormsg = "Email address required.";
            return false;
        }else {
            $error = 0;
            $createEmail =  new emailConstruction;
            $createEmail->setTo($_POST['umail']);
        }
        if(empty($_POST['umsg']))
        {
            $error = 1;
            $errormsg = "Message is required";
            return false;
        }else{
            $error = 0;
            $createEmail = new emailConstruction;
            $createEmail->setMessage($_POST['umsg']);
        }
        if($error = 0)
        {   $finalHeader = 'from:' . $finalFrom;
            $finalHeader .='MIME-Version: 1.0\r\n';
            $finalHeader .='Content-type: text/html\r\n';
            $finalMessage = $createEmail->getMessage();
            $finalName = $createEmail->getName();
            $finalSubject = 'New potiential client by the name of ' . $finalName;
            $finalTo = $createEmail->getTo();

            $sendingEmail = mail($finalTo,$finalSubject,$finalMessage,$finalHeader);
            if($sendingEmail == true)
            {
                $emailMessageS = 'Email sent successfully!';
            }else{
                $emailMessageF = 'Error. Please try again!';
            }
        }
    }
?> 


126
1
задан 6 апреля 2018 в 01:04 Источник Поделиться
Комментарии
2 ответа

Есть несколько вопросов для рассмотрения

ООП

Во-первых, это хорошее намерение, но очень плохая реализация.
Класс должен быть сделан на цель, но цель этого класса являются неопределенными. Зачем нужен класс, который просто готовит данные, а не класс, который посылает сам написать?

На вашем месте я бы создал класс, который имеет методы, как setSubject(), setTo(), setBody() и - самое главное - send(). Такой класс будет иметь очень хорошее применение.

Культ карго код

Без обид, но каждый оператор в коде должно быть оправдано. Написание определенного оператора только потому, что вы видели раньше где-то делает культ карго код (имя из истории про дикарей на островах Тихого океана создают соломенные самолеты во время Второй мировой войны в надежде, что те принесут грузов так хорошо, как реальные). К сожалению, почти никто из них не. Взять scrubAll() способ например.


  • htmlspecialchars() и strip_tags() взаимное эксклюзивными функциями. Как только вы запустите бывший, последний найдете ничего, чтобы прокладки. вы должны применять только один из них, и он должен быть htmlspecialchars() так как он наносит меньше вреда

  • trim() может быть полезно, но я не думаю, что это необходимо в данном случае

поэтому он делает свои функции scrubAll довольно бесполезным.


  • stripslashes() используется в setfrom() абсолютно никакой пользы. Его можно было бы использовать при некоторых условиях 10 лет назад, но в 2018 году он не имеет никакого смысла называть ее на всякий случай. Мне пришлось использовать его только один раз в последние 5 лет, чтобы исправить неверную строку в формате JSON.

Безопасности.

Как ни странно, но несмотря на все эти препараты, ваш код по-прежнему уязвимы для Почты инъекций нападения. С вводом пользователя вводят прямо в заголовки это просто хрестоматийный пример.

В лучшем случае, вы никогда не должны положить что-нибудь от ввода пользователя в заголовки сообщений. Оставим в покое "от:" заголовка, который, скорее всего, ваше письмо в спам.

Если вы хотите стать хорошим способом для того, чтобы ответить, заставить его "ответить:" в заголовке и проверить адрес Вашей электронной почты, пример мог быть взят прямо из справочной страницы.

Заключение.

Итак, вынимаем все геттеры из своего класса, назовем его "с sendmail", удалить ненужные функций и добавить метод send (), который должен взять код, который находится в глобальной области видимости сейчас

Для типового примера вы можете взглянуть на PHPMailer использование примеров. Это не значит, что я прошу вас написать нечто подобное, но просто смотреть на то, как его называют в этих примерах.

1
ответ дан 6 апреля 2018 в 12:04 Источник Поделиться

Один момент, что должно быть сделано о вашем коде это:

public function setfrom($from){
$this->from = stripslashes($from);
$this->from = $from;
}

Ваш setfrom() способ получения $from переменной. Вы зачистите черту от него и присвоить результат $this->from.

Но потом, переназначить $this->from быть равен первоначальному долл. Так что, по сути, проигнорированы первой линии.

Это как это:


  • Я послал по электронной почте документ Word.

  • Вы отредактируйте документ и сохраните его как новый файл. (в линии 1
    способ)

  • Вы берете мой оригинал документа и вставить его на копию, которую вы только
    редактировать. (в строке 2)

Вы этого еще пару раз:

public function setName($name){
$this->name = scrubAll($name);
$this->name = $name;
}

public function setMessage($message){
$this->message = scrubAll($data);
$this->message = wordwrap($data,70,"<br />");
$this->message = $message;
}

В каждом случае, удалить последнюю строку каждой функции. Вы уже определитесь $this->name или $this->message.

Кроме того, вы можете использовать несколько функций от одной переменной. Для этого последний кусок кода, Вы могли бы написать только это, чтобы достичь того же результата:

public function setMessage($message) {
$this->message = wordwrap(scrubAll($data), 70, "<br>");
}

0
ответ дан 6 апреля 2018 в 01:04 Источник Поделиться