Одной из проверок при использовании технологии Ajax, которые необходимо включить в скрипт отправки данных от пользователей сайта, является проверка поступления данных, которые могут отправить не только через Ajax, но и напрямую спам роботы.
Как работает передача данных напрямую? Давайте разберем все по порядку. Например, мы имеем форму и скрипт:
<input type="text" id="name" value="" /> <input type="submit" id="send" value="Отправить" /> <script src="https://code.jquery.com/jquery-3.5.1.js"></script> <script> $(document).ready(function(e){ $('body').on('click', '#send', function(e){ $.ajax({ type: "POST", url: "/ajax.php", data: {'name': $('#name').val()} }); }); }); </script>
И, соответственно исполняемый AJAX файл (ajax.php):
<?php file_put_contents($_SERVER['DOCUMENT_ROOT'].'/test.txt', $_POST['name']); ?>
Сейчас нам неважно, что будет выполнять исполняемый PHP скрипт, но в данном примере мы записываем в файл значение поля Name. При такой реализации можно обойтись без AJAX, просто добавив атрибут FORM в форму с указанным исполняемым AJAХ файлом и заменив ID на NAME:
<form action="/ajax.php" method="POST"> <input type="text" name="name" value="" /> <input type="submit" name="send" value="Отправить" /> </form>
И все пройдет успешно. То есть, спам робот без проблем отправит данные даже без использования браузера. Для того, чтобы этого не произошло и разрешить доступ только через AJAX, необходимо добавить условие:
<?php if (!isset($_SERVER['HTTP_X_REQUESTED_WITH']) || $_SERVER['HTTP_X_REQUESTED_WITH'] !== 'XMLHttpRequest') exit(); file_put_contents($_SERVER['DOCUMENT_ROOT'].'/test.txt', $_POST['name']); ?>
При данной реализации, выполняется проверка на технологию отправки данных, и если этот метод не XMLHttpRequest — прекращаем выполнения скрипта. Для технологии Ajax необходим браузер, поскольку JavaScript выполняется именно в нем, а поскольку спам роботы отправляют данные напрямую, то блокировка не даст скрипту выполниться.