阻止直接访问php脚本,但允许从index.html

时间:2014-03-01 03:14:23

标签: php html .htaccess email access-control

我有一个简单的联系表单,用户输入他们的数据,表单将其发送到'mail.php',然后传递到那里的电子邮件帐户。 'mail.php'文件位于我的根目录和'index.html'之间,我遇到的问题是我不希望用户能够通过他们的浏览器直接访问http://mydomain.com/mail.php,因为这样只是发送一个空白表格,可以用来向我发送垃圾邮件。我真的很紧张,试图找出一种只允许表单访问'mail.php'的方法。这就是我设置表单的方式:

<form method="post" action="mail.php">
    <div class="row half">
        <div class="6u"><input type="text" required autocomplete="off" name="name" placeholder="Name" /></div>
        <div class="6u"><input type="email" required autocomplete="off" name="email" placeholder="Email" /></div>
    </div>
    <div class="row half">
        <div class="12u"><textarea name="message" required placeholder="Message" rows="6"></textarea></div>
    </div>
    <div class="row">
        <div class="12u">
            <ul class="actions">
                <li><input type="submit" class="button" value="Send Message" /></li>
            </ul>
        </div>
    </div>
</form>

然后我的'mail.php'文件设置如此,成功标题是一个html页面,其中包含几行文字,让用户知道他们的电子邮件已发送,然后将其重定向回{{3} 5秒后。

<?php
$name = $_POST['name'];
$email = $_POST['email'];
$message = $_POST['message'];
$formcontent=" From: $name \n Message: $message";
$recipient = "me@email.com";
$subject = "Contact Form";
$mailheader = "From: $email \r\n";
mail($recipient, $subject, $formcontent, $mailheader) or die("Error!");
header("Location: success");
exit;
?>

我已经摆弄了.htaccess和无数其他的东西,但我做的一切似乎都没有用 - 它会完全阻止页面(因此表单也无法访问它)或根本不阻止它。我也看过这个http://mydomain.com,但无法弄清楚如何让它工作。我是html和php的新手,但到目前为止我已经设法搞清楚了。我这次错过了什么?

3 个答案:

答案 0 :(得分:3)

只需在PHP脚本中添加一些验证。例如:

<?php
if(isset($_POST['name'], $_POST['email'], $_POST['message'])) {
    $name = $_POST['name'];
    $email = $_POST['email'];
    $message = $_POST['message'];
    $formcontent=" From: $name \n Message: $message";
    $recipient = "me@email.com";
    $subject = "Contact Form";
    $mailheader = "From: $email \r\n";
    mail($recipient, $subject, $formcontent, $mailheader) or die("Error!");
    header("Location: success");
    exit;
}
?>

这将阻止任何空白提交,而不要求您通过引用页面进行过滤。作为一般规则,您应该始终验证用户输入,因为它是各种麻烦的来源(黑客,错误,通常是意外行为)。

答案 1 :(得分:2)

您无法阻止浏览器访问该页面 - 当浏览器提交表单时,它会导航到.php文件,就像用户直接输入其URL一样,唯一的区别就是提交了POST数据

如果您想阻止垃圾邮件,则需要确保输入正确无误。确保设置了必填字段。 (是的,Ed Cottrell更快,看到他的回答)

答案 2 :(得分:0)

您需要做的是验证输入,如果输入不正确,请不要发送表单。

if (empty($_POST['name'])) {
    $errors[] = "You need to enter your name";
}
if (empty($_POST['email'])) {
    $errors[] = "You need to enter your email";
}
if (empty($_POST['message'])) {
    $errors[] = "You need to enter a message";
}

if (isset($errors)) {
    echo "There were errors sending your email:";
    echo "<ul>";
    foreach ($errors as $error) {
        echo "<li>$error</li>";
    }
    echo "</ul>";
}
else {
    // send message
}
相关问题