Я новичок в использовании 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...');