Разрешить PHP-файл запрашивать javascript, но не напрямую из браузера

Я использую сценарий jquery, который загружает файлы с помощью ajax и PHP. Он отправляет запрос upload_a_file.php, который затем загружает файлы.

Есть ли способ, которым я могу убедиться, что upload_a_file.php не загружен непосредственно в браузере?

Я попытался поставить upload_a_file.php выше моей папки public_html. Но, похоже, я не могу загрузить javascript для загрузки upload_a_file.php.

Вот URL-формат, который я использую в javascript для запроса upload_a_file.php:

../upload_a_file.php 

Возможно ли получить доступ к файлам выше public_html с помощью javascript?

JS не может получить доступ к чему-либо на сервере, который вы сами, как пользователь, не может. Если файл находится вне корневого каталога сайта, он НЕ доступен пользователю или JS. Представьте себе забавное место в сети, если бы JS мог магически обойти ограничения доступа на сервере и захватить больше. «Все, я собирался захватить список счетов этого банка, но это не в корне документа. Хорошо, что у меня есть Javascript, он может все!»

Это будет похоже на каждый эпизод из 24 , где «исправление в подсети» может волшебным образом обойти любой брандмауэр и получать данные с компьютеров, которые даже не подключены к сети или (еще лучше) даже не включены. Удивительные вещи, эти подсети.

Вы можете проверить HTTP-заголовок X_REQUESTED_WITH присутствует и имеет значение XMLHttpRequest . Это не нестандартный заголовок, но большинство правил JavaScript, включая jQuery, Prototype и mootools, следуют этому соглашению.

В PHP вы можете получить к нему доступ $_SERVER['HTTP_X_REQUESTED_WITH'];

например:

 if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') { // do something } 

Javascript запущен в браузере. Он выполняет свои запросы через браузер. Итак, нет, нет доступа к странице через ajax, но не напрямую из браузера.

Нет, не напрямую. Вы можете вызвать другой скрипт (PHP или любой другой), который либо «вызовет» ваш скрипт с include либо, например, с помощью fopen или curl .

Ничто не может обращаться к файлам выше public_html, потому что веб-сервер не будет их обслуживать. Это может иметь очевидные уязвимости безопасности, например, возможность просмотра любого файла в вашей файловой системе.

Если вы хотите ограничить файл только возможностью загрузки через ваш javascript, я бы подумал, что вы хотите посмотреть переменную $ _SERVER ['HTTP_REFERER'] в php. Это должно быть указано на странице, на которой расположен javascript, когда к ней обращаются правильно. Если это что-то еще или пустое, пользователь обращается к нему каким-либо другим способом.

Однако использование этого метода не следует полагаться на безопасность, поскольку референт может быть подделан правильными инструментами.

Поскольку прямой доступ к браузерам на странице является запросом GET с помощью PHP, вот очень простой метод контроля доступа, который позволяет кому-то непреднамеренно перейти непосредственно к upload_a_file.php:

В сценарии jquery используйте запрос ajax с типом «POST»:

 $.ajax({ url: "../upload_a_file.php", dataType: "json", type: "POST" }); 

и используйте это в файле upload_a_file.php:

 if ($_SERVER['REQUEST_METHOD'] == "POST") { // upload a file } else { header("Location: http://example.com/myPublicUploadPage.php"); die(); }