使用htaccess拒绝ajax文件访问

时间:2010-08-12 10:42:44

标签: php jquery apache .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]

但是,它没有用。我做错了什么?有没有其他方法可以达到类似的结果。 (我不想在每个脚本中检查标题)。

5 个答案:

答案 0 :(得分:25)

坏:Apache: - (

X-Requested-With不是标准HTTP Header

你根本无法在apache中阅读它(也不是 ReWriteCond %{HTTP_X_REQUESTED_WITH} 也不是 %{HTTP:X-Requested-With}),因此无法在.htaccess或同一地点检查它。 : - (

<丑陋:剧本: - (

它只是在脚本中可访问(例如php),但是你说你不想在所有脚本中包含一个php文件,因为文件数量很多。

好:auto_prepend_file: - )

  • 但是......有一个简单的方法可以解决它: - )

auto_prepend_file指定在主文件之前自动解析的文件的名称。您可以使用它自动包含“检查器”脚本。

所以在ajax文件夹中创建一个.htaccess

php_value auto_prepend_file check.php

并根据需要创建check.php

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

您可以根据需要自定义它。

答案 1 :(得分:16)

我假设您将所有AJAX脚本放在目录ajax中,因为您在非工作示例中引用了^ / ajax / .php $。

在此文件夹/ajax/中放置一个包含此内容的.htaccess文件:

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

这样做就是在没有XMLHttpRequest标头的情况下拒绝任何请求。

答案 2 :(得分:1)

只有少数预定义的HTTP_ *变量映射到可以在RewriteCond中使用的HTTP标头。对于任何其他HTTP标头,您需要使用%{HTTP:header}变量。

只需更改

ReWriteCond %{HTTP_X_REQUESTED_WITH} ^$

要:

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

答案 3 :(得分:0)

只需检查文档开头的if($_SERVER['HTTP_X_REQUESTED_WITH']=='XMLHttpRequest'){,如果没有设置,则不要返回任何内容。

修改 原因如下:http://github.com/jquery/jquery/blob/master/src/ajax.js#L370

编辑2 我的不好,请再次阅读你的帖子。您也可以使文件夹无法访问Web,然后只有一个标准的ajax.php文件,其中include('./private/scripts.php')因为您的服务器仍然可以访问它,但没有人能够从他们的浏览器查看。

答案 4 :(得分:0)

使用.htaccess的另一种方法是使用$ _SERVER ['HTTP_REFERER']变量来测试从您的页面访问脚本,而不是从其他站点访问等。