2010-01-02 2 views
3

Je me demande s'il y a un risque de sécurité potentiel du code suivant. Je l'utiliser sur mon blog chaque fois qu'un utilisateur soumet un commentaire, il me envoyer un message texte:Y a-t-il un risque d'injection dans la fonction mail() de PHP?

mail('[email protected]', '', 
    "Comment posted by $name: $comment", 
    "From: [email protected]"); 

$name et $comment sont des valeurs entrées par l'utilisateur qui n'ont pas vraiment été assainies en aucune façon. Est-il possible qu'un utilisateur puisse faire quelque chose de malveillant ici? La documentation de mail() ne dit rien à ce sujet, mais il est juste incorrect de coller des valeurs entrées par l'utilisateur directement dans une chaîne. Y a-t-il un risque réel ou suis-je simplement parano?

+0

Je ne pense pas que quelque chose de malveillant puisse être fait mais vous devriez probablement limiter la longueur de certaines variables juste pour ne pas faire chier les gens. –

+0

En note, vous citez 'cellnumber', donc je suppose que vous utilisez un service mail-to-SMS. Si vous êtes accusé de ces messages à un moment donné, peut-être que quelqu'un pourrait vous bombarder avec des milliers de commentaires et causer des dommages. –

+0

Joli système que vous avez là. Je ne peux pas envoyer de sms via mail à mon téléphone :( – AntonioCS

Répondre

5

Tant que tout le matériel de l'utilisateur est conservé dans le corps , il n'y a pas de risque d'injection. Toutefois, dès qu'un utilisateur peut affecter les en-têtes de courrier, il peut injecter des en-têtes supplémentaires et faire des choses telles que l'envoi d'e-mails ou l'ajout d'un message complètement différent, y compris des pièces jointes.

Si vous recherchez des retours à la ligne dans les parties qui affectent les en-têtes et que vous les rejetez si cela apparaît, cela devrait suffire. La norme SMTP utilise CRLF pour séparer les lignes d'en-tête, mais AFAIK, de nombreux serveurs basés sur Unix veulent que vous n'utilisiez que LF (parce que c'est le séparateur de ligne natif sur ces systèmes). Le relayer le courrier le convertit alors en l'envoyant plus loin en amont.

+0

Appuyé. Il n'y a pas de risque direct ici parce que tout est dans le corps mais il est important de garder à l'esprit que les en-têtes sont vulnérables. –

2

PHP est plein de trucs dangereux, mais je ne suis pas sûr qu'il y ait beaucoup de risques ici. Il est certain qu'un commentaire trop long pourrait déborder la limite que vous pourriez avoir sur la taille du message. Cela ne vous fera probablement pas de mal.

La syntaxe de $XXX de PHP étend la chaîne, mais ne fait aucune évaluation supplémentaire du XXX le fait-il? Si $XXX fonctionnait comme une sorte de eval(), vous seriez dans un monde d'exécution de code à distance, mais je ne pense pas que ce soit le cas. Si cela fait SMTP à l'intérieur, alors un . sur une ligne suivie par une ligne vide signalerait la fin d'un courrier, et théoriquement un attaquant pourrait suivre cela avec plus de texte dans les lignes successives pour détourner votre mailer à mail un autre message à quelqu'un d'autre. C'est si PHP ne reconnaît pas et échappe à une telle chaîne en premier lieu. C'est quelque chose que je regarderais.

+0

non, il ne fait pas d'évaluation. des années de travail avec sql m'ont rendu nerveux, car il y a toujours un risque d'injection SQL dans ce cas – Jenni

3

Soyez conscient du caractère de nouvelle ligne à l'intérieur du nom. Deux conséquents (erm .. pardonnez mon anglais, deux newlines l'un après l'autre) newlines signifient "fin des en-têtes" dans SMTP. La séquence "\ n. \ N" (ligne vide avec seulement un point) signifie également "fin du message".

EDIT: Oui, il y a un risque de spammeurs! Que se passe-t-il si le nom $ contient réellement:

someonesName 
CC: [email protected]; [email protected] 

(c'est-à-dire quelque chose pour injecter plus d'en-têtes)?

EDIT2: n'a pas remarqué que "name" et "comment" étaient tous deux dans la partie du corps du message. Alors mon idée sur les spammeurs n'est pas valide.

+0

l'ajout d'un en-tête CC n'entraînera pas réellement la livraison de l'email à ces adresses, c'est l'adresse de l'enveloppe utilisée pour le déterminer. Mais Reply-to: les en-têtes pourraient être ajoutés et probablement Content-type: puis un corps mime contenant un virus ...! Je pense que vous devez vérifier que les champs de nom et de commentaire sont appropriés – jcoder

+0

@naivists: J'ai juste essayé ceci et le '\ n. \ N' ne semble pas être un problème, j'ai eu les trois lignes de" test "dans le message: 'mail ('[email protected] ',' '," message de test: test1 \ n. \ ntest2 \ n \ n. \ n \ ntest3 "," De: [email protected] "); ' – Jenni

+0

aussi, je pense que vous vouliez dire" consécutive ":) – Jenni

Questions connexes