8741 sujets

Développement web côté serveur, CMS

Je ne comprends pas, le formulaire que j'ai mis en place et dont j'avais parlé ici fonctionne très bien, je reçois des messages. Chose étrange, je reçois, environ une fois par semaine, d'une façon irrégulière, un envoi par ce formulaire mais sans aucun message. Alors que sur le formulaire, j'ai mis à "required" à la fois le mail d'expédition et le message à transmettre.
J'ai aussi reçu ce midi un message d'une entreprise dont le mail d'expédition n'apparaît pas, alors qu'il est obligatoire sur le formulaire. Mais il y a bien un message qui accompagne l'envoi. Ais-je mal fait le php ? Pourquoi l'adresse mail de l'expéditeur n'apparaît pas ?
Normalement, dans le champ $_POST on met soit une adresse qui correspond à son nom de domaine, soit rien, de façon à ce que le réseau choisisse lui-même (ce que j'ai fait).
Voici mon code php (la partie en-dessous de echo est à pour l'anti-spam, qui va avec un script JavaScript).
<?php
    $retour = mail('mon_mail@free.fr', 'Envoi depuis la page Contact', $_POST['message'], ''); 
    if ($retour)
        echo '<p>Votre message a bien été envoyé.</p>';
        if ($_POST['remarque'] != "") {
    $msg  = strftime('%Y-%m-%d %H:%M:%S')."\n";
    $msg .= var_export($_POST,true)."\n";
    file_put_contents('Logs/logs/mailspams.log', $msg, FILE_APPEND | LOCK_EX);

    die();
}
    ?>

Modifié par Bongota (31 May 2023 - 16:29)
Salut,

hum c'est juste le code que tu appelles pour faire l'envoie du mail et tu as fais des vérifications ailleurs, ou c'est ton code complet Smiley eek ?

Parce que la en l'état cela m'a l'air tout pourri niveau sécurité Smiley sweatdrop

Principe de base coté serveur : il ne faut JAMAIS faire confiance aux données reçues.
Tu dois donc vérifier chacun des champs coté serveur pour être sur qu'ils sont valident et ne contiennent pas de données bizarres (i.e. tentative d'attaque).
Il faudra faire des traitements différents en fonction de ce que tu veux faire (stockage en bdd, affichage à l'écran, envoie de mail, etc) car ce n'est pas toujours les même types d'attaques.


Édit petit complément d'info pour illustrer : tu appuies sur F12 dans ton navigateur, tu cliques sur "Inspecteur" et hop tu as accès à tout le code html de la page, et tu peux le modifier comme tu en as envie. Du coup tu peux supprimer le required de ton formulaire et envoyer le formulaire sans en tenir compte.

Bref, les limitations que tu mets coté client sont pratiques pour indiquer au client ce qu'il fait mal (c'est du confort pour lui) mais il ne faut absolument pas les considérer comme des éléments de sécurité pour toi ou sur ce que tu reçois coté serveur.
Modifié par Mathieuu (31 May 2023 - 16:55)
C'est le code complet que j'utilise afin que mon formulaire m'expédie un mail, avec un message, c'est tout. J'ai dit que le code en-dessous était pour l'anti-spam.
Merci pour l'alerte, mais je n'ai pas la réponse à ma question principale posée - pourquoi l'adresse de l'expéditeur n'apparaît pas dans le mail que je reçois, alors que le champ est obligatoire sur mon formulaire.
OK pour la sécurité à renforcer, mais d'abord, que le formulaire produise le minimum pour quoi il est en place.
D'ailleurs, j'ai ajouté des regex sur le formulaire (html). Certaines précautions par rapport à ce qui pourrait être envoyé, aussi bien dans le champ mail que celui du nom.
(pendant que je rédigeais, je vois que tu as ajouté du texte, merci pour les précisions).
Modifié par Bongota (31 May 2023 - 17:09)
Oui j'ai rajouté du texte car la réponse de base me semblait un peu trop sec Smiley sweatdrop

Bref, avant de faire ta fonction mail il va falloir que tu fasse des vérifications sur le contenu des différents champs $_POST.

Pour valider le format de certains éléments, comme pour l'email, tu peux utiliser des filtres directement géré par PHP (ça permet de ne pas avoir à modifier ton code si le format des mails vient à évoluer) : https://www.php.net/manual/en/filter.filters.validate.php ( FILTER_VALIDATE_EMAIL )

Tu peux aussi utiliser des filtres pour modifier ("nettoyer") le contenu du mail : https://www.php.net/manual/en/filter.filters.sanitize.php ( FILTER_SANITIZE_EMAIL )
Merci, je vais voir tout ça. Je débute en php.
Je reviendrai si j'ai des problèmes.
J'en suis à me demander, en dehors du confort pour le visiteur, s'il n'est pas souhaitable d'utiliser le lien mailto pour mettre un contact sur un site. Le formulaire permet de cacher l'adresse mail aux yeux des visiteurs, mais pour la cacher aux yeux des robots, il y a des techniques, que j'utilise déjà avec le mailto.
Modifié par Bongota (01 Jun 2023 - 11:12)
Afin de sécuriser un peu mieux le formulaire, j'ai ajouté des regex dans le php cette fois, et non plus seulement dans le formulaire html, mais je butte toujours sur comment obtenir l'adresse mail de l'expéditeur. Mon formulaire fonctionne, mais l'adresse de l'expéditeur reste toujours celle de mon serveur, comme je le disais dans mon précédent post.
Les filtres dont tu m'as donné les liens ne m'aident pas sur ça.
Modérateur
Bonjour,

lorsque l'on regarde les variables injectées dans ta fonction mail() , tu n'y indiques aucune variable supplémentaire, le dernier champ est vide . Il n'y a donc pas d'info sur l'adresse de l'expediteur/reponse ni si le contenu du mail est du texte ou du HTML, ...
$retour = mail('mon_mail@free.fr', 'Envoi depuis la page Contact', $_POST['message'], ''); 


Définition sur php.net de cette fonction : https://www.php.net/manual/fr/function.mail.php

Ton info manquante est à passer dans les paramètres additionnels.

Si ton hébergement est free, attention à la version de php qui est la 5.6 (pas de passage en array des parametre en sus)

Autre aspect à prendre en compte, si l'adresse mail de l’hébergement utilisé par le script diffère de celle indiquer par 'from' , il est possible que
- A) ce mail ne soit pas envoyer (je crois que c'est le cas de free, trop de compte utilisé comme spam)
- B) le mail est considéré comme un spam par la boite mail qui va le recevoir (incohérence entre l'adresse de l’émetteur et l'adresse from et/ou reply-to ).

