Я использую сценарий 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(); }