【问题标题】:best way to handle ajax requests in php在 php 中处理 ajax 请求的最佳方法
【发布时间】:2014-07-08 20:24:06
【问题描述】:

这是一个好方法,通过javascript调用php函数?

我的 POST 数据如下所示:

{
    0: [
        {
            "name": "function",
            "value": "toggle_user_status"
        }
    ],
    1: [
        {
            "name": "user_id",
            "value": "1"
        }
    ],
    ...
    ...
}

我的 Ajax 类看起来像这样:

<?php
class Ajax
{
        public function handleAjax() {
                $load_function = $_POST['function'];
                return call_user_func(array($this,$load_function));
        }

        private function toggle_user_status() {
                return '555nase';
        }
}

我知道 $_POST 变量不安全,但这不是重点。我想知道这是否是调用函数的好方法...?

PS: url http://local.yolo/admin/ajax 只接受来自已登录管理员的请求

【问题讨论】:

  • 不理想,是什么阻止我编辑您的 JS(使用 Firebug 之类的东西)并将其更改为运行 delete_all_users() ?我知道猜测函数名称并不容易(你可能永远不会拥有该函数)但是如果你这样做了呢?
  • 非常不安全。严重地。假设有人编辑帖子数据以调用delete 函数。你要吗?没有。
  • 您需要验证您的输入。调用本身对我来说很好(虽然不理想) - 如果您检查参数(允许的函数,允许的参数)......
  • @ex3v :我忘了说:url local.yolo/admin/ajax 只接受来自已登录管理员的请求
  • IMO 没关系。您不知道是否有任何漏洞/后门可能最终导致未经授权的访问。还有错误地做错事(例如调用另一个方法)的因素吗?还有一件事情。从我个人的经验来看,这些事情一开始似乎很简单,但它们几乎总是会变成一大碗你无法维护的蹩脚代码。我的意思是——当然,现在只有几行代码,但是函数 a 需要一些额外的参数——你必须处理这个,函数 b——另外两个参数等等。

标签: javascript php ajax


【解决方案1】:

我了解您并不担心安全隐患,并且您知道它们。不过,这不是一个好主意。原因是,您的 JavaScript 必须知道 PHP 实现。如果您在 PHP 端更改了某些内容,则必须在 JavaScript 端更改某些内容。最好要求 PHP 软件做某事,但你不在乎它是怎么做的。

例如,您可以为 JavaScript 定义一个公共接口,该公共接口是 URL。您不关心他们如何处理任何事情,您只是想获得一个也遵循您定义的公共接口的响应。例如你的例子:

jQuery.post("/admin/user/toggle-status", { id: 1 });

此时 URL 是公共接口。

用户类处理与用户相关的事情:

<?php

interface UserInterface {

  public function toggleStatus();

}

AJAX 类处理 AJAX 调用:

<?php

class AJAX {

  public function handle() {

  }

}

关注点分离在这里很重要。

【讨论】:

    【解决方案2】:

    只需检查来自 js 的函数。使用这样的东西:

    <?php
        class Ajax
        {
            private $_allowed_functions = array('toggle_user_status');
    
            public function handleAjax() {
                $load_function = $_POST['function'];
                return in_array($load_function, $this -> _allowed_functions) ? call_user_func(array($this,$load_function)) : NULL;
            }
        }
    

    【讨论】:

      猜你喜欢
      • 2015-12-20
      • 2015-06-18
      • 2012-03-30
      • 1970-01-01
      • 1970-01-01
      • 2013-10-13
      • 1970-01-01
      • 2020-09-30
      • 1970-01-01
      相关资源
      最近更新 更多