【发布时间】:2016-02-18 22:39:08
【问题描述】:
我有一个虚拟(免费)航空公司网站,并且在密码保护区域后面我可以使用我无法在我的公共区域/页面中使用的 PHP 脚本,因为过去它会被注入和劫持我的表单/脚本.我的主机刚刚停止支持 formail,因为它是一个旧脚本。他们推荐了我开始使用的名为 formspree 的服务,但后来他们停止了工作,也没有回复他们的支持请求。
我所需要的只是一个示例/答案,它可以让网站访问者通过填写表格向我发送电子邮件,或者通过这样做加入我们的虚拟航空公司。这是我所拥有的:
我的联系方式代码如下:
<table WIDTH="1166" BORDER="0" CELLPADDING="0" CELLSPACING="0">
<tr BGCOLOR="#0033CC">
<th height="111" align="left" valign="top" bgcolor="#FFFFFF" scope="row">
<form action="contact.php" method="POST">
<input type="hidden" name="recipient" value="contact us"/>
<input type="hidden" name="subject" value="Results From Contact Form"/>
<p align="center">
<span class="arial">Pilot ID#: <input name="pilot_id" type="text"/><br/>
Full Name: <input name="name" type="text" size="50"/><br/>
E-mail: <input name="email" type="text" size="30"/><br/>
Confirm E-mail:
</span>
<input name="confirm_email" type="text" size="30"/>
</p>
<p align="center"><span class="arial">Submit questions or comments</span><br/>
<textarea name="textarea" cols="50" rows="5"></textarea></p>
<p align="center">
<input type="submit" name="Submit" value="Submit"/>
<input type="reset" name="Reset" value="Reset"/><br/>
</p>
</form>
</th>
</tr>
</table>
contact.php的内容如下:
<?php
//--------------------------Set these paramaters--------------------------
// Subject of email sent to you.
$subject = 'Results from Contact form';
// Your email address. This is where the form information will be sent.
$emailadd = 'here@ismyemailaddress.com';
// Where to redirect after form is processed.
$url = 'http://www.mywebsitename.com/contactsuccess.html';
// Makes all fields required. If set to '1' no field can not be empty. If set to '0' any or all fields can be empty.
$req = '0';
// --------------------------Do not edit below this line------------------------
$text = "Results from form:\n\n";
$space = ' ';
$line = '
';
foreach ($_POST as $key => $value) {
if ($req == '1') {
if ($value == '') {
echo "$key is empty";
die;
}
}
$j = strlen($key);
if ($j >= 20) {
echo "Name of form element $key cannot be longer than 20 characters";
die;
}
$j = 20 - $j;
for ($i = 1; $i <= $j; $i++) {
$space .= ' ';
}
$value = str_replace('\n', "$line", $value);
$conc = "{$key}:$space{$value}$line";
$text .= $conc;
$space = ' ';
}
mail($emailadd, $subject, $text, 'From: ' . $emailadd . '');
echo '<META HTTP-EQUIV=Refresh CONTENT="0; URL=' . $url . '">';
?>
这很好用,应该发送电子邮件。但是,如前所述,它过去曾受到电子邮件注入的影响。我在我的提供者的 wiki 中查找了如何保护这个简单的脚本不被注入,他们建议添加以下内容,这对我不起作用,并且我不断收到我无法直接访问它的错误消息:
<?php
if (!isset($_POST['submit'])) {
echo "<h1>Error</h1>\n
<p>Accessing this page directly is not allowed.</p>";
exit;
}
$email = preg_replace("([\r\n])", "", $email);
$find = "/(content-type|bcc:|cc:)/i";
if (preg_match($find, $name) || preg_match($find, $email) || preg_match($find, $url) || preg_match($find, $comments)) {
echo "<h1>Error</h1>\n
<p>No meta/header injections, please.</p>";
exit;
}
?>
所以我显然不知道如何像他们所说的那样将它添加到脚本的顶部,或者它根本不起作用 - 我得到的只是关于直接访问页面的错误消息。
我不能随意安装软件包来使用 PHP 形式的邮件程序,我需要尽可能地简化和安全。我希望能够使它成为没有人可以访问 php 代码的地方,因此如果可能的话,也没有人可以从中获取电子邮件地址。
有人可以用外行的方式解释如何做到这一点吗?
【问题讨论】:
-
你能添加确切的(即复制粘贴)错误消息吗?
-
Ajean,当我使用 HTML 并且上面的第一个 php 脚本没有错误时,它运行良好并且我收到了电子邮件。但是当我将第二个脚本添加到它的顶部时,我得到了错误:“不允许直接访问此页面。”以下代码可以放在 PHP 脚本的顶部,以阻止最常见的标头注入。请注意,此代码不允许直接页面访问,因此只能添加到提交操作可访问的“进程”页面。它将过滤掉任何注入的 CC 或 BCC 标头以及注入电子邮件标头的任何新行或回车标记。
-
只是一个关于 SO 工作原理的快速提示,如果你想在评论中 ping 某人,你应该在他们的用户名之前加上
@(例如 @Not_A_Pro)。每个人都会在自己的帖子上收到有关 cmets 的通知,但不一定是其他评论者。我实际上在不知道你对我发表评论的情况下回来了(实际上我对这个主题知之甚少,只是想帮助你改进你的问题)。 -
@Ajean 感谢您的帮助。编辑我的帖子后,发生的事情是我担心的。一个没有同情心的超级用户将我标记为重复。当我检查它与我的问题无关或太高级时,我不明白它。这些群体显然不欢迎新用户(你是个例外),像他这样的混蛋也需要看看他们是如何成为初学者的。他的行为让人们远离而不是吸引他们,所以每个人都参与其中。虽然阿让,但我还是很感谢你。你太棒了。我的答案在下面的帖子中,现在一切正常!再次感谢。
标签: php html forms email code-injection