Запретить доступ к файлу 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 осуществляется с вашей страницы, а не с другого сайта и т.д.