【问题标题】:How to handle REQUEST in PHP如何在 PHP 中处理 REQUEST
【发布时间】:2011-01-02 06:46:57
【问题描述】:

是否有一个类可以处理$_REQUEST,它可以让 php 开发人员的生活更轻松? 我想更轻松地处理客户请求。 我不想用if(is_set($_REQUEST['blabla'])) {makesomthing();} 测试 我希望有这样的解决方案。

class rpclike
{
 public function getMember()
 {
  $memberid = $this->inputhandler['memberid'];
  $member = $this->memberclass->getmember($memberid);

   foreach($member as $mem)
   {
    echo $mem->id;
   }
 }

}

$rpc = new rpclike();

那么如果我从这样的 javascript 调用 rpclike

<a href="#" onclick="GETURL("rpclike.php?getMember&memberid=22")">Get member</a>

哪个班级可以做这样的事情?

【问题讨论】:

  • 让用户决定调用什么总是以灾难告终。
  • 我真的不明白为什么这个问题被否决了,这是一个正常的问题。我认为没有理由拒绝投票
  • 我不喜欢它,因为它容易出现安全问题。您在该类中放置的任何功能都将暴露给网络。您可能是您项目的唯一开发人员,但其他人可能会看到这一点并认为这是一个好主意,实施它,而从事他们项目的人可能不知道曝光并实施 delete_user 方法或类似的东西。

标签: php httpwebrequest rpc


【解决方案1】:

我不这么认为。能够调用任意方法将是一个巨大的安全漏洞。

【讨论】:

  • 当然,但首先我会在做任何事情之前先打电话 if(!$this->user->isadmin()) return false;
  • 这不一定是重点。假设您的系统不安全(没有系统是 100% 安全的)并且有人设法欺骗了管理员凭据,他们可能会执行任何操作。如果您自己进行调度,您至少可以限制这一点。
【解决方案2】:

不建议您使用$_REQUEST,因为它会带来安全问题。您应该使用$_GET$_POST$_COOKIE 之一,具体取决于您尝试检索的全局请求变量。您最好的选择是拥有以下内容:

class input {

    public static function get($key, $value = false) {
        return (!empty($_GET[$key])) ? $_GET[$key] : $value;
    }

    public static function post($key, $value = false) {
        return (!empty($_POST[$key])) ? $_POST[$key] : $value;
    }

    public static function cookie($key, $value = false) {
        return (!empty($_COOKIE[$key])) ? $_COOKIE[$key] : $value;
    }

}

然后你可以像这样使用这个类:

if (input::post('field', null) != null) {

}

if (input::get('field', false) != false) {

}

虽然这仍需要测试,但您可以在没有为全局变量设置数据的情况下显式设置返回值。

【讨论】:

  • 不要忘记实现get_magic_quotes_gpc() 解决方法。
  • 非常正确,想提一下……我只是习惯了自己关掉它。
【解决方案3】:

PHP 并没有真正可以以这种方式使用的默认类结构,因为它起源于基于过程的编程。

如果你觉得有必要,创建这样一个类对你来说是相当微不足道的。但是,您实际上只会增加开销。如果它的便利性对您来说是值得的,那么您可以利用 __get() and __set() 方法为您处理存在性检查。

您希望使用它以更简单的方式处理客户端请求这一事实可能是一个很好的指标,表明您应该转向类似 MVC 框架的东西,它通常会处理 URL 并将它们自动路由到适当的方法。大多数 PHP 框架已经为您完成了这项工作。如需详细了解该流程的一般工作原理,您可以see how CodeIgniter does it

【讨论】:

  • 谢谢你,你激励我从现在开始使用framewort codelgniter,祝你有个愉快的夜晚
【解决方案4】:

执行以下操作:

url: /foo/bar?req=getMembers&memberid=22

那么你可以这样做:

$request = $_GET['req'];
$request();

危险性稍低的版本:

$req_methods = array(
    getMembers => 'some_function',
    saveMembers => 'another_function',
    sendMessage => 'send_him_an_email'
);
$request = $_GET['req'];
$req_methods[$request]();

【讨论】:

  • 这似乎有点冒险。例如,如果有人请求 /foo/bar?req=apache_child_terminate 或其他一些危险的功能怎么办?
  • 添加了稍微不那么危险的版本。
  • 我仍然建议用isset($req_methods[$request])包装后者
【解决方案5】:

这除了涉及明显的安全风险外,还是可行的。这是用于在 MVC 系统中引导请求的常见模式。

假设你请求 index.php?class=User&method=ViewProfile

$module = new $_GET['class']();
if(!method_exists($module,$_GET['method']))
$module->$eventName();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多