【发布时间】:2017-05-10 14:10:24
【问题描述】:
我制作了一个controller.php 文件来处理ajax 请求,带有$_POST 参数action 和module
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。