Запретить доступ к файлу 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]

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

Ответы

Ответ 1

Плохой: Apache: - (

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

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

Ужасно: Script: - (

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

Хорошее: auto_prepend_file: -)

  • Но... есть простой трюк для его решения: -)

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

Итак, создайте .htaccess в папке ajax

php_value auto_prepend_file check.php

и создайте check.php по своему усмотрению:

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

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

Ответ 2

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

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

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

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

Ответ 3

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

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

ReWriteCond %{HTTP_X_REQUESTED_WITH} ^$

To:

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

Ответ 4

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

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

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

Ответ 5

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