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.

Каков наилучший способ инициализировать соединение с базой данных без нарушения безопасности?


person mabuzer    schedule 28.06.2010    source источник


Ответы (5)


Подавляющее большинство веб-приложений используют жестко закодированные имя пользователя/пароль для своего SQL-соединения. Проверка рабочих учетных данных в системе управления версиями или предоставление стажерам возможности удалить производственную базу данных обычно не одобряется. Производственные учетные данные должны быть защищены, и только привилегированные сотрудники должны иметь к ним доступ.

Веб-приложения часто пропускают свои файлы конфигурации. Например, если файл .xml хранится в корневом каталоге, к нему можно получить удаленный доступ: http://localhost/configs/db_config.xml.

Общепринятой практикой является запрет доступа к вашей базе данных (блокировка tcp-порта 3306 для mysql). На самом деле это требование PCI-DSS. Даже если логин и пароль где-то получить, это будет бесполезно.

person rook    schedule 29.06.2010
comment
На самом деле это проблема, если в вашей компании более одного разработчика. Производственные пароли не должны быть доступны всем разработчикам для безопасной среды. Исходный код обычно распространяется на несколько систем: SCM, CI, настольный компьютер и т. д. См. другие ответы. - person h3xStream; 14.08.2017
comment
@h3xStream абсолютно правильно. Этот пост очень старый, простите меня. - person rook; 15.08.2017
comment
Я собирался попросить отредактировать... а потом увидел, что ты уже это сделал. +1 - person h3xStream; 15.08.2017

Считайте пароль из файла свойств или LDAP или аналогичного и защитите доступ к ним только для учетной записи, используемой для запуска программного обеспечения (к которой ни один из разработчиков не должен иметь доступа).

person dty    schedule 28.06.2010
comment
Чтобы быть конкретным: не используйте системное свойство, потому что параметр -D будет виден всем, кто может перечислить активные процессы на машине. - person Aaron Digulla; 28.06.2010
comment
что мешает разработчику написать бэкдор? В данном случае преднамеренная уязвимость SQL-инъекций. - person rook; 29.06.2010
comment
@rook Код может быть проверен разработчиками и аудиторами безопасности. Проблема заключается не только в злом умысле разработчиков, но и в том, что разработчик потерял USB-ключ или скомпрометировал свой рабочий стол. - person h3xStream; 14.08.2017

Используйте простые файлы для хранения свойств базы данных и чтения их в коде вместо жесткого кодирования. Это не только чисто, но вы также можете ограничить доступ к файлам.

Эта ссылка может вам помочь.

person bragboy    schedule 28.06.2010
comment
Если вы зашифруете его, куда вы собираетесь поместить ключ? - person rook; 29.06.2010
comment
@rook: Вы не можете. Невозможно сохранить пароль в файле, если вам нужно передать его в открытом виде на сервер и не хотите, чтобы пользователь вводил парольную фразу или что-то в этом роде. Вы можете только запутать его. Однако, если сервер принимает хешированные пароли, вы можете хранить только хэш. - person Martin Thurau; 29.06.2010

Этот код создает соединение с базой данных, используя жестко заданный постоянный пароль. .

Эта проблема безопасности возникает из-за того, что вы использовали имя БД, имя пользователя и пароль. Но, конечно же, вы не можете решить проблему «Любой, у кого есть доступ к исходному или скомпилированному коду, может легко узнать пароль». Бьюсь об заклад, U может решить первую проблему.

Вы можете использовать Свойства, чтобы включить имя пользователя БД и пароль, с помощью которых вы можете закодировать в объект Свойства, используя метод setproperty().

Теперь вы можете включить объект свойства в метод getConnection():

conn = DriverManager(url, properyObject);
person Venkat    schedule 28.06.2010

Вы можете сохранить пароль в файле конфигурации, а затем зашифровать файл/разделы файла с помощью DPAPI, если вы используете Windows box. Таким образом, вам также не придется беспокоиться об управлении ключами.

person Community    schedule 28.06.2010