【问题标题】:Securing POST data in Router保护路由器中的 POST 数据
【发布时间】:2013-04-06 11:20:57
【问题描述】:

我正在尝试找出对发送到我的应用的 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 设置为无/默认限制(但如果需要,可以在我的配置文件中将其设置为更少)。

我注释掉了 urlencoding,因为我目前不确定在达到预期功能时解码它的最佳方式。我应该对它进行编码吗?最好的解码方法是什么?也许在我所有的课程都继承自的大师Controller 中?

欢迎提出其他建议。

【问题讨论】:

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


    【解决方案1】:

    如果您想限制POST 请求的大小,那么最好的选择是在网络服务器本身的级别上进行。有一些工具可以做到这一点。既然您最喜欢使用 Apache,那么您可以查看 mod_security。其他网络服务器也有类似的选项。

    当限制POST 请求的大小时,风险之一是用于执行页面的内存量。如果数据已经在$_POST 中,那你就来不及了。

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

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

    路由不应该验证输入。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-07
      • 2019-02-12
      • 2021-03-02
      • 1970-01-01
      • 2020-10-04
      • 2019-02-10
      相关资源
      最近更新 更多