2009-09-26 8 views
0

J'ai créé un formulaire tellafriend pour un CMS. J'ai besoin de champs cachés dans le formulaire pour que je puisse passer l'adresse de la page d'accueil, le lien vers le logo et l'adresse e-mail de l'administrateur web. Toutefois, la valeur des champs masqués n'est pas transmise à mon fichier courrier. Vous pouvez également essayer le formulaire sur mon site Web http://www.zoosh.me/tellafriend.php Existe-t-il un bogue dans php ou quelque chose ne va pas dans mes fichiers? J'apprécierais vraiment votre aide les gars.Les champs masqués ne sont pas traités avec php

Merci, Ovi

<form id="tellafriend" method="post" action="mail.php"> 
<fieldset> 
    <img id="telllogo" width="170" alt="Logo" src="/perch/resources/1253956138myself-w170.jpg"/> 
    <input width="170" type="hidden" alt="Logo" value="/perch/resources/1253956138myself-w170.jpg" name="logo"/> 
    <input type="hidden" value="http://www.zoosh.me" name="webaddress"/> 
    <ul class="wrapper"> 
    <li> 
    <label class="label" for="yourname">Your Name:</label> 
    <input id="yourname" class="text jquery-live-validation-on invalid" type="text" value="" name="yourname"/> 
    <img alt="Invalid" src="images/invalid.png"/> 
    </li> 
    <li> 
    <label for="youremail">Your Email:</label> 
    <input id="youremail" class="text jquery-live-validation-on invalid" type="text" value="" name="youremail"/> 
    <img alt="Invalid" src="images/invalid.png"/> 
    </li> 
    <li> 
    <label for="friendsname">Friend's Name:</label> 
    <input id="friendsname" class="text jquery-live-validation-on invalid" type="text" value="" name="friendsname"/> 
    <img alt="Invalid" src="images/invalid.png"/> 
    </li> 
    <li> 
    <label for="friendsemail">Friend's Email:</label> 
    <input id="friendsemail" class="text jquery-live-validation-on invalid" type="text" value="" name="friendsemail"/> 
    <img alt="Invalid" src="images/invalid.png"/> 
    </li> 
    <li> 
    <label for="message"> 
    Your Message 
    <br/> 
    <small id="charLeft">150 Characters left</small> 
    </label> 
    <textarea id="message" class="jquery-live-validation-on invalid" cols="10" rows="3" name="message"/> 
    <img alt="Invalid" src="images/invalid.png"/> 
    </li> 
    <li class="inputSubmit"> 
    <input id="submit" class="submit" type="submit" value="Send"/> 
    </li> 
    </ul> 
    <input type="hidden" value="[email protected]" name="adminaddress"/> 
</fieldset> 
</form> 

Voici le code du fichier mail.php qui traite le formulaire et envoie un e-mail à des amis de mon visiteur.

<?php 
$yourname = $_POST['yourname']; 
$youremail = $_POST['youremail']; 
$news = $_POST['news']; 
$friendsname = $_POST['friendsname']; 
$friendsemail = $_POST['friendsemail']; 
$adminemail = $_POST['adminemail']; 
$logo = $_POST['logo']; 
$webaddress = $_POST['webaddress']; 
$subject = "I've found a great website!"; 
$headers = "From: " . strip_tags($from) . "\r\n"; 
$headers .= "Reply-To: " . strip_tags($from) . "\r\n"; 
$headers .= "BCC: [email protected]\r\n"; 
$headers .= "MIME-Version: 1.0\r\n"; 
$headers .= "Content-Type: text/html; charset=ISO-8859-1\r\n"; 

$message = $_POST['message']; 


$body="<html> 
<head> 
<meta http-equiv='Content-Type' content='text/html; charset=utf-8'> 
<title>Zoosh</title> 
</head> 
<body> 
<table width='90%' cellpadding='0' cellspacing='0'> 
<tr> 
<td align='center' valign='top'> 
<table width='411' cellpadding='0' cellspacing='0'> 
    <tr> 
    <td><img src='http://recycledoc.com/emails/zoosh_tellafriend/tdbg.png' width='1' height='450' alt='Tdbg'></td> 
    <td background='http://recycledoc.com/emails/zoosh_tellafriend/tellafriendbg.jpg' valign='top' style='padding-top:20px; padding-right:20px; padding-bottom:20px; padding-left:20px;'> 
    <table width='370' cellpadding='0' cellspacing='0'> 
    <tr> 
     <td valign='top' width='170' style='padding-right:10px'><img src='" 
     . $webaddress . $logo . "' /> 
     </td> 
     <td valign='top' width='190' style='font-family:Helvetica,Arial,Verdana,sans-serif; font-size:12px; color:#555;'> 
     <p style='margin-top:0; margin-bottom:0;'> 
     <span style='font-weight:bold;'>From:</span>" . $yourname .   "<br> 
     <span style='font-weight:bold;'>Email:</span> <a style='text-decoration:none; color:#6927B2;' href='mailto:" . $youremail . "'>" . $youremail . "</a></p> 
     <p style='padding-top:200px;'>" . $message . 

     "</p> 
     <a href='" . $webaddress . "'><img src='http://recycledoc.com/emails/zoosh_tellafriend/visit.png' width='120' height='20' alt='Visit'></a> 
     </td> 
    </tr> 
    </table> 
    </td> 
    </tr> 
