在 Gsp 中导入域是否会使页面易受攻击

does importing domains in Gsp make the pages vulnerable

假设我在 GSP 中对域进行页面导入,例如:

<%@ page import="com.sample.entity.Book" %>

通过

将其用于您的页面
<g:select from="${Book.list()}"
          optionKey="id"
          optionValue="title"
          name="bookSample"/>

使用导入是一种糟糕的编程习惯吗?我是 Grails 的新手,在很多教程中都看到过这种做法,但我的领导不鼓励我这样做,因为根据他的说法,黑客可以轻松地从数据库中获取数据。我一直反对它,但我想我需要一些支持。

我同意以上观点,使用控制器获取图书列表更为理想 - 但我认为我不明白使用 <%@ page import="" %>编码错误,因为它使页面容易受到攻击。

我知道 GSP 已编译,因此 HTML 页面看不到任何导入引用。

更新:感谢大家提供意见。我已经更新了问题以使其更加集中。如果有人告诉你这是错误的,这就是原因 - 你的想法有点超越最佳实践,更多地考虑安全性,我真的无法想象如何通过导入

我不太确定 "hackers will do bad things" 推理,但是有更好的方法可以直接在 GSP 中使用 GORM。

让我们明确一点,直接在 GSP 中使用 GORM 在技术上并没有错,这只是一种不好的做法。为什么?它没有让您明确区分模型和视图。

您的视图 (GSP) 不应构建模型。它应该只是用它来渲染视图。然而,您的控制器确实应该构建您的视图 (GSP) 使用的模型。

在您的示例中,该模型来自 GORM 查询。但是,将来您可能最终会将其委托给使用某些微服务的服务。

由于模型是在控制器而不是 GSP 中构建的,因此您不必梳理所有 GSP 并找到需要重构的地方。应该和换控制器一样简单。

这就是您应该避免在 GSP 中直接使用 GORM 的真正原因。关注点分离。

至于域名的实际导入?这并不是一个坏习惯,因为您的模型可能包含域实例。它有点冗长(并且在大多数情况下并不是真正需要的)但是这种冗长也有助于记录视图正在使用的域 类。

我通常不在我的 GSP 中使用特定的导入,因为我发现模型会随着时间的推移而变化,维护导入成为一个问题。

更新 考虑再三之后,我终究想不出一个真正的理由来说明为什么在 GSP 中使用导入会被视为安全风险。你的领导有很多解释要做,或者你需要更换他。

我发现在 GSP 中使用的逻辑越少越好,随着它们变得越大越复杂,它们变得难以管理并且难以调试;特别是如果你有嵌套模板。

Grails 的脚手架本身就是这样做的,我认为这是一种糟糕的做法——视图数据应该填充在控制器中,控制器本身应该从服务中获取数据,使域对象进行有意义的交互方式,或以事务方式访问数据库。