2013-03-15 2 views
13

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

Вот мой 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 внешними скриптами.

+0

Вы можете ограничить сайты, которые могут получить доступ к countvote.php только те, на своем домене? – user829323

+0

@ user829323 Это тривиально подделывать за пределами браузера с помощью 'wget' –

ответ

3

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

2

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

+2

К сожалению, это не вариант. Я обнаружил, что iOS 6 кэширует запросы POST от JQuery/AJAX. Таким образом, на мобильных устройствах информация об ответах неточна. – LoneWolfPR

+0

Проверьте этот ответ, чтобы исправить это. http://stackoverflow.com/questions/12506897/is-safari-on-ios-6-caching-ajax-results – castis

+1

Если я ошибаюсь, мне кажется, что вам нужен JQuery 1.5 или выше, чтобы использовать элемент управления заголовком. К сожалению, я затрудняюсь использовать 1.3, который не поддерживает это. Это часть CMS, которую я не могу обновить в настоящее время. Спасибо хоть. – LoneWolfPR

33

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

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

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

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

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

Может быть, код может работать только со второй частью

+1

Это действительно хорошая идея. и это работает. – Kiwy

+3

Это не работает. Любой может отправить заголовок X-Requested-With и Referer с любыми значениями, которые им нравятся. – Quentin

+0

@Quentin, так каково ваше решение для решения требований? Секрет, данный по инициативе? –

Смежные вопросы