0

Any user have login/password in Oracle database. I have a code:

Connection con;
Statement stmt = null;
String query = "SELECT user FROM dual";
try {
    dataSource = (DataSource) new InitialContext().lookup("jdbc/MyDataSource");
} catch (NamingException e) {
    throw new ExceptionInInitializerError(e);
}
try {
    System.out.println("name, password:" + name + "|" + password);
    con = dataSource.getConnection(name, password);
    stmt = con.createStatement();
    ResultSet rs = stmt.executeQuery(query);
    while (rs.next()) {
        System.out.println("User:" + rs.getString("USER"));
    }
    con.close();
    return true;
} catch (SQLException ex) {
    Logger.getLogger(UserInfoServiceOracle.class.getName()).log(Level.SEVERE, null, ex);
    return false;
}

If I put a correct password, next user could getConnection using any login/password and with login/password from first correct user.

Log:

INFO:   name, password:correctUser|correctPassword
INFO:   User:correctUser
INFO:   name, password:jhkjhkjh|khkjhkj
INFO:   User:correctUser
4

3 回答 3

2

数据源是连接池的外观。

  • 正如你所证实的。即使您提供了不正确的密码,数据源也会返回连接。这意味着数据源不会担心您提供给它的用户名密码。

  • 正如其他人在这里指出的那样,数据源是由应用程序服务器配置和创建的。服务器从配置文件(一些 xml)中读取适当的参数(如用户名/密码、初始连接数、最大连接数等)并创建连接(初始连接数)以供应用程序稍后使用。

  • 因此,当您调用时dataSource.getConnection,数据源将返回已创建的连接。提供的用户名/密码无效。

于 2013-07-19T12:44:37.210 回答
1

您的数据库凭据绑定到DataSource. 因此,您将始终使用提供给DataSource.

ADataSource是托管资源,它不打算与其他用户名连接。

根据您的环境,您可以使用驱动程序本身来创建您自己的连接,但是您将失去DataSource为您提供的所有可能性(例如连接池)。

在 aConnection返回DataSource的方法getConnection()中是无操作的。

于 2013-07-19T12:30:08.327 回答
0

我认为您将数据库的安全性与您应该围绕应用程序设计的安全性混淆了。

您的应用程序知道数据库的凭据(可能通过属性文件)并构建数据源。一旦用户通过您的应用程序验证了自己的身份,他们就可以访问您的应用程序(以及数据源)的功能。

于 2013-07-19T12:30:34.333 回答