保护路由器中的POST数据

时间:2013-04-06 11:20:58

标签: php oop model-view-controller post front-controller

我正在尝试找出最佳的清理方法,并在某种程度上验证发送到我的应用程序的POST数据。

我使这个函数驻留在我的路由器中,并且在__constructor if($_POST)中被调用了:

private function validatePost()
  {
    foreach($_POST as $key => $value) {
      if(preg_match('/[^a-zA-Z]/', $key))
      {
        $this->throwError('POST Error', 'Invalid index name.');
        return;
      }
      if(strlen($value) > $this->postLimit && $this->postLimit != -1)
      {
        $this->throwError('POST Error', 'Posted value to large.');
        return;
      }
      if(substr($key, -2, 2) == 'id' && !is_numeric($value))
      {
        $this->throwError('POST Error', 'Expected a number, didn\'t get one.');
        return;
      }
      else
      {
        //$value = urlencode($value);
      }
      $_POST[$key] = $value;
    }
  }

目的有点严格,但如果我遵守我在整个框架中制定的规则,这无关紧要。

我已经读过限制$ _POST的大小确实有助于阻止某些攻击,在这种情况下我将-1设置为no / default限制(但是如果我的配置文件中需要它可以设置为更少)。

我注释掉了urlencoding,因为我目前还不确定当它到达预期函数时解码它的最佳方法。我应该对它进行编码吗?解码它的最佳方法是什么?也许在我的所有课程都延伸到的主人Controller中?

欢迎任何其他建议。

1 个答案:

答案 0 :(得分:2)

如果要限制POST请求的大小,那么最好的选择是在Web服务器本身级别执行此操作。有工具可以做到这一点。由于您最喜欢使用Apache,因此您可以查看mod_security。其他网络服务器也会有类似的选择。

限制POST请求的大小时,其中一个风险是用于执行页面的内存量。如果数据已经在$_POST,那么你就太晚了。

至于验证和卫生,应该在domain objectspresentation entitiessql中完成...您验证域对象中输入的逻辑。您在SQL约束中使用数据结构。并且您清理表示实体中的输出(我没有链接将它们称为“表示模型”,因为它增加了对MVC的混淆)。

MVC中的路由机制(这是“前端控制器的一个方面”)应该只接受用户的输入并将其组织在结构化的Request实例中。然后控制器的操作使用此操作。将数据传递到model layer

路由不应该验证输入。