我为CMS创建了一个tellafriend表单。我需要表单中的一些隐藏字段,以便我可以传递主页地址,链接到徽标和Web管理员电子邮件地址。但是,隐藏字段的值不会传递给我的邮件文件。您也可以在我的网站http://www.zoosh.me/tellafriend.php上尝试表格。我的文件中是否存在错误或某些内容有问题?我非常感谢你的帮助。
谢谢, 的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="ovime@ovidiust.com" name="adminaddress"/>
</fieldset>
</form>
以下是mail.php文件的代码,该文件处理表单并向访问者的朋友发送电子邮件。
<?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: contact@handinhandwithgod.com\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);
答案 0 :(得分:6)
您正在规避表单的正常提交过程并通过AJAX提交:
data: 'yourname=' + yourname + '&youremail=' + youremail + '&friendsname=' + friendsname + '&friendsemail=' + friendsemail + '&message=' + message,
这不包括徽标,webaddress或adminaddress,所以当然他们没有到达PHP脚本。
此外,您没有正确转义这些值,因此如果有人在其中一个字段中包含“&amp;”或其他特殊字符,它就会中断。使用encodeURIComponent
,或者,因为您正在使用jQuery的ajax
函数,只需传递查询并让jQuery为您处理:
data: {'yourname': yourname, ...
还有更多这样的逃避问题。
$headers = "From: " . strip_tags($from) . "\r\n";
Strip_tags在这里没用。邮件标题是纯文本; HTML标签没有特殊含义。然而,危险的是新线。这将允许攻击者将他们喜欢的任何标题添加到邮件中,甚至可能发送多个完全由攻击者控制的邮件。
你应该强烈消毒你要放在邮件标题中的任何东西;特别是非ASCII和控制字符必须被剥离。
<td valign='top' width='170' style='padding-right:10px'><img src='"
. $webaddress . $logo . "' />
HTML注入。 $ webaddress和$ logo可以包含引号,允许攻击者插入任意HTML和JavaScript代码。每次将文本放入HTML时都需要htmlspecialchars($s, ENT_QUOTES)
。
允许用户选择任何网络地址,徽标,管理地址等也是危险的。这是给垃圾邮件发送者的礼物:他们将提交自己的数据和消息,劫持您的网络表单以“告诉朋友”他们自己相反,阴茎丸,并使您的服务器被广泛阻止。如果你必须有一个“告诉朋友”功能,你需要真正锁定允许的参数;把它们放在隐藏的区域是没有保护的。
答案 1 :(得分:1)
您的PHP脚本访问$ _POST ['adminemail'],但隐藏字段名为adminaddress