我可以使用任何用户名和密码登录 Firebird 3 数据库

问题描述

在新创建的数据库中,当我使用错误用户名和密码登录时没有收到任何错误消息(用户 TTT 和 AAA 甚至不存在)

[root@fewww bin]# ./isql /opt/db/treewww/ftree.db -user ttt -password bbb;
Database: /opt/db/treewww/ftree.db,User: TTT
sql> exit;
[root@fewww bin]# ./isql /opt/db/treewww/ftree.db -user aaa -password ccc;
Database: /opt/db/treewww/ftree.db,User: AAA
sql> SELECT rdb$get_context('SYstem','ENGINE_VERSION') from rdb$database;
RDB$GET_CONTEXT
===============================================================================
3.0.2

同时,当我使用错误登录凭据时,我在另一个数据库中收到“常规”错误消息:

[root@fewww bin]# ./isql /opt/db/testwww/ftest.db -user aaa -password ddd
Statement Failed,sqlSTATE = 08001
I/O error during "lock" operation for file "/opt/db/testwww/ftest.db"
-Database already opened with engine instance,incompatible with current
Use CONNECT or CREATE DATABASE to specify a database

你能解释一下吗?

解决方法

您只指定数据库的路径,而不是主机名,因此,isql 使用 Firebird 嵌入式数据库引擎打开和访问数据库,而不是 Firebird 服务器。从 Firebird 3 开始,Firebird Embedded 不再在 Linux 上验证密码(它从未在 Windows 上这样做过,现在 Linux 遵循相同的规则),另请参阅 Firebird 3 Release Notes

这适用于以下假设:如果用户对数据库文件具有直接读写访问权限,则允许他们打开它。仍然使用指定的用户名,以应用授予该用户的权限,并且没有检查密码,任何用户名都被认为是有效的。除非您已向该用户名或用户 PUBLIC 授予权限,否则此类用户可能没有足够的权限执行除查询系统表之外的其他操作。

您显示的第二个错误可能意味着该数据库是由另一个使用不同 Firebird 引擎的应用程序打开的(例如 SuperServer 模式下的 Firebird 服务器进程),或者您的用户和该进程可能没有相同的访问权限锁文件(对此不是 100% 确定)。您可以尝试通过 localhost 连接,看看您是否可以通过以下方式访问数据库:isql localhost:/opt/db/testwww/ftest.db -user aaa -password ddd