Odoo11如何防止用户通过开发者工具修改o_invisible_modifier越权访问
Odoo11 员工表单前端隐藏可绕过的安全修复方案
你现在采用的前端隐藏+屏蔽开发者工具的方案没有任何实际安全防护能力:o_invisible_modifier只是前端加的样式类,用户不仅能通过元素检查删掉这个类看内容,甚至可以直接抓RPC接口响应、绕过页面直接调用模型读取方法拿全量数据,靠jQuery拦截快捷键根本挡不住这类操作。
真正的安全控制必须做在后端,前端的隐藏、展示逻辑只负责交互体验,绝对不能把敏感数据返回给无权限的用户后再在前端藏起来。你现有架构下不用重构全局记录规则,按下面的方案改就能彻底堵死漏洞:
具体实现步骤
- 后端接口层做数据过滤(核心)
继承hr.employee模型,重写所有涉及字段值返回的读方法(read、search_read、read_group),逻辑非常明确:- 先判断当前登录用户,如果是系统管理员、HR管理员这类有全量员工数据权限的用户,直接返回原始数据不做处理
- 对普通员工用户,遍历返回的记录集,只要不是当前用户关联的员工档案,除了
id、name这类允许公开的字段,其余所有字段全部置空后再返回给前端,从根源上杜绝敏感数据下发
参考实现代码(放到自定义模块的模型层即可):
from odoo import models, api class HrEmployee(models.Model): _inherit = 'hr.employee' def _filter_employee_sensitive_fields(self, records): # 有全量权限的用户直接返回 if self.env.user._is_admin() or self.env.user.has_group('hr.group_hr_manager'): return records allow_fields = {'id', 'name', 'display_name', '__last_update'} current_emp_id = self.env.user.employee_id.id for res in records: if res.get('id') != current_emp_id: for key in list(res.keys()): if key not in allow_fields: res[key] = False return records @api.model def read(self, fields=None, load='_classic_read'): res = super().read(fields=fields, load=load) return self._filter_employee_sensitive_fields(res) @api.model def search_read(self, domain=None, fields=None, offset=0, limit=None, order=None): res = super().search_read(domain=domain, fields=fields, offset=offset, limit=limit, order=order) return self._filter_employee_sensitive_fields(res) - 前端层逻辑保留优化
你之前写的根据权限显示notebook页面、隐藏字段的逻辑可以正常保留,作为正常的交互体验优化即可,不需要删掉。这时候就算有用户删掉DOM上的隐藏类,因为接口根本没返回真实的敏感数据,页面上也只会显示空值,不会泄露信息。 - 移除无效的前端拦截代码
把之前写的屏蔽开发者工具快捷键、禁用右键之类的jQuery代码全部删掉,这类代码不仅防不住真正的绕过操作,还会干扰正常的系统调试,甚至容易和Odoo原生前端逻辑冲突引发页面报错,没有任何保留价值。
方案优势
- 改动量极小,不需要调整现有系统的权限架构,不需要配置复杂的全局记录规则,适配你当前的系统限制
- 从数据源头做权限校验,不管用户用什么前端绕过手段,都拿不到无权限的敏感数据,彻底解决安全隐患
- 完全兼容Odoo原生逻辑,后续升级、新增字段只需要维护允许公开的字段列表即可,维护成本很低
- 普通用户的使用体验和之前完全一致,不会有交互上的变化
内容的提问来源于stack exchange,提问作者Pawan Kumar Sharma
相关产品推荐
相关产品推荐

