【问题标题】:findbugs and database password security issuefindbugs 和数据库密码安全问题
【发布时间】:2011-03-09 02:37:51
【问题描述】:

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


 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.

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

【问题讨论】:

    标签: java security findbugs


    【解决方案1】:

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

    【讨论】:

    • 具体一点:不要使用系统属性,因为任何可以列出机器上活动进程的人都可以看到 -D 选项。
    • 是什么阻止了开发者编写后门?在这种情况下,是一个故意的 sql 注入漏洞。
    • @rook 代码可以被开发人员和安全审计员审计。问题不仅在于开发人员的恶意,还在于开发人员丢失了 USB 密钥或桌面受到破坏。
    【解决方案2】:

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

    这个link 可以帮助你。

    【讨论】:

    • 如果你加密它,你要把密钥放在哪里?
    • @rook:你不能。如果您需要将密码“保存”以明文形式传输到服务器端并且不希望用户输入密码短语或其他内容,则无法将密码“保存”保存在文件中。你只能混淆它。但是,如果服务器接受散列密码,您可以只存储散列。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

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

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

      conn = DriverManager(url, properyObject);
      

      【讨论】:

        【解决方案5】:

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

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

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

        【讨论】:

        • 如果您的公司中有多个开发人员,这实际上是一个问题。 生产密码不应提供给所有开发人员以确保安全环境。源代码通常分布在多个系统上:SCM、CI、台式机等。请参阅其他答案。
        • @h3xStream 绝对正确。这个帖子太老了,见谅。
        • 我正要请求编辑.. 然后看到你已经这样做了。 +1
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多