Changes - Minor - Réécriture du code, pour plus de lisibilité, et pour intégrer l'usage de msmtp
This commit is contained in:
parent
9d0dd582b8
commit
f26c38fa5e
1 changed files with 77 additions and 92 deletions
123
form.php
123
form.php
|
@ -1,24 +1,34 @@
|
||||||
<?php
|
<?php
|
||||||
session_start();
|
// Pour le bon fonctionnement du script, mettre session_start(); au tout début de la page de contact, avant tout autre chose, avant le code html. Sinon la suite ne fonctionnera pas.
|
||||||
|
|
||||||
// Générer ou récupérer le token CSRF
|
// Générer ou récupérer le token CSRF
|
||||||
if (empty($_SESSION['csrf_token'])) {
|
if (empty($_SESSION['csrf_token'])) {
|
||||||
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
|
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Rendre le script plus facile à personnaliser avec des variables.
|
// Charger la configuration et les traductions
|
||||||
$config = include('form_config.php');
|
$config = include('form_config.php');
|
||||||
// Et multilingue !
|
|
||||||
include 'form_lang.php';
|
include 'form_lang.php';
|
||||||
|
|
||||||
// Fonction pour échapper les sorties
|
// Fonction pour échapper les données
|
||||||
function escape($data) {
|
function escape($data) {
|
||||||
return htmlspecialchars($data, ENT_QUOTES, 'UTF-8');
|
return htmlspecialchars($data, ENT_QUOTES, 'UTF-8');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Fonction pour envoyer un mail avec msmtp
|
||||||
|
$account = $config['account_msmtp'];
|
||||||
|
function msmtp_send($to, $subject, $message, $headers, $account) {
|
||||||
|
$emailContent = "To: $to\nSubject: $subject\n$headers\n\n$message\n";
|
||||||
|
$cmd = "echo " . escapeshellarg($emailContent) . " | msmtp --account=$account $to 2>&1";
|
||||||
|
exec($cmd, $output, $returnVar);
|
||||||
|
return $returnVar === 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Vérifier l'action soumise
|
||||||
|
$action = isset($_POST['action']) ? $_POST['action'] : '';
|
||||||
|
|
||||||
// Générer ou récupérer la question antispam
|
// Générer ou récupérer la question antispam
|
||||||
if (!isset($_SESSION['current_question']) || isset($_POST['new_question'])) {
|
if ($action === 'new_question' || !isset($_SESSION['current_question'])) {
|
||||||
// Choisir une question aléatoire
|
// Choisir une nouvelle question aléatoire
|
||||||
$questions_list = array_keys($txt['questions']);
|
$questions_list = array_keys($txt['questions']);
|
||||||
$current_question = $questions_list[array_rand($questions_list)];
|
$current_question = $questions_list[array_rand($questions_list)];
|
||||||
$correct_answers = $txt['questions'][$current_question];
|
$correct_answers = $txt['questions'][$current_question];
|
||||||
|
@ -32,101 +42,76 @@ if (!isset($_SESSION['current_question']) || isset($_POST['new_question'])) {
|
||||||
$correct_answers = $_SESSION['correct_answers'];
|
$correct_answers = $_SESSION['correct_answers'];
|
||||||
}
|
}
|
||||||
|
|
||||||
// La partie PHP du formulaire
|
// Vérification de l'envoi du formulaire
|
||||||
// Récuperation des valeurs en GET ou en POST
|
$try = isset($_POST['try']) ? $_POST['try'] : '';
|
||||||
$try = isset($_GET['try']) ? $_GET['try'] : (isset($_POST['try']) ? $_POST['try'] : '');
|
$nobotv = isset($_POST['nobotv']) ? $_POST['nobotv'] : '';
|
||||||
$nobotv = isset($_GET['nobotv']) ? $_GET['nobotv'] : (isset($_POST['nobotv']) ? $_POST['nobotv'] : '');
|
$nobotc = isset($_POST['nobotc']) ? $_POST['nobotc'] : '';
|
||||||
$nobotc = isset($_GET['nobotc']) ? $_GET['nobotc'] : (isset($_POST['nobotc']) ? $_POST['nobotc'] : '');
|
$nobots = isset($_POST['nobots']) ? $_POST['nobots'] : '';
|
||||||
$nobots = isset($_GET['nobots']) ? $_GET['nobots'] : (isset($_POST['nobots']) ? $_POST['nobots'] : '');
|
|
||||||
|
|
||||||
$nobot = time() . '_' . rand(50000, 60000);
|
$nobot = time() . '_' . rand(50000, 60000);
|
||||||
|
|
||||||
// Vérifier si la demande est pour une nouvelle question
|
if ($action === 'submit_form' && $try === 'send') {
|
||||||
if (isset($_POST['new_question'])) {
|
|
||||||
// Réinitialiser la question actuelle
|
|
||||||
$_SESSION['current_question'] = null;
|
|
||||||
$_SESSION['correct_answers'] = null;
|
|
||||||
// Rediriger pour éviter la soumission de formulaire inutile
|
|
||||||
header("Location: #answer");
|
|
||||||
exit();
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($try == 'send') {
|
|
||||||
// Vérifier le token CSRF
|
// Vérifier le token CSRF
|
||||||
if (!isset($_POST['csrf_token']) || $_POST['csrf_token'] !== $_SESSION['csrf_token']) {
|
if (!isset($_POST['csrf_token']) || $_POST['csrf_token'] !== $_SESSION['csrf_token']) {
|
||||||
echo "<span class=\"spam\">";
|
echo "<span class=\"spam\">" . $txt['csrf_error'] . "</span>";
|
||||||
echo $txt['csrf_error'];
|
return;
|
||||||
echo "</span>";
|
|
||||||
return ;
|
|
||||||
exit();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Ici Le visiteur soumet le formulaire
|
// Vérifications anti-spam
|
||||||
if (($nobotc != md5($nobotv)) || ($nobotv == '') || ($nobots != '')) {
|
if (($nobotc != md5($nobotv)) || empty($nobotv) || !empty($nobots)) {
|
||||||
echo "<span class=\"spam\">";
|
echo "<span class=\"spam\">" . $txt['antispam_error'] . "</span>";
|
||||||
echo $txt['antispam_error'];
|
return;
|
||||||
echo "</span>";
|
}
|
||||||
return ;
|
|
||||||
} else {
|
// Traitement des données du formulaire
|
||||||
if ($_SERVER["REQUEST_METHOD"] == "POST") {
|
if ($_SERVER["REQUEST_METHOD"] === "POST") {
|
||||||
$name = strip_tags(trim($_POST["name"]));
|
$name = strip_tags(trim($_POST["name"]));
|
||||||
$email = filter_var(trim($_POST["email"]), FILTER_VALIDATE_EMAIL);
|
$email = filter_var(trim($_POST["email"]), FILTER_VALIDATE_EMAIL);
|
||||||
$subject = strip_tags(trim($_POST["subject"]));
|
$subject = strip_tags(trim($_POST["subject"]));
|
||||||
$message = strip_tags(trim($_POST["message"]));
|
$message = strip_tags(trim($_POST["message"]));
|
||||||
$user_answer = isset($_POST['answer']) ? trim($_POST['answer']) : '';
|
$user_answer = isset($_POST['answer']) ? trim($_POST['answer']) : '';
|
||||||
|
|
||||||
// Validation des données
|
// Validation des champs obligatoires
|
||||||
if (empty($name) || empty($email) || empty($subject) || empty($message) || empty($user_answer)) {
|
if (empty($name) || empty($email) || empty($subject) || empty($message) || empty($user_answer)) {
|
||||||
echo "<span class=\"spam\">";
|
echo "<span class=\"spam\">" . $txt['required_fields'] . "</span>";
|
||||||
echo $txt['required_fields'];
|
return;
|
||||||
echo "</span>";
|
|
||||||
return ; // Réaffiche le formulaire en cas d'erreur
|
|
||||||
} else {
|
|
||||||
// Vérifier la présence de liens : si oui, fin du script
|
|
||||||
if (preg_match('/http(s?):\/\//ism', $message)) {
|
|
||||||
echo "<span class=\"spam\">";
|
|
||||||
echo $txt['link_error'];
|
|
||||||
echo "</span>";
|
|
||||||
return ; // Réaffiche le formulaire en cas d'erreur
|
|
||||||
exit(); // Arrêter l'exécution si un lien est trouvé
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Vérifier la présence de mots-clés
|
// Vérifier la présence de liens
|
||||||
|
if (preg_match('/http(s?):\/\//i', $message)) {
|
||||||
|
echo "<span class=\"spam\">" . $txt['link_error'] . "</span>";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Vérifier les mots interdits
|
||||||
$bad_words = $config['bad_words'];
|
$bad_words = $config['bad_words'];
|
||||||
foreach ($bad_words as $bad) {
|
foreach ($bad_words as $bad) {
|
||||||
if (stripos($message, $bad) !== false) {
|
if (stripos($message, $bad) !== false) {
|
||||||
echo "<span class=\"spam\">";
|
echo "<span class=\"spam\">" . $txt['bad_word_error'] . "</span>";
|
||||||
echo $txt['bad_word_error'];
|
return;
|
||||||
echo "</span>";
|
|
||||||
return ; // Réaffiche le formulaire en cas d'erreur
|
|
||||||
exit(); // Arrêter l'exécution si un mot interdit est trouvé
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Vérifier la réponse à la question antispam
|
// Vérification de la réponse anti-spam
|
||||||
if (isset($_POST['submit_form'])) {
|
|
||||||
if (!empty($user_answer) && in_array(strtolower($user_answer), array_map('strtolower', $correct_answers))) {
|
if (!empty($user_answer) && in_array(strtolower($user_answer), array_map('strtolower', $correct_answers))) {
|
||||||
echo $txt['good_answer'];
|
echo $txt['good_answer'];
|
||||||
|
|
||||||
|
// Réinitialiser la session pour la question
|
||||||
unset($_SESSION['current_question']);
|
unset($_SESSION['current_question']);
|
||||||
unset($_SESSION['correct_answers']);
|
unset($_SESSION['correct_answers']);
|
||||||
// Envoi de l'e-mail
|
|
||||||
$to = $config['email']; // Remplacez par votre adresse e-mail
|
// Préparer l'envoi de l'email
|
||||||
|
$to = $config['email'];
|
||||||
$subject_prefix = $config['subject_prefix'];
|
$subject_prefix = $config['subject_prefix'];
|
||||||
$subjectreal = "$subject_prefix : $subject";
|
$subjectreal = "$subject_prefix : $subject";
|
||||||
$headers = "From: $name <$email>";
|
$headers = "From: $name <$email>";
|
||||||
if (mail($to, $subjectreal, $message, $headers)) {
|
|
||||||
|
if (msmtp_send($to, $subjectreal, $message, $headers, $account)) {
|
||||||
echo $txt['email_success'];
|
echo $txt['email_success'];
|
||||||
} else {
|
} else {
|
||||||
echo $txt['email_error'];
|
echo $txt['email_error'];
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
echo "<span class=\"spam\">";
|
echo "<span class=\"spam\">" . $txt['bad_answer'] . "</span>";
|
||||||
echo $txt['bad_answer'];
|
|
||||||
echo "</span>";
|
|
||||||
return ; // Réaffiche le formulaire en cas d'erreur
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue