FORMMAIL SÉCURISÉ

coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 - 19 juin 2007 à 11:53
kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015 - 1 août 2007 à 14:22
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/43175-formmail-securise

kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015
1 août 2007 à 14:22
Euh non pas forcément... pas besoin de vérifier la présence de header puisque s'il n'y a pas retour à la ligne ces derniers ne serviront à rien... .. .

function verifier_chaines($str)
{
return (strpos($str, "\n") === false &&
strpos($str, "\r") === false);
}

Par contre cette vérification ne doit pas être faite sur le corps du mail qui lui peut contenir des retour à la ligne... .. .

@ tchaOo°
cs_le rouge Messages postés 10 Date d'inscription mardi 25 janvier 2005 Statut Membre Dernière intervention 1 août 2007
1 août 2007 à 14:14
Yop, merci pour ta réponse, donc il me suffit de modifier ma fonction de verification de chaîne comme suit :

// VERIFICATION DES CHAINES DE CARACTERES

function verifier_chaines($chaine)
{
$mauvaises_chaines = array('content-type:', 'mime-version:', 'content-transfer-encoding:', 'bcc:', 'cc:', '\n', '\r');

foreach($mauvaises_chaines as $caracteres_inautorises)
{
if(strpos($chaine, $caracteres_inautorises) !== false)
{
return false;
}
}
return true;
}

++
kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015
24 juil. 2007 à 16:14
Désolé de ne pas avoir répondu avant mais j'avais zappé... .. .

Donc pour répondre à ton dernier poste... non pas vraiment... l'idée n'est pas d'enlever les caractères interdit, car ça risque de mettre le bordel dans tes header plus qu'autre chose, mais plutôt de détecter leur présence et si tu en trouve un tu affiche une erreur genre "caractère(s) interdit détecté(s)"... .. .

if(strpos( $maVar, "\n") !== false || strpos( $maVar, "\r") !== false)
// erreur
else
{
// traitement
}

@ tchaOo°
cs_le rouge Messages postés 10 Date d'inscription mardi 25 janvier 2005 Statut Membre Dernière intervention 1 août 2007
19 juil. 2007 à 14:22
Alors? C'est mieux?

S'il vous plaît, c'est tellement important...

Merci, ++
cs_le rouge Messages postés 10 Date d'inscription mardi 25 janvier 2005 Statut Membre Dernière intervention 1 août 2007
6 juil. 2007 à 13:34
Oups, si un admin/modérateur pouvait supprimer deux des 3 derniers commentaires identiques, merci...

(ce message aussi d'ailleurs...)
cs_le rouge Messages postés 10 Date d'inscription mardi 25 janvier 2005 Statut Membre Dernière intervention 1 août 2007
6 juil. 2007 à 13:33
Up,

Et si pour les entêtes, je remplace comme cela :

// ON PREPARE L'ENTETE

// AVEC COPIE

if(($_POST['copie']))
{
$entete = 'bcc: '.str_replace("\r\n", null, $_GET['email']). "\r\n";
$entete .= 'from: Ton site - '.str_replace("\r\n", null, $_POST['nom']).' <'.str_replace("\r\n", null, $_POST['nom'])>."\r\n";
}

// SANS COPIE

elseif(!($_POST['copie']))
{
$entete = 'from: Ton site - '.str_replace("\r\n", null, $_POST['nom']).' <'.str_replace("\r\n", null, $_POST['nom'])>."\r\n";
}
$entete .= 'reply-to: '.str_replace("\r\n", null, $_POST['nom']).' <'.str_replace("\r\n", null, $_POST['nom'])>."\r\n";
$entete .= 'return-path: Site de Hauterive - '.str_replace("\r\n", null, $_POST['nom']).' <'.str_replace("\r\n", null, $_POST['nom'])>."\r\n";
$entete .= 'mime-version: 1.0'."\r\n";
$entete .= 'content-type: text/html; charset=iso-8859-1'."\r\n";
$entete .= 'x-mailer: php/'.phpversion();.''."\r\n";
$entete .= 'x-sender: Site de Hauterive - '.str_replace("\r\n", null, $_POST['nom']).' <'.str_replace("\r\n", null, $_POST['nom'])>."\r\n";
$entete .= 'x-auth-smtp-user: localhost'."\r\n";

++
cs_le rouge Messages postés 10 Date d'inscription mardi 25 janvier 2005 Statut Membre Dernière intervention 1 août 2007
6 juil. 2007 à 13:06
Up,

Et si pour les entêtes, je remplace comme cela :

// ON PREPARE L'ENTETE

// AVEC COPIE

if(($_POST['copie']))
{
$entete = 'bcc: '.str_replace("\r\n", null, $_GET['email']). "\r\n";
$entete .= 'from: Ton site - '.str_replace("\r\n", null, $_POST['nom']).' <'.str_replace("\r\n", null, $_POST['nom'])>."\r\n";
}

// SANS COPIE

elseif(!($_POST['copie']))
{
$entete = 'from: Ton site - '.str_replace("\r\n", null, $_POST['nom']).' <'.str_replace("\r\n", null, $_POST['nom'])>."\r\n";
}
$entete .= 'reply-to: '.str_replace("\r\n", null, $_POST['nom']).' <'.str_replace("\r\n", null, $_POST['nom'])>."\r\n";
$entete .= 'return-path: Site de Hauterive - '.str_replace("\r\n", null, $_POST['nom']).' <'.str_replace("\r\n", null, $_POST['nom'])>."\r\n";
$entete .= 'mime-version: 1.0'."\r\n";
$entete .= 'content-type: text/html; charset=iso-8859-1'."\r\n";
$entete .= 'x-mailer: php/'.phpversion();.''."\r\n";
$entete .= 'x-sender: Site de Hauterive - '.str_replace("\r\n", null, $_POST['nom']).' <'.str_replace("\r\n", null, $_POST['nom'])>."\r\n";
$entete .= 'x-auth-smtp-user: localhost'."\r\n";

++
cs_le rouge Messages postés 10 Date d'inscription mardi 25 janvier 2005 Statut Membre Dernière intervention 1 août 2007
6 juil. 2007 à 13:05
Up,

Et si pour les entêtes, je remplace comme cela :

// ON PREPARE L'ENTETE

// AVEC COPIE

if(($_POST['copie']))
{
$entete = 'bcc: '.str_replace("\r\n", null, $_GET['email']). "\r\n";
$entete .= 'from: Ton site - '.str_replace("\r\n", null, $_POST['nom']).' <'.str_replace("\r\n", null, $_POST['nom'])>."\r\n";
}

// SANS COPIE

elseif(!($_POST['copie']))
{
$entete = 'from: Ton site - '.str_replace("\r\n", null, $_POST['nom']).' <'.str_replace("\r\n", null, $_POST['nom'])>."\r\n";
}
$entete .= 'reply-to: '.str_replace("\r\n", null, $_POST['nom']).' <'.str_replace("\r\n", null, $_POST['nom'])>."\r\n";
$entete .= 'return-path: Site de Hauterive - '.str_replace("\r\n", null, $_POST['nom']).' <'.str_replace("\r\n", null, $_POST['nom'])>."\r\n";
$entete .= 'mime-version: 1.0'."\r\n";
$entete .= 'content-type: text/html; charset=iso-8859-1'."\r\n";
$entete .= 'x-mailer: php/'.phpversion();.''."\r\n";
$entete .= 'x-sender: Site de Hauterive - '.str_replace("\r\n", null, $_POST['nom']).' <'.str_replace("\r\n", null, $_POST['nom'])>."\r\n";
$entete .= 'x-auth-smtp-user: localhost'."\r\n";

++
cs_le rouge Messages postés 10 Date d'inscription mardi 25 janvier 2005 Statut Membre Dernière intervention 1 août 2007
5 juil. 2007 à 08:41
Hello.

Kankrelune, permets-moi de te demander un petit coup de main sur l'injection afin d'améliorer ma source, je n'ai pas trouvé grand chose sur les retour chariot et autre...

Merci.
cs_le rouge Messages postés 10 Date d'inscription mardi 25 janvier 2005 Statut Membre Dernière intervention 1 août 2007
25 juin 2007 à 23:18
Sortir la fonction de vérification des champs (pour les caractères illégaux dans un mail, justement contre l'injection...)

++
ricky03 Messages postés 3 Date d'inscription dimanche 12 janvier 2003 Statut Membre Dernière intervention 25 juin 2007
25 juin 2007 à 23:08
Pas mal ce code. Mais comment pourrait-on corriger ce problème d'injection? Si tu as une idée Kankrelune, tu pourrais la dire?

Qu'entends-tu par externaliser?
cs_le rouge Messages postés 10 Date d'inscription mardi 25 janvier 2005 Statut Membre Dernière intervention 1 août 2007
22 juin 2007 à 09:46
Ok, je me renseigne pour l'injection, mais il me semblait que justement c'est déjà sécurisé là-dessus. Si tu avais quelques précisions?

Pour ma fonction dans un autre, elle n'est pas déclaré souvent! Enfin, je crois pas, je regarde et je mets à jour après mes examens de Biologie, donc dès le 9 juillet!

Merci
kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015
21 juin 2007 à 18:47
contre l'injection... une recherche et tu trouvera tout ce qu'il te faut... en gros tu cherche la présence de caractères CRLF (retour de charriot et retour à la ligne)

"L'interêt d'une fonction dans une autre, ben je l'utilise dans cette dite fonction..."

Oui sauf que tu la redéclare à chaque utilisation de la dite fonction donc externalise la elle ne sera déclarée qu'une fois... .. .

@ tchaOo°
cs_le rouge Messages postés 10 Date d'inscription mardi 25 janvier 2005 Statut Membre Dernière intervention 1 août 2007
19 juin 2007 à 16:32
Yop

Et comment faire pour ne pas avoir cette faille à l'injection?
L'interêt d'une fonction dans une autre, ben je l'utilise dans cette dite fonction...

++
kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015
19 juin 2007 à 12:45
Pareil j'ai juste survolé le code mais je vois pas en quoi c'est sécurisé... tu as une faille à l'injection de header... .. .

Sinon quel intérêt de déclarer des fonction dans le corps d'une fonction... .. ?

@ tchaOo°
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
19 juin 2007 à 11:53
function verifier_contact($_POST)
j'ai survolle le code, mettre $_POST comme nom de param, c'est pas une bonne idee, vu que $_POST est une superglobale...

sinon, tu utilises plusieurs echo la ou un seul suffit, et tu devrais mettre des ' a la place des "

if(($_POST['copie'])) => t'as un couple de parentheses qui ne sert a rien, et il manque la fonction isset (ca donne : if (isset($_POST['copie'])) )

idem pour tes autres verifications de variables
Rejoignez-nous