2019 Как использовать PHPMailer V6.0.7 и PHP для отправки нескольких вложений из веб-формы - PullRequest
0 голосов
/ 14 июня 2019

Каков наилучший способ отправки нескольких вложений с помощью PHP Mailer v6.0.7 и PHP на 2019 год?Я читал разные методы, и некоторые говорят, что это неправильно из-за проблем с безопасностью, и времена постоянно меняются.Я также использую сервер живого хостинга.Я добавил Focus Point ---------------- к коду.

На самом деле я ничего не сделал, потому что я не уверен, каковы лучшие практики 2019 года.Я прочитал много дубликатов, и этот тоже может стать флагом, но они содержат много PHP-кода Good и Bad, и какой из них по-прежнему лучший в 2019 году, кто знает.Я буду использовать свой последний рабочий пример из моего другого поста, но я хочу добавить вложения.

Мой фокус - правильный PHP для правильной загрузки одного файла и нескольких вложений, пример $ Mail-> Attachement и, если действительно безопасно загружать файлы на живой сервер во временном каталоге и в HTML-кодеподходит для вложений, которые я предполагаю, что они уже есть.

<?php 
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
use PHPMailer\PHPMailer\SMTP; <- This fixed most of my issues but not always required per Sychro
require 'PHPMailer/Exception.php';
require 'PHPMailer/PHPMailer.php';
require 'PHPMailer/SMTP.php';



$mail = new PHPMailer(true);

if(isset($_POST[‘submit’]))
 { <--- Added Opening

$first_name = ((isset($_POST['FirstName']))&&(!is_null($_POST['FirstName'])))? $_POST['FirstName']:'';
$last_name = ((isset($_POST['LastName']))&&(!is_null($_POST['LastName'])))? $_POST['LastName']:'';
$email = ((isset($_POST['Email']))&&(!is_null($_POST['Email'])))? $_POST['Email']:'';
$age = ((isset($_POST['Age']))&&(!is_null($_POST['Age'])))? $_POST['Age']:'';
$student = ((isset($_POST['Student']))&&(!is_null($_POST['Student'])))? $_POST['Student']:'';
$agree18 = ((isset($_POST['Agree18']))&&(!is_null($_POST['Agree18'])))? $_POST['Agree18']:'';


Focus Point ----------------
Any Security PHP Code for Uploaded Files Updated to 2019 Standards 
----------------------------


Note: Hosting Service should provide this infor to you.
----------    
$mail->isSMTP(); 
$mail->SMTPDebug = 2; // 0 = off (for production use) - 1 = client messages - 2 = client and server messages
$mail->Host = 'mail.email.org'; 
$mail->SMTPSecure = 'ssl'; <-Could be TLS 
$mail->Port = 465; <- Could be 587 or 25
$mail->SMTPAuth = true;
$mail->Username = 'Mail@email.org'; <-To access your Hosting email
$mail->Password = 'Password'; 

 /* Set the mail sender. */
$mail->setFrom('Mail@email.org'); <- From Myself
$mail->addAddress('Mail@email.org'); <-To Myself

$mail->Subject = 'Research Requested';

$mail->isHTML(TRUE);
$mail->Body = '<html> First Name: '.$first_name.' Last Name:  '.$last_name.' Email: '.$email.' Age: '.$age.' Student: '.$student.' Agree18: '.$agree18.'

';

Focus Point ----------------
$mail->addAttachment('File Path', 'Type');  
----------------------------
$mail->send()
} <--Added Closing

?>

<!DOCTYPE html>
<html lang="en">
<head>

</head>
<body>

<div class="container">

<form  method="POST" enctype=multipart/form-data action="#"> <--added #  

<h4>Want to Learn More? Please fill out the form below.</h4>
 <div class="form-group">
<label for="FirstName">First Name:</label>
<input type="text" class="form-control" name="FirstName" id="FirstName" placeholder="First Name" required="">
</div>

<div class="form-group">
<label for="LastName">Last Name:</label>
<input type="text" class="form-control" name="LastName" id="LastName" placeholder="Last Name"required="">

<div class="form-group">
<label for="Age">How old are you?</label>
<input type="text" class="form-control"  name="Age" id="Age" placeholder="Age"required="">
</div>

<div class="form-group">
<label for="Email">Email:</label>
<input type="email" class="form-control"  name="Email" id="Email" placeholder="Mail@help.org" required="">

<h4Please Select if your a Student?</h4>
<div><small class="form-text text-muted">
    Select all that apply.

<div class="custom-control custom-checkbox">
<input type="checkbox" class="custom-control-input"  name="Student" id="Student" value="Yes" >
<label class="custom-control-label" for="Student">Student</label>

Focus Point ----------------
<h4>Please upload a Photo:</h4> 
<br>
<div class="form-group">
<label for="Photo">Photo</label>
<input type="file" class="form-control-file" id="Photo">

<div class="form-group">
<label for="Photo2">Photo 2</label>
<input type="file" class="form-control-file" id="Photo2">

---------------------------------------------

<h4>Please agree to the following:</h4>

<div class="custom-control custom-checkbox">
<input type="checkbox" class="custom-control-input"  name="Agree18" id="Agree18" value="Yes" required="" > 
<label class="custom-control-label" for="Agree18">I can prove I am 18 years or older. I am legal age to participate according to my country. Proof may be required by law.</label>

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

<div class="submit">
<button type="submit" name="submit" class="btn btn-primary">Send <i class="fa fa-lock"></i></button>




</form>  
</div>

Я надеюсь получить обновленный пример, который работает и соответствует стандарту 2019 года с учетом безопасности.Я надеюсь получить один пример для загрузки одного файла и один пример для загрузки нескольких файлов из веб-формы.Я также хотел бы получить подробное объяснение каждой части и почему она работает таким образом, если это возможно.Я хочу поиграть с вложениями, но так и не понял, что происходит.

1 Ответ

0 голосов
/ 14 июня 2019

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

В 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);

и будет еще безопаснее, если вы уже подтвердите, что он содержит действительный адрес электронной почты.

В любом случае, у вас уже должна быть идея.

...