Подтвердить что ты не робот

Разрешить доступ к файлу PHP только через ajax на локальном сервере

У меня есть веб-сайт, который должен увеличивать значения в базе данных на основе взаимодействия с пользователем. Когда пользователи нажимают кнопку, вызывается php script, которая увеличивает значение. Я хотел бы защитить этот script от доступа к внешним скриптам. В настоящее время пользователь может написать свою собственную веб-страницу с функцией javascript, которая неоднократно удаляет один и тот же файл php, чтобы взорвать значение в базе данных.

Вот мой код jQuery, который делает приращение:

jQuery(function(){
$('.votebtn').click(function(e){
    var mynum = $(this).attr('id').substring(0,5);
    $.ajax({
            url:"countvote.php",
            type:"GET",
            data: { 
                thenum:mynum
            },
            cache: false,
            success:function(data) {
                alert('Success!');
                }
            }
        });
});
});

Как мне это сделать, чтобы только вызов от ajax/jquery на локальном сервере мог получить доступ к "countvote.php"? Если это не правильный путь, я открыт для любого предложения, которое предотвратит злоупотребление моего php script внешними скриптами.

4b9b3361

Ответ 1

Решение требует двух шагов.

Во-первых, файл ajax должен разрешать доступ только в ajax-запросе с помощью этого кода.

define('IS_AJAX', isset($_SERVER['HTTP_X_REQUESTED_WITH']) &&      strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest');
if(!IS_AJAX) {die('Restricted access');}

Во-вторых, файл ajax имеет доступ к имени файла, который вызывает его с помощью команды $_SERVER ['HTTP_REFERER']. Таким образом, вы можете ограничить доступ только на главном сервере.

$pos = strpos($_SERVER['HTTP_REFERER'],getenv('HTTP_HOST'));
if($pos===false)
  die('Restricted access');

Возможно, код может работать только со второй частью

Ответ 2

Вы можете проверить, равен ли $_SERVER['HTTP_X_REQUESTED_WITH'] xmlhttprequest, но не является надежным методом определения того, является ли запрос AJAX-запросом или нет, всегда есть способ обойти это. Но он защищает вас от случайных ударов, таких как ошибочно введенные URL-адреса, сканеры и т.д.

Ответ 3

На самом деле это не 100% метод. Запросы AJAX всегда поступают от клиента. Используйте POST-запросы вместо GET, и это поможет сдержать любые проблемы, но не полностью остановить их и на вашем php, просто отбросьте все запросы на получение.