Предотвратите прямой доступ к php-скрипту, но разрешите с index.html

У меня есть простая контактная форма, в которой пользователи вводят свои данные, и форма отправляет ее на адрес 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-страница с несколькими строками текста, которая позволяет пользователю узнать, что отправлено их электронное письмо, а затем перенаправляет их обратно на http://mydomain.com через 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 и бесчисленное множество других вещей, но ничего, что я, кажется, не сработал – он либо полностью заблокирует страницу (так что форма также не сможет получить к ней доступ), либо вообще не заблокирует ее. Я также посмотрел этот https://stackoverflow.com/a/409515/3366954, но не мог понять, как заставить это работать. Я совершенно новичок в html и php, но все остальное до сих пор мне удалось выяснить. Что я пропущу на этот раз?

Просто добавьте некоторую проверку на свой 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; } ?> 

Это предотвратит любые пустые отправки, не требуя от вас фильтрации по ссылочной странице. Как правило, вы всегда должны проверять ввод пользователя, так как это источник всех неприятностей (хакерство, ошибки, как правило, неожиданное поведение).

Вы не можете блокировать доступ браузерами к странице – когда браузер отправляет форму, она переходит к файлу .php так же, как если бы пользователь ввел свой URL напрямую, с той лишь разницей, что есть также данные POST.

Если вы хотите предотвратить спам, вам нужно убедиться, что ваш ввод верен. Убедитесь, что требуемые поля установлены. (Да, Эд Коттрелл был быстрее, см. Его ответ)

Что вам нужно сделать, это проверить свои входы, а если они неверны, не отправляйте форму.

 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 }