Я новичок в использовании AJAX, и я просто пошел по учебнику, чтобы получить некоторую информацию из моей базы данных с помощью AJAX и вывести ее на страницу. Есть строка, где я вызываю php-скрипт, где выполняется запрос базы данных, и результат повторяется. Я немного обеспокоен тем, что, поскольку имя файла видимо во внешнем интерфейсе, и только цель состоит в том, чтобы напрямую выводить результаты базы данных, это может представлять проблему безопасности. Есть ли способ защитить этот файл и убедиться, что он запускает запрос только при вызове через сценарий ajax?
Вот бит соответствующего кода ajax (обратите внимание на строку «somefile.php»):
ajaxRequest.onreadystatechange = function(){ if(ajaxRequest.readyState == 4){ var ajaxResponse = ajaxRequest.responseText; element.innerHTML = '<h2>' + ajaxResponse + '</h2>'; } } ajaxRequest.open("GET", "somefile.php", true); ajaxRequest.send(null); Спасибо за любые ответы.
Нет, нет. Все, что вы доверяете JavaScript на стороне клиента, вы доверяете пользователю.
Если у вас есть аутентификация / авторизация, вы доверяете пользователям, которых вы разрешаете. Если вы этого не сделаете, вы доверяете всем и своим ботам.
Поместите свой PHP-код в эту проверку:
 if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') { /* Your code here */ } 
Все запросы ajax имеют этот набор заголовков. Как и все источники, этот инструмент тоже может быть подделан, чтобы всегда не доверять чему-либо, поступающему от клиента, фильтровать / белить список входящих параметров запроса и заботиться о своей базе данных с помощью подготовленных операторов.
  Вы должны беспокоиться о сохраненных xss в ajaxResponse .  Вы можете избежать этого, выполнив htmlspeicalchars($var,ENT_QUOTES);  на данные перед тем, как вы поместите их в базу данных или перед тем, как распечатать их в своем ответе ajax. 
Я решил это следующим образом:
 if($_SERVER['HTTP_REFERER'] == 'http://' . $_SERVER['SERVER_NAME'] . '/mydir/myscriptwithajaxcall.php') // do something else echo 'Restricted Access'; 
Затем скрипт php выполняется только после вызова ajax, если он исходит из определенного скрипта (в том же месте). Примечание. Я тестирую сеансы и константы и не работал: /
Я пробовал несколько способов защитить php-файл под прямым доступом, и эта работа:
 if($_SERVER['PHP_SELF'] == $_SERVER['REQUEST_URI']) exit('This file can not be accessed directly...');