Запретить доступ к AJAX-файлу с помощью htaccess - PullRequest
15 голосов
/ 12 августа 2010

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

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

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

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

Ответы [ 5 ]

25 голосов
/ 19 декабря 2010

Плохо: Apache: - (

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

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

Гадкий: Сценарий: - (

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

The Good: auto_prepend_file: -)

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

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

Создайте .htaccess в папке ajax

php_value auto_prepend_file check.php

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

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

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

16 голосов
/ 17 декабря 2010

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

В этой папке /ajax/ поместите.htaccess файл с этим содержимым:

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

Это запрещает любой запрос без заголовка XMLHttpRequest.

1 голос
/ 14 декабря 2010

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

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

ReWriteCond %{HTTP_X_REQUESTED_WITH} ^$

Кому:

ReWriteCond %{HTTP:X-Requested-With} ^$
0 голосов
/ 15 декабря 2010

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

0 голосов
/ 12 августа 2010

Просто проверьте 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'), так как ваш сервер все равно будет иметь к нему доступ, но никто не сможет просматривать его из браузера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...