【问题标题】:Deny ajax file access using htaccess使用 htaccess 拒绝 ajax 文件访问
【发布时间】:2010-12-20 00:32:19
【问题描述】:

有些脚本我只通过 ajax 使用,我不希望用户直接从浏览器运行这些脚本。我使用 jQuery 进行所有 ajax 调用,并将所有 ajax 文件保存在一个名为 ajax 的文件夹中。

所以,我希望创建一个 htaccess 文件来检查 ajax 请求 (HTTP_X_REQUESTED_WITH) 并拒绝该文件夹中的所有其他请求。 (我知道可以伪造 http 标头,但我想不出更好的解决方案)。我试过这个:

ReWriteCond %{HTTP_X_REQUESTED_WITH} ^$
ReWriteCond %{SERVER_URL} ^/ajax/.php$
重写规则 ^.*$ - [F]

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

【问题讨论】:

  • “(我不想检查每个脚本中的标题)” - 你能解释一下为什么不吗?我会说为所有 ajax 请求制作一个通用的包含文件或一个单独的类是非常有意义的。
  • 脚本已经写好了,数量很多。
  • 我之前在这里看到过类似的帖子,我会质疑(就像我之前所做的那样)你为什么要限制人们直接访问 AJAX 文件?有什么顾虑?非登录用户会得到敏感数据?老实说,我对保护 ajax 文件的理由感到困惑,除非被 javascript 调用。

标签: php jquery apache .htaccess


【解决方案1】:

坏事: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;
}
?>

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

【讨论】:

    【解决方案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_* 变量映射到您可以在 RewriteCond 中使用的 HTTP 标头。对于任何其他 HTTP 标头,您需要使用 %{HTTP:header} 变量。

      只是改变

      ReWriteCond %{HTTP_X_REQUESTED_WITH} ^$
      

      收件人:

      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'),因为您的服务器仍然可以访问它,但没有人可以从他们的浏览器中查看。

        【讨论】:

        • 我喜欢这个主意。但是,我必须将参数传递给 ajax 调用以区分要调用的“私有”脚本。由于 ajax 调用分布在多个文件中,因此在我的特定情况下这是不切实际的。
        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-05-11
          • 2014-05-11
          • 1970-01-01
          • 2019-04-07
          • 1970-01-01
          • 1970-01-01
          • 2014-03-25
          • 2017-08-14
          相关资源
          最近更新 更多