我使用CakePHP,但它是关于MVC模式的问题。我的表单中有标签的输入文本(用逗号分隔)。为了添加标签,我创建了一个标签模型方法,基本上检查标签是否存在,然后在标签计数器中添加新标签或新单元(标签模型包含以下字段:id,name,slug,count) 。 在控制器中,我会分解标签字段并一次传递一个标签。 问题是:我在哪里清理数据?在控制器或模型方法中?我认为它应该在控制器中,因为这是我爆炸的地方,但就可重用性而言,我认为我应该在模型中清理数据。 你觉得呢?MVC - 清理数据,在哪里?
回答
我不同意将控制器中的数据进行消毒处理,并认为最好的地方是在模型中进行,因为控制器不应该知道数据如何存储,但消毒需要知识(例如,mysql_real_escape_string()
用于存储MySql与PostgreSQL的pg_escape_string()
相比,或者可能检查存储在XML文件中的有效XML,或者用于不同存储机制的其他内容)。
为了防止跨站点脚本之类的事情发生,请勿在存储之前对数据进行清理,因为稍后您可能会对某些html标记进行一些合法使用,并且(理想情况下)在视图中或控制器中执行此操作。
你想从你的控制器中清理它,但是“from”并不意味着“in”。让一个单独的课程清理数据 - 这样您就可以从任何需要的地方调用该课程。
您基本上想要创建合同,您的模型将始终收到良好的数据,这意味着您必须事先对其进行消毒。
那么CakePHP有一个Sanitize类,我正在使用它。我只是在想我在哪里使用它。 当然,我会清理beforhand,事实上我的自定义方法中,我发现消毒后发生了save/update方法。 – dierre 2010-03-29 14:49:01
您应该在客户端的View和服务器端的Controller上清理数据。
严格来讲,我会说,你的数据应该发生在控制器中,但一般来说,清理用户输入也是为了避免很多问题,比如SQL注入。由于您在不同的环境中使用“消毒”一词,因此我们必须更多关注这种情况。
你并没有清理用户输入,这意味着它并不是真的需要在控制器中发生。您将根据您保存的项目是否已存在于数据库中来更改此操作的结果。因此,在我看来,它应该发生在模型中(或者,像MunkiPhD指定的那样,在某种助手类中有一种方法,您可以从任何地方调用 - 但我称之为模型中的方法)。
编辑:通常,在MVC中,模型知道是否应该将新行保存到数据库中,或根据模型实例是否具有有效的ID来更新现有的行。如果它有一个ID,模型应该保存到由该ID索引的行。如果没有,模型会创建一个新模型。我的理解是,你想要做的就是知道在哪里做出决定是创建一个新的还是更新现有的一个,并且这在模型中发生。
- 1. C#(或任何语言)DDD - 在哪里清理用户输入数据?
- 2. asp.net mvc linq清理数据库调用
- 3. 在哪里把逻辑清理来自外部系统的数据
- 4. 从哪里获取地理数据?
- 5. 在哪里处理StaleObjectStateException
- 6. 在哪里把.remove()清除以前的数据点?
- 7. 在哪里存储数据?
- 8. heroku数据库在哪里?
- 9. 关系数据在哪里?
- 10. 数据存储在哪里?
- 11. 我在哪里可以找到MVC的清晰示例?
- 12. ASP.NET MVC文档在哪里?
- 13. MVC中的M在哪里?
- 14. 在哪里存储临时数据在MVC 2.0项目
- 15. MVC:我应该在哪里格式化数据?
- 16. asp.net mvc教程 - 它在哪里存储我的登录数据?
- 17. Asp.Net MVC 2中的AccountController在哪里存储其数据?
- 18. MVC模型在哪里把数据具体检查
- 19. MVC我应该在哪里验证我的数据?
- 20. ASP.net MVC:应用程序数据在哪里?
- 21. ASP.NET MVC多站点 - 在哪里存储站点配置数据
- 22. 我的数据库在哪里?
- 23. 我的数据库文件在哪里?
- 24. 架构:在哪里清理上传的文件名?
- 25. 在ASP.NET MVC中将复杂数据验证的数据管理规则放在哪里?
- 26. R数据清理
- 27. 清理JSON数据
- 28. 清理数据R
- 29. 清漆配置文件在哪里?
- 30. UITextField在哪里设置清除OnBeginEditing
所以你基本上建议所有都取决于我正在消毒的东西,对吧?在我的情况下,我的标签是严格字母数字和每次我必须创建slu((我使用slu检查标签的存在)。所以我想我会在控制器中清除html中的数据,然后检查SQL注入以及在模型中创建slug。这可以吗? – dierre 2010-03-29 14:53:48
清除HTML中的数据通常应该只用于输出,也许你想要有像''这样的标签,例如为一个网页设计相关的网站。在这种情况下,只需将值存储到模型中,并将其仅输出到模型中,然后将HTML保留在存储器中,然后通过其他方式(如报告应用程序)访问它。请记住,任何用户生成的内容,即使存储都可能是恶意的。 http://www.joelonsoftware.com/articles/Wrong.html描述了一种清楚的方法 – Residuum 2010-03-29 17:17:35