findbugs和数据库密码安全问题

时间:2010-06-28 12:00:00

标签: java security findbugs

我正在使用以下代码初始化数据库连接:


 public Connection getConnection() {
        try {
            if (null == connection) {
                String driverName = "com.mysql.jdbc.Driver"; // MySQL MM JDBC driver
                Class.forName(driverName);

                // Create a connection to the database
                String serverName = "localhost";
                String database = "database";
                String url = "jdbc:mysql://" + serverName + "/" + mydatabase; // a JDBC url
                String username = "username";
                String password = "password";
                connection = DriverManager.getConnection(url, username, password);
            }
            return connection;
        } catch (ClassNotFoundException cnfe) {
            cnfe.printStackTrace();
        } catch (SQLException sqle) {
            sqle.printStackTrace();
        }
        throw new NullPointerException("Cannot establish database connection...");
    }

我知道这样做是不好的做法,我也对代码运行了FindBugs,并且遇到了以下安全问题: This code creates a database connect using a hardcoded, constant password. Anyone with access to either the source code or the compiled code can easily learn the password.

在没有此安全漏洞的情况下初始化数据库连接的最佳方法是什么?

5 个答案:

答案 0 :(得分:3)

从属性文件或LDAP或类似文件中读取密码,并将其安全访问权限仅限于用于运行软件的帐户(开发人员无权访问该帐户)。

答案 1 :(得分:3)

使用简单文件存储数据库属性并在代码中读取它们而不是硬编码。这不仅很干净,而且还可以限制文件访问。

link可能会对您有所帮助。

答案 2 :(得分:2)

此代码使用硬编码的常量密码创建数据库连接。

出现安全问题是因为您使用了数据库名称,用户名和密码。但肯定无法解决问题“任何有权访问源代码或编译代码的人都可以轻松学习密码”。我打赌你可以解决第一个问题。

您可以使用“属性”包含您使用 setproperty()方法编码到Properties对象中的数据库用户名和密码。

现在您可以将属性对象包含在 getConnection()方法中:

conn = DriverManager(url, properyObject);

答案 3 :(得分:2)

绝大多数Web应用程序使用硬编码的用户名/密码进行SQL连接。将生产凭证检查到源代码管理中,或者让实习生删除生产数据库的能力通常是不受欢迎的。生产凭证应受到保护,只有特权员工才能访问它们。

Web应用程序通常会泄漏其配置文件。例如,如果.xml文件存储在webroot中,则可以远程访问它:http://localhost/configs/db_config.xml

通常的做法是禁止访问您的数据库(阻止tcp端口3306用于mysql)。实际上,这是PCI-DSS的要求。即使用户名和密码在哪里获得,也没用。

答案 4 :(得分:0)

如果您使用的是Windows框,则可以将密码存储在配置文件中,然后使用DPAPI加密文件的文件/部分。这样,您也不必担心密钥管理。