【问题标题】:PHP - Only allow access via AJAXPHP - 只允许通过 AJAX 访问
【发布时间】:2011-12-07 19:24:29
【问题描述】:

在我的 CMS 中,我有一个使用 AJAX 将大量迷你界面加载到面板中的页面。这些接口来自/ajax 目录中的各种 PHP 文件。

是否有可能只允许使用 ajax 访问这些文件,而不仅仅是浏览它们?

当然,我担心有人发现了/ajax 目录,甚至无需登录即可访问 CMS 的核心功能。当然我可以导入我的用户类并单独验证每个 AJAX 文件,但是否可以只允许通过 AJAX 访问?

【问题讨论】:

  • 不,您必须将您的身份验证代码放入处理服务器端代码的每个请求中。
  • 这是一个糟糕的安全模型。
  • @NullUserException 我没有说这是我在任何生产代码中的安全模型——我只是好奇...

标签: php javascript jquery ajax apache


【解决方案1】:

是否有可能只允许使用 ajax 访问这些文件,而不仅仅是浏览它们?

没有。

当您从 JavaScript 发出请求时,您可以添加额外的 HTTP 标头,或修改现有的标头(例如 Accept)……但由于您出于安全原因尝试这样做,这还不够。

当然,我可以导入我的用户类并单独验证每个 AJAX 文件

这样做。 Ajax 请求并不特殊。它们只是 HTTP 请求。为 Ajax 创建的端点应该像任何其他 HTTP 请求端点一样通过身份验证/授权来保护。

【讨论】:

  • 谢谢 - PHP $_SESSION 变量在通过 AJAX 访问时会完全相同吗?
  • WebSockets 呢?
  • @alessadro - 他们呢?这个问题与websockets无关。
【解决方案2】:

没有。无论如何,黑客可能只是伪造 Ajax 请求。您需要在任何地方进行身份验证,否则您会被搞砸的。

【讨论】:

    【解决方案3】:

    任何人都可以从浏览器外部向您网站上的任何公共 URL 发起 HTTP 请求。除了标头之外,AJAX 请求没有什么特别之处,而且很容易被欺骗。

    现在不容易被欺骗的是一种安全的会话机制。如果您要求人们登录,那么无论如何您都应该这样做。

    【讨论】:

      【解决方案4】:

      简单的回答,“不”。

      您的 ajax 文件还应验证用户是否以与系统前端相同的方式登录。

      【讨论】:

        【解决方案5】:

        AJAX 与标准请求几乎相同,您可以检查标头,但这不是安全的方式。这么短,你不能这样做。在服务器端验证您的提议。

        【讨论】:

          【解决方案6】:

          验证您的 AJAX 文件。如果有很多,创建一个类并在每个单独的 AJAX 文件中扩展它。

          /ajax/abstract.php:

          <?php
          abstract class AjaxHandler {
          
              public function __construct() {
                  // import authentication handler
                  if ($authenticated) {
                      $this->display();
                  }
                  else {
                      header('HTTP/1.1 401 Unauthorized');
                      exit;
                  }
              }
          }
          

          然后在每个文件中,即/ajax/get_user_profile.php:

          <?php
          class GetUserProfile extends AjaxHandler {
          
              public function display() {
                  // do your routine
              }
          }
          

          【讨论】:

          • 如何使用它,我想知道它是如何工作的?
          【解决方案7】:

          嗯,你可以有一个替代选择是使用post 方法从 php 中获取内容,并且在你的 php 中你应该为post 方法设置一个键。然后在系统范围内删除跨域访问。 :)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-11-20
            • 2013-03-01
            • 2016-08-06
            • 1970-01-01
            • 1970-01-01
            • 2013-03-04
            • 2012-06-04
            • 1970-01-01
            相关资源
            最近更新 更多