防止注入基本的php脚本

时间:2016-02-18 22:39:09

标签: php html forms email code-injection

我有一个虚拟(免费)航空公司网站,在密码保护区域后面我可以使用我在公共区域/页面中无法使用的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代码的地方做到这一点,所以没有人可以从中收集电子邮件地址。

有人可以解释如何以外行的方式做到这一点吗?

1 个答案:

答案 0 :(得分:1)

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