Это очень расплывчатый вопрос, который, вероятно, приведет к тому, что вы получите близкие голоса за то, что слишком широки, и вы, похоже, упустили из виду ресурсы, которые очень легко найти.
В PHPMailer есть два файла, в которых приведены примеры , как отправлять один файл , и , как отправлять несколько файлов , и это абсолютно то, на чем вы должны основывать свой код. .
Что касается "стандартов 2019 года", то они не очень отличаются от стандартов последних 10 лет. В основном это сводится к простым вещам:
- очистить ваши входные данные (удалить то, что, по вашему мнению, плохо)
- подтвердите свои данные (проверьте, что то, что у вас осталось, выглядит так, как вы ожидаете)
- экранировать вывод соответствующим образом для его контекста (например, экранирование HTML не подходит для записи данных в файл CSV)
Так, например, в своем коде вы делаете это:
$email = ((isset($_POST['Email']))&&(!is_null($_POST['Email'])))? $_POST['Email']:'';
Это проверяет, что поле электронной почты существует, вот и все. Для всех, кого вы знаете, это может быть PDF-файл «Войны и мира» в кодировке base64, и он все равно пройдет эту проверку. Вы можете сделать ту же проверку в меньшем количестве кода в последних версиях PHP с оператором null coalesce :
$email = $_POST['Email'] ?? '';
Однако, это все еще не делает никакой фильтрации или проверки. PHPMailer обеспечивает автоматическую проверку адреса электронной почты для любого метода, который принимает адрес, поэтому вы можете использовать это:
if (!isset($_POST['email']) || !$mail->addReplyTo($_POST['Email'])) {
die('Invalid email address');
}
Кстати, это правильный способ использовать адреса отправителя в контактных формах; вы не помещаете его в исходный адрес (потому что это будет подделка), но вы все равно сможете ответить отправителю, когда получите сообщение.
Другим примером является ваше поле Agree18
; это флажок, и поэтому он должен либо вообще не существовать (если флажок не был установлен), либо существовать и иметь значение yes
(хотя вы можете игнорировать это значение - его наличия достаточно). Таким образом, принудительно применяет этот шаблон - ваш существующий код будет принимать абсолютно все в этом поле (помните, что HTML не является какой-либо защитой от этого). Так что вы могли бы сказать:
$agree18 = isset($_POST['Agree18']) ? 'yes' : 'no';
Теперь нет никакой возможности, чтобы через это поле можно было что-то плохое; если он существует, это yes
, в противном случае это no
. Чисто, просто и безопасно.
Основное правило для экранирования вывода - не отображать ничего, что было предоставлено пользователем. Например, это широко открыто для атаки XSS:
echo $_POST['Email'];
Это намного безопаснее:
echo htmlspecialchars($_POST['Email'], ENT_QUOTES);
и будет еще безопаснее, если вы уже подтвердите, что он содержит действительный адрес электронной почты.
В любом случае, у вас уже должна быть идея.