【问题标题】:Calling variable methods to handle ajax requests调用变量方法来处理ajax请求
【发布时间】:2017-05-10 14:10:24
【问题描述】:

我制作了一个controller.php 文件来处理ajax 请求,带有$_POST 参数actionmodule

if (isset($_POST["action"])) {
    $action = strtolower($_POST["action"]);

    if ($action === "get_notification") {
        //  return session notification messages
       //...

    } elseif (isset($_POST["module"])) {
        require_once("libraries/class.module.php");
        $module = new Module;

        $moduleName = strtolower($_POST["module"]);

        //  check if module-name is valid
        if ($module->verify($moduleName)) {
            // load  $modulename class
            require_once("libraries/class.".$moduleName.".php");

            //  factory used to create instance of $moduleName
            require_once("libraries/class.factory.php");

            // note: moduleName class extends Module class
            $module = $Factory->create($moduleName);

            //  verify method of $moduleName verifies action/method parameter
            //  using method_exists and cross-checking against a permitted methods list

            if ($module->verify($action)) {
                $message = $module->$action();
                echo json_encode($message);

            } else {
                //  handle invalid requests
                echo json_encode(["0", "Invalid request received"]);
            }

        } else {
            //  handle invalid requests
            echo json_encode(["0", "Invalid request received"]);
        }

    } else {
        //  handle invalid requests
        echo json_encode(["0", "Invalid request received"]);
    }

} else {
    //  handle invalid requests
    echo json_encode(["0", "No request received"]);
}

但我在 Stack Overflow 上阅读了 this 的帖子,该帖子建议不要使用可变方法。我是否应该选择一个检查每个$action 并调用相应方法的开关盒。这将导致更多的代码,这是我选择这种可变方法解决方案的最初原因。

【问题讨论】:

  • Yew,你应该。让客户端(浏览器)发送一个变量作为应该导入和调用类的参数可能会非常危险。
  • 您确实应该将可能的操作列入白名单。这就是每个框架(PHP 与否)所做的。其他任何事情都是自找麻烦。
  • @ADyson 如何将禁止的行为列入黑名单而不是将允许的行为列入白名单 :)
  • @feetnappy 取决于哪个列表更大。在大多数情况下,允许的列表会更小。如果你列入白名单,你知道你肯定允许某些东西通过,但如果你列入黑名单,你需要 100% 确定你没有忘记禁止某些东西。这使得白名单更加安全 IMO。

标签: php oop


【解决方案1】:

看起来您真正需要的是一个合适的路由系统。您可以自己制作(如here 所述)。或者使用现有的解决方案,例如FastRoute

至于实际使用“变量方法”,一般来说是个坏主意。但是,如果这些方法位于调用堆栈的开头(从引导文件执行),那么它们是一个非常实用的选择。

当涉及到安全问题时,控制器类中唯一的公共方法应该是那些您希望被调用的方法。这意味着你可以简单地做:

if (method_exists($controller, $action)) {

P.S. 你不必在那里做strtolower(),因为在 PHP 中类方法区分大小写(类名本身也不区分大小写) .

P.P.S.研究使用 composer 作为 PSR-4 自动加载器

【讨论】:

    猜你喜欢
    • 2017-06-23
    • 2018-10-06
    • 1970-01-01
    • 2013-06-13
    • 2018-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-19
    相关资源
    最近更新 更多