8

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


 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.

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

4

5 回答 5

4

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

于 2010-06-28T12:02:13.270 回答
3

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

链接可能会对您有所帮助。

于 2010-06-28T12:05:50.133 回答
3

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

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

您可以使用 Properties 来包含您的 DB 用户名和密码,您可以使用setproperty()方法将其编码到 Properties 对象中。

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

conn = DriverManager(url, properyObject);
于 2010-06-28T14:36:33.427 回答
2

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

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

通常的做法是禁止访问您的数据库(为 mysql 阻止 tcp 端口 3306)。事实上,这是 PCI-DSS 的要求。就算用户名和密码从哪里得到,也没有用。

于 2010-06-29T06:40:17.367 回答
0

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

于 2010-06-28T13:39:44.233 回答