Bonjour,
- Version de PHP: 8.2
- Système d'exploitation du serveur: Linux
- Serveur web: NGinX
- Framework: Aucun
- Classe externes: PHPMailer
mon premier message ici, fraîchement inscrit, car je suis un peu perdu.
Contexte: Je me forme au PHP en autodidacte depuis à peine quelques semaines et mon projet présentement consiste au développement d'un formulaire d'envoi de mail vers le compte mail d'une association dans laquelle je suis.
Pour cela, j'ai crée un ensemble de fonctions et j'ai le corps principale de mon code qui m'autorise à :
- Recevoir depuis un formulaire HTML des données entrées par l'utilisateur, envoyé via la méthode $_POST.
- Ces données sont reçu par un script dont l'unique but est de déterminer si les données entrées sont valides : Tailles des chaînes, analyse des entrées (pattern matching) pour savoir si quelqu'un tenterait pas d'entrée au mieux des données incorrectes, au pire des tentatives de piratages.
- Une fois que tout est validé (sinon ça exit), ces données sont stockés temporairement dans un répertoire de mails en attente.
- Une tâche cron doit passer toutes les X minutes, récupérer le plus vieux fichier / mail et essaye de l'envoyer via PHPMailer.
- Une fois terminé, selon le statut renvoyé par PHPMailer, le fichier / mail est déplacé dans un répertoire ACCEPTED or REJECTED, à titre de logs.
Cela fonctionne, j'utilise le serveur SMTP de mon ESP via un compte, en IMAP. Les mails parviennent bien à destination !
Par contre, stocker dans un fichier .php en dur les données du serveur SMTP de mon ESP, particulièrement utilisateur / mot de passe c'est bien entendu tout pourri. C'était à titre de test.
Maintenant, j'aimerai être sûr que ce code ne contienne pas la moindre traces de données qui n'ont rien à y faire.
Après quelques recherches et questions posées par-ci par-là, j'en suis arrivé à la conclusion qu'une bonne méthode serait de :
1/ Stocker ces données dans un fichier (car mon application ne se repose pas sur une base de donnée) qui n'est pas accessible via le navigateur. Le nommer .php pourrait suffire, mais une simple erreur de configuration de PHP et on télécharge le .php au lieu de l'exécuter, c'est pas suffisant.
2/ Ce fichier doit être en dehors du DocumentRoot, car même si je demande explicitement au serveur web de ne pas accepter de requête, une erreur de configuration encore une fois et…
3/ Rendre ce fichier uniquement accessible par PHP, son utilisateur, mais personnes d'autres.
En gardant en tête qu'un mot de passe d'une boîte mail n'est pas l'information la plus sensible qui soit, qu'en cas d'accès non désiré à mon serveur j'aurai sûrement autre chose de plus important que ce compte mail à protéger… compte mail auquel j'ai les accès chez mon ESP et que je peux modifier/supprimer/bloquer à ma guise. Cependant, si on pouvait éviter que le tout venant puisse consulter ces informations… c'est mieux.
Au début, je pensais que je pouvais sûrement chiffrer le fichier contenant le mot de passe et le déchiffrer à la volée via ce genre de fonctions dans la doc de php dot net: manual/en/book.password.php
Mais on m'a gentiment expliqué que c'était pas fondamentalement utile : Puisque la clé servant à déchiffrer le fichier est de toute façon accessible au serveur, donc en cas d'intrusion… ce fichier l'est sûrement aussi. Et comme, bien sûr, tout doit fonctionnement sans rien faire, je ne peux pas manuellement taper de mot de passe pour utiliser une clé qui déchiffrerait le fichier, ça ne fait pas sens.
Auriez-vous des suggestions concernant ce cas ?
Ma crainte principale serait de pouvoir consulter ce fichier, de manière indésiré, via une requête ou un oubli dans ma configuration (ce qui ne doit jamais arrivé, bien sûr, mais je préfère imaginer que ça arrivera et ajouter des couches).
Cordialement,
GASPARD DE RENEFORT Kévin