无法在只读模式使用Crate JDBC 2.6.0,如何限制executeQuery执行增删改操作
Crate JDBC限制executeQuery执行写操作的解决方案
CrateDB JDBC驱动旧版本确实存在与JDBC规范不一致的问题,executeQuery未限制写操作执行,且setReadOnly方法未实现对应的读写限制逻辑,可通过以下方案解决:
- 数据库层权限管控(最稳妥方案)
CrateDB本身支持细粒度的权限控制,你可以为业务使用的数据库账号单独授予只读权限,从根源上禁止写操作执行,示例命令如下:
-- 创建只读用户 CREATE USER app_readonly WITH (password = 'your_custom_password'); -- 授予指定Schema的查询权限,可根据业务需要缩小授权范围 GRANT SELECT ON SCHEMA your_business_schema TO app_readonly;
配置后即使代码中通过executeQuery传入写操作语句,数据库会直接返回权限不足错误,不会实际执行写操作,该方案不会被上层逻辑绕过,安全性最高。
- 应用层SQL语句校验
你可以封装JDBC的Statement、PreparedStatement实现类,在executeQuery方法执行前对传入的SQL做类型校验:- 简单场景可以用正则匹配SQL开头的关键字,过滤
DELETE、UPDATE、INSERT、DROP、ALTER、CREATE等写操作关键字,匹配到直接抛出异常终止执行 - 复杂场景可以引入
JSqlParser等SQL解析工具,准确识别SQL语句类型,避免正则误判注释、字符串中的同名关键字
- 简单场景可以用正则匹配SQL开头的关键字,过滤
- 升级JDBC驱动版本
旧版本Crate JDBC驱动未对齐JDBC规范对executeQuery的限制,你可以升级到官方最新稳定版驱动,新版本已新增校验逻辑,禁止executeQuery执行非查询类语句,同时部分版本也已支持connection.setReadOnly(true)的限制逻辑。
内容的提问来源于stack exchange,提问作者Chandan
相关产品推荐
相关产品推荐