En gros, assure toi que from est identique à l'adresse utilisée pour l’émission (l’émetteur du mail c'est ton hébergement , pas ton visiteur) , cela va permettre d'envoyer et de recevoir les mails sans qu'ils tombntr aussitôt dans un filtre à spam.

Pour le reply-to, tu peut tester son efficacité une fois ton from en place ,mais je dirais autant l’éviter pour ne pas en remettre une couche. Ajoute au corps de ton message , l'adresse que ton visiteur fourni.

Comme tu n'indique pas les champs de ton formulaire, difficile de te faire un exemple de base, on ne voit pas non plus ce que tu fait avec $_POST['message'] en amont de ton script (vérification, nettoyage,...)?


Cdt
Modifié par gcyrillus (01 Jun 2023 - 13:47)
Oh, merci, voilà des informations précieuses que je vais travailler.
Mon hébergeur n'est pas free mais Amen. Chez eux, je peux choisir la version de php, j'ai vu passer ça quelque part. Par contre mon mail de retour est bien chez free. Et effectivement comme je le disais plus haut, j'ai laissé le champ libre afin que ce soit l'adresse du serveur hébergeant qui soit utilisée. De ce côté, ça fonctionne, aucun mail n'est allé dans les SPAMS.
Je vais voir tout ça.
C'est pas gagné, le lien que tu m'as donné ne m'aide finalement pas.
J'ai beau tenter plusieurs scripts, je ne comprends toujours pas pourquoi l'adresse mail que l'expéditeur rempli dans le champ du formulaire n'est pas affichée, et quel est le header qui permet de le faire.
------------
- je corrige un peu ici, parce que j'ai créé la confusion entre l'adresse mail à mettre DANS le formulaire et l'adresse mail DE l'expéditeur qui répond à mon formulaire. Cette dernière adresse mail, je voulais la voire affichée dans mon client de courrier, ce qui n'est pas possible, bien sûr. C'est soit une adresse que j'invente, soit c'est le serveur qui met la sienne. Avec la précaution donnée plus haut afin d'éviter les SPAMS.
Il y a donc un problème de réglé, reste celui de l'affichage des données du formulaire (Nom, Secteur d'activités et mail) Pour le moment ne s'affiche que le textarea, le champ "Message".
Mes excuses, question mal posée, réponse difficile.
Je vais demain me pencher sur ce qui manque pour afficher le reste. Smiley biggrin
Modifié par Bongota (01 Jun 2023 - 22:04)
Bonjour,
cette fois, c'est ok, j'ai ajouté les champs nécessaires afin d'afficher enfin les données du formulaire expédié, ça fonctionne en ligne. Et je comprends maintenant ce qui manquait au php minimum mis en place. J'ai aussi profité de tout ce que j'avais ajouté avant sur l'ancien formulaire - champs obligatoires, label, regex pour la rédaction correcte des mails, etc.
Merci à tous, sujet résolu. Smiley biggrin
(Je pourrai quand même revenir sur un autre post, car je vais maintenant travailler la sécurité du formulaire).