Запретить прямой доступ к обработчику форм PHP - PullRequest
0 голосов
/ 04 ноября 2019

У меня есть несколько форм, используемых на моем сайте (Wordpress), которые используют PHP-файл в качестве «действия» в форме с использованием method = "post". Все прекрасно работает, однако я получаю большое количество пустых отправок форм, что происходит при непосредственном доступе к обработчику PHP (потому что моя проверка формы интерфейса обходится путем прямого доступа к файлу обработчика, а обработчик включает wp_mailфункция отправки электронной почты).

Я пытаюсь выяснить, как запретить прямой доступ к файлу обработчика, не нарушая форму путем запрета доступа к обработчику. Если это имеет смысл?

Форма

<form class="contact-form" action="<?=get_bloginfo('template_url') . '/path/to/my/handler-file.php' ?>" method="post" enctype="multipart/form-data">
    <input type="text" id="first_name" name="first_name" placeholder="First name">
    <label for="first_name">First name</label>

    <input type="text" id="last_name" name="last_name" placeholder="Last name">
    <label for="last_name">Last name</label>

    <input type="email" id="email" name="email" placeholder="Your email">
    <label for="email">Your email</label>

    <button class="button" type="submit">Submit</button>
</form>

Обработчик

// Load WordPress Bootstrap
require_once( $_SERVER['DOCUMENT_ROOT'] . '/wp-load.php' );

// To
$to = get_option('admin_email');

// Subject
$subject = 'Contact – ' . $_POST['first_name'] . ' ' . $_POST['last_name']; // Including name ensures new thread in their inbox

// Headers
$headers = array(
    'Reply-To: ' . $_POST['first_name'] . ' ' . $_POST['last_name'] . ' <' . $_POST['email'] . '>'
);

// Data
$message = [];
$message['First name'] = $_POST['first_name'];
$message['Last name'] = $_POST['last_name'];
$message['Email'] = $_POST['email'];

// Blank var to hold data
$message_str = '';

// Push data to $message_str
foreach ($message as $label => $entry) {
    $message_str .= "—\n" . $label . ":\n" . $entry . "\n\n";
}

wp_mail($to, $subject, $message_str, $headers);

Ответы [ 2 ]

1 голос
/ 04 ноября 2019

Добавить

if(isset($_POST['first-name'], $_POST['last-name'], $_POST['email'])){
   //Do rest of page...
}else{
   //Do nothing or throw error
}

В начало вашего скрипта проверить, были ли они введены

0 голосов
/ 04 ноября 2019

Я нашел решение, которое работает для меня, используя суперглобальный $ _SERVER. Из этого я могу обнаружить REQUEST_METHOD, который в моем случае будет POST, как установлено в моем HTML.

// Only run if request uses POST method (as set in <form> html)
// This helps to avoid blank submissions, as accessing the file directly will not run
if ( $_SERVER["REQUEST_METHOD"] == "POST" ) :

    // My handling code here

// If request does not use POST method, display error
else :
   echo 'Direct access to this file is prohibited.';
endif;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...