【问题标题】:MVC - Sanitizing data, where?MVC - 清理数据,在哪里?
【发布时间】:2011-02-02 01:32:20
【问题描述】:

我正在使用 CakePHP,但这是关于 MVC 模式的问题。我的表单中有标签的输入文本(用逗号分隔)。为了添加标签,我创建了一个标签模型方法,它基本上检查标签是否存在,然后在标签计数器中添加新标签或只是一个新单元(标签模型有这些字段:id、name、slug、count) . 在控制器中,我分解标签字段并一次传递一个标签。 问题是:我在哪里清理数据?在控制器或模型方法中?我认为它应该在控制器中,因为那是我爆炸的地方,但就可重用性而言,我认为我应该清理模型中的数据。 你怎么看?

【问题讨论】:

    标签: model-view-controller model controller


    【解决方案1】:

    我不同意清理数据以存储在控制器中,并认为最好的地方是在模型中进行,因为控制器不应该知道数据是如何存储的,但清理需要这些知识(例如,mysql_real_escape_string() 用于存储MySql vs. pg_escape_string() 用于 Postgresql,或者如果存储在 XML 文件中,可能会检查有效的 XML,或者其他用于不同存储机制的东西。

    为了防止跨站点脚本等事情,在存储之前不要清理数据,因为稍后您可能会合法使用某些 html 标签,并且(理想情况下)在视图或控制器中执行此操作。

    【讨论】:

    • 所以你基本上是在暗示这一切都取决于我正在消毒的内容,对吧?在我的情况下,我的标签是严格的字母数字,每次我必须创建 slug(我使用 slug 检查标签的存在)。所以我想我会从控制器中的 html 中清除数据,我会检查 SQL 注入和模型中 slug 的创建。可以吗?
    • 从 HTML 中清除数据通常应该只用于输出,也许你想要像 <a> 这样的标签,例如用于与网页设计相关的网站。在这种情况下,只需存储值,将值按原样传递给模型并仅在输出时删除 HTML,从而将 HTML 保留在存储中,您可以通过其他方式访问它,例如报告应用程序。请记住,任何用户生成的内容,即使存储后也可能是恶意的。 joelonsoftware.com/articles/Wrong.html 中概述了一种明确的方法
    【解决方案2】:

    我想说,严格来说,清理您的数据应该发生在控制器中,但清理通常也指清理用户输入以避免许多问题,例如 SQL 注入。由于您在不同的上下文中使用“清理”一词,因此我们必须更加注意该上下文是什么。

    您没有清理用户输入,这意味着它实际上不需要在控制器中发生。您正在更改此操作的结果,具体取决于您保存的项目是否已存在于数据库中。因此,在我看来,它应该发生在模型中(或者,正如 MunkiPhD 所指定的,在某种辅助类中有一个方法,您可以从任何地方调用它——但我说的是在模型中调用它)。

    编辑:通常,在 MVC 中,模型知道是否应该将新行保存到数据库中,或者根据您的模型实例是否具有有效 ID 来更新现有行。如果它有一个 ID,模型应该保存到由该 ID 索引的行。如果没有,模型会创建一个新模型。据我了解,您要做的就是知道在哪里决定是创建一个新的还是更新现有的,这发生在模型中。

    【讨论】:

    • 是的,我更新的不同之处在于我必须在计数器中添加一个单位,这不是 cakephp 模型中的默认行为,但这不是一个真正的问题。
    • 你不能扩展模型并告诉框架使用你的子类吗?
    【解决方案3】:

    您应该在客户端的视图和服务器端的控制器上清理数据。

    【讨论】:

      【解决方案4】:

      您希望从控制器中对其进行清理,但是,“来自”并不意味着“进入”。有一个单独的类来清理数据 - 这样您就可以从需要的任何地方调用该类。

      您基本上想创建一个合同,让您的模型始终接收良好的数据,这意味着您必须事先对其进行清理。

      【讨论】:

      • CakePHP 有一个 Sanitize 类,我正在使用它。我只是在想我必须在哪里使用它。当然,我会事先进行清理,事实上,在我的自定义方法中,我会在清理发生后调用保存/更新方法。
      猜你喜欢
      • 2014-02-24
      • 2015-07-06
      • 2018-12-29
      • 2014-02-20
      • 2011-02-22
      • 2011-04-12
      • 1970-01-01
      • 1970-01-01
      • 2017-01-20
      相关资源
      最近更新 更多