背景
H2 Database Console未授权访问,默认情况下自动创建不存在的数据库,从而导致未授权访问。各种未授权访问的教程,但是它怎么封堵呢?
-ifExists
启动参数添加 -ifExists
,它的含义:
[-ifExists] Only existing databases may be opened (all servers)
应用出厂时先创建好数据库文件后,修改启动脚本,添加该参数:
dir=$(dirname "$0")
nohup java -cp "$dir/h2-2.x.xx.jar:$H2DRIVERS:$CLASSPATH" org.h2.tools.Server -tcpAllowOthers -webAllowOthers -tcpPort -ifExists "$@" &
这样启动 h2 后首次访问时会因为 test 数据库不存在而无法连接:
只有输入正确的出厂数据库路径、帐号和密码,才能连接到数据库操作页面。
Preferences 未授权问题
上面只能封堵针对数据库操作的未授权访问,未登录时 Preferences 这个操作页面的 “shutdown” 按钮可以直接将 h2 服务停止,比前面的未授权更严重。
解决办法是升级到 2.x 版本,它自带了控制台管理员密码 webAdminPassord
配置,必须输入密码才能进入可选项配置页面。
悬案
1.x 版本控制台的可选项配置还是存在未授权访问问题,要么禁用 console 工具,要么配置防火墙策略允许特定主机访问 console 控制台请求,否则未授权情况下直接 shutdown 服务的话,就很危险了。
2.224 最新版本里面设置了adminLogin 登录密码,但是它的值设置是什么呢?
按最新操作手册说明,这个配置的值应该是用 org.h2.server.web.WebServer.encodeAdminPassword(明文)
运行出来的一个 hash 值,但是我在配置文件里面设置密码的哈希值后,输入密码始终不正确。而关于 h2 数据库的资料又少的可怜,好在升级为 2.224 最新版本的话,就不存在可选项配置的未授权访问问题了。
如果要搞明白这个管理员密码到底是何方神圣,估计只有运行源码来分析了!