Разрешить доступ к файлу 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 внешними скриптами.
Ответы
Ответ 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, просто отбросьте все запросы на получение.