</table> 
</td> 
</tr> 
</table> 

</body> 
</html>"; 

if (mail($friendsemail, $subject, $body, $headers)) { 
echo "Thank you for telling your friend about my website. <a href='#' id='goback'>Click here</a> to tell another friend."; 
} else { 
echo "Sorry. There was a problem sending your email. Please try again!"; 
} 

mail($adminemail, $subject, $body, $headers); 
mail($youremail, $subject, $body, $headers); 
+1

Qu'est-ce var_dump ($ _ POST); vous donne? – RageZ

Répondre

6

Vous contournent le processus de soumission normale du formulaire et en le soumettant par AJAX:

data: 'yourname=' + yourname + '&youremail=' + youremail + '&friendsname=' + friendsname + '&friendsemail=' + friendsemail + '&message=' + message, 

Cela ne comprend pas le logo, webaddress ou adminaddress, donc bien sûr, ils ne sont pas arrivés à la Script PHP.

De même, vous n'échappez pas correctement à ces valeurs, donc si quelqu'un inclut un '&' ou d'autres caractères spéciaux dans l'un de ces champs, il va se casser. Utilisez encodeURIComponent ou, puisque vous utilisez la fonction ajax jQuery, juste passer une recherche et laissez jQuery prendre soin de cela pour vous:

data: {'yourname': yourname, ... 

Il y a plus de problèmes comme celui-ci s'échappent.

$headers = "From: " . strip_tags($from) . "\r\n"; 

Les étiquettes de bande ne sont pas utiles ici. Les en-têtes de message sont en texte brut; Les balises HTML n'ont pas de signification particulière. Ce qui est dangereux, cependant, c'est les nouvelles lignes. Cela permettrait à un attaquant d'ajouter n'importe quel en-tête qu'il aimerait au courrier, ou même d'envoyer plusieurs courriers complètement contrôlés par un attaquant.

Vous devriez fortement désinfecter tout ce que vous allez mettre dans un en-tête de courrier; les caractères non-ASCII et de contrôle en particulier doivent être supprimés.

<td valign='top' width='170' style='padding-right:10px'><img src='" 
    . $webaddress . $logo . "' /> 

Injection HTML. $ webaddress et $ logo peuvent contenir des guillemets, permettant à un attaquant d'insérer du code HTML et JavaScript arbitraire. Vous avez besoin de htmlspecialchars($s, ENT_QUOTES) chaque fois que vous mettez du texte en HTML.

Il est également dangereux de permettre à l'utilisateur de choisir une adresse web, logo, adminaddress, etc. Ceci est un cadeau aux spammeurs: ils soumettront leurs propres données et un message, le piratage de votre formulaire Web pour « Parrainer un ami » au sujet de leur propres pilules de pénis à la place, et obtenir votre serveur largement bloqué. Si vous devez avoir une fonction «Parler à un ami», vous devez vraiment verrouiller les paramètres autorisés; juste les mettre dans un champ caché n'est pas une protection.

+0

bonnes réponses si les gens peuvent monter le score! – RageZ

+0

Merci beaucoup. J'ai peur de ne pas savoir comment passer les champs cachés via ajax. –

+0

De la même manière que vos autres champs, donnez-leur un identifiant, faites-le glisser et lisez le 'val()'. Ou, tvanfosson a suggéré d'utiliser 'serialize' pour obtenir les données pour tout le formulaire à la fois, ce qui sonne comme une bonne idée (mais son commentaire a disparu, alors peut-être qu'il y avait une raison pour laquelle ce n'était pas une bonne idée!) //docs.jquery.com/Ajax/serialize – bobince

1

Votre script PHP accède $ _POST [ 'ADMINEMAIL'], mais le champ caché est appelé adminaddress

Questions connexes