Intereting Posts
Процесс дочернего процесса Apache завершен со статусом 255 лучше ли убеждать / закодировать пользовательский ввод, прежде чем хранить его в базе данных или сохранить его, как он есть в базе данных, и избежать его при извлечении? PHP ereg против preg Наконец, альтернатива предложения для тайм-аута скрипта Почему я вижу значение «undefined» на экране при отправке формы в jQuery Mobile? Форматирование строки даты в PHP Как изменить время на сервере Apache, чтобы оно соответствовало времени компьютера (PHP)? Включить html в электронную почту Это противоречит шаблону MVC, вызывающему представление в другом представлении с переменными? Сохранить сервер приложений с IMAP и PHP Объединение и сжатие нескольких файлов JavaScript в php Определение внешних ключей Laravel с фабриками моделей, от одного до одного и от одного до многих отношений без создания ненужных моделей Неизвестная ошибка модификатора 'l' Исключить исключение SoapFault: Bad Request Понимание каскадных операций Doctrine

Запретить доступ к файлу ajax с помощью htaccess

Есть несколько сценариев, которые я использую только через ajax, и я не хочу, чтобы пользователь запускал эти скрипты непосредственно из браузера. Я использую jQuery для создания всех вызовов ajax, и я сохраняю все свои файлы ajax в папке с именем ajax.

Итак, я надеялся создать файл htaccess, который проверяет запрос ajax (HTTP_X_REQUESTED_WITH) и отказывает все остальные запросы в этой папке. (Я знаю, что http-заголовок можно подделать, но я не могу придумать лучшего решения). Я попробовал это:

ReWriteCond% {HTTP_X_REQUESTED_WITH} ^ $
ReWriteCond% {SERVER_URL} ^ / ajax / .php $
ReWriteRule ^. * $ – [F]

Но это не работает. Что я делаю неправильно? Есть ли другой способ добиться аналогичных результатов. (Я не хочу проверять заголовок в каждом скрипте).

Плохо: Apache 🙁

X-Requested-With в нестандартном HTTP-заголовке .

Вы не можете прочитать его в apache вообще (ни ReWriteCond %{HTTP_X_REQUESTED_WITH} ни %{HTTP:X-Requested-With} ), поэтому его невозможно проверить в .htaccess или в том же месте. 🙁

The Ugly: Script 🙁

Его просто доступно в скрипте (например, php), но вы сказали, что не хотите включать php-файл во все ваши скрипты из-за количества файлов.

Хорошее: auto_prepend_file 🙂

  • Но … есть простой способ решить эту проблему 🙂

auto_prepend_file указывает имя файла, который автоматически анализируется перед основным файлом. Вы можете использовать его, чтобы автоматически включать скрипт «checker».

Поэтому создайте .htaccess в папке ajax

 php_value auto_prepend_file check.php 

и создайте check.php как вы хотите:

 <? if( !@$_SERVER["HTTP_X_REQUESTED_WITH"] ){ header('HTTP/1.1 403 Forbidden'); exit; } ?> 

Вы можете настроить его так, как хотите.

Я предполагаю, что у вас есть все ваши скрипты AJAX в каталоге ajax, потому что вы ссылаетесь на ^ / ajax / .php $ в своем нерабочем примере.

В этой папке /ajax/ поместите файл .htaccess с этим контентом:

 SetEnvIfNoCase X-Requested-With XMLHttpRequest ajax Order Deny,Allow Deny from all Allow from env=ajax 

То, что это делает, отрицает любой запрос без заголовка XMLHttpRequest.

Существует только несколько предопределенных HTTP_ * переменных, сопоставляемых с заголовками HTTP, которые вы можете использовать в RewriteCond. Для любых других HTTP-заголовков вам нужно использовать переменную% {HTTP: header}.

Просто измените

 ReWriteCond %{HTTP_X_REQUESTED_WITH} ^$ 

Для того, чтобы:

 ReWriteCond %{HTTP:X-Requested-With} ^$ 

Просто проверьте, if($_SERVER['HTTP_X_REQUESTED_WITH']=='XMLHttpRequest'){ в начале документа, если он не установлен, то ничего не возвращайте.

edit Вот почему: http://github.com/jquery/jquery/blob/master/src/ajax.js#L370

edit 2 Мой плохой, просто прочитайте свой пост снова. Вы также можете сделать папку недоступной для Интернета, а затем просто иметь стандартный файл ajax.php, который include('./private/scripts.php') поскольку ваш сервер все равно сможет получить к нему доступ, но никто не будет возможность просмотра из своего браузера.

Альтернативой использованию .htaccess является использование переменной $ _SERVER ['HTTP_REFERER'] для проверки того, что сценарий выполняется с вашей страницы, а не с другого сайта и т. Д.