【问题标题】:Preventing injections in to a basic php script [duplicate]防止注入基本的php脚本[重复]
【发布时间】: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"/>
                    &nbsp; &nbsp; &nbsp;
                    <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


【解决方案1】:

改变这一行: if (!isset($_POST['submit'])) { 对此: if (!isset($_POST['Submit'])) {

【讨论】:

  • 感谢这神奇地让一切顺利。感谢您花时间以我可以理解的方式回复,并且在玩弄它并做出您建议的更改之后,现在一切正常!干杯!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-24
  • 2014-01-18
  • 1970-01-01
  • 2015-02-08
  • 2011-11-17
  • 2019-04-04
相关资源
最近更新 更多