Разрешить доступ только через AJAX

Одной из проверок при использовании технологии 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 выполняется именно в нем, а поскольку спам роботы отправляют данные напрямую, то блокировка не даст скрипту выполниться.

Важно также отметить, что не существует надежного способа узнать, что запрос был сделан через Ajax. Никогда не можно доверять данным, поступающим от клиента, и, кроме того, практически любой метод может быть подменен. Но реализация несколько разных проверок значительно повышают безопасность вашего скрипта.
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *