У меня есть веб-сайт, который должен увеличивать значения в базе данных на основе взаимодействия с пользователем. Когда пользователи нажимают кнопку, вызывается скрипт php, который увеличивает значение. Я хотел бы защитить этот скрипт от доступа к внешним скриптам. В настоящее время пользователь может написать свою собственную веб-страницу с функцией 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 внешними скриптами.
Решение требует двух шагов.
Во-первых, файл 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');
Возможно, код может работать только со второй частью
Вы можете проверить, равен ли $_SERVER['HTTP_X_REQUESTED_WITH']
xmlhttprequest
, но не является надежным способом определить, является ли запрос AJAX-запросом или нет, всегда есть способ обойти это. Но он защищает вас от случайных ударов, таких как ошибочно введенные URL-адреса, сканеры и т. Д.
На самом деле это не 100% метод. Запросы AJAX всегда поступают от клиента. Используйте POST-запросы вместо GET, и это поможет сдержать любые проблемы, но не полностью остановить их и на вашем php, просто отбросьте все запросы на получение.