Vaadin - 使用 ReadOnly 保护表单字段是否足够好?

问题描述 投票:0回答:1

亲爱的大家,我喜欢使用 Vaadin Webflow 并创建一些表单。如果用户没有“管理员”角色,某些字段不应变为可编辑。

Vaadin 支持将表单字段设置为只读或完全禁用字段,例如

TextField
。我还看到
Binder
支持
Binder.forField(...).bindReadOnly(...)

我想知道从安全角度来看应该使用哪种方法,因为我注意到在 Shadow root 中仍然呈现了一个

<input>
字段,该字段可能会被“黑客攻击”。

如果某个字段设置为“只读”但仍然被传输,Vaadin 是否会在服务器端执行检查?或者 Vaadin 中如何确保这种情况的安全?

EmailField email = new EmailField("Email");

Binder<User> binder = new BeanValidationBinder<>(User.class);
binder.setBean(user);

// some service to determine if Emailaddress can be edited for the current logged-in user 
boolean allowed = authorityService.isCurrentUserAdmin();

// 1. Method: set field to ReadOnly
email.setReadOnly(!allowed);

// OR

// 2. Method: set the binder to use only read-only getter
if(!allowed)
   binder.forField(email).bindReadOnly(User::getEmail); 

对于这两种情况,都会渲染

<input>
字段。那么这在 Vaadin 中是否足够安全,或者我应该担心并更改字段以使用“SPAN”文本标签和服务器端的特殊逻辑?

forms security binding vaadin vaadin-flow
1个回答
0
投票

我敢打赌,这属于 X-Y 问题。用户界面不应该是你的 这里是“最后一道防线”。你的

User
对象是一些 ORM 对象吗 与所有的花里胡哨?那么你的问题就在那里:那些 您的 UI 周围一定不能有某种权力。为 “动词”(动作),允许与“主语”(宾语)一起使用 并收紧。

编辑用户详细信息允许显示电子邮件,但不允许 编辑它,然后甚至不允许这样做。确保您正在使用 保证只读源(仅添加一个 getter(无 setter)) 电子邮件字段;最好将其定为最终版本)。并发送“更改 用户详细信息请求”进入您的图层,甚至不接受电子邮件 进来了。

综上所述,vaadin 处理这个问题的方式:如果该字段被读取 只是,那里的价值变化不会发生。恶意客户端 将字段设置回可写状态不会将其发送回(这不是 要么是经典的 HTTP-POST 形式,所以无论如何都会更难)。

但是使用活页夹为自己处理只读是一个坏主意。 因为此时的binder管理的是只读状态。所以 弄乱活页夹后面的字段将导致 问题。

所以最佳方法是:

  • 使支持豆中的字段成为决赛
  • 只为字段添加一个getter
  • 使用活页夹将bean链接到字段;让活页夹照顾好 用于处理只读
© www.soinside.com 2019 - 2024. All rights reserved.