Как я могу защитить имя пользователя MySQL и пароль от декомпиляции?

Security Warning: этот ответ не соответствует лучшим рекомендациям по безопасности. Эвакуация неадекватна для предотвращения SQL-инъекции , вместо этого используйте подготовленные операторы . Используйте стратегию, изложенную ниже, на свой страх и риск. (Кроме того, mysql_real_escape_string() был удален в PHP 7.)

Вы могли бы сделать что-то основное:

$safe_variable = mysql_real_escape_string($_POST["user-input"]);
mysql_query("INSERT INTO table (column) VALUES ('" . $safe_variable . "')");

Это не решит каждую проблему, но это очень хороший ступень. Я оставил очевидные элементы, такие как проверка существования переменной, числа (числа, буквы и т. Д.).

83
задан Keith Pinson 29 June 2012 в 20:50
поделиться

4 ответа

Никогда пароли твердого кода в Ваш код. Это было недавно поднято в Лучшие 25 Самых Опасных Ошибок Программирования :

Жесткое кодирование секретная учетная запись и пароль в Ваше программное обеспечение чрезвычайно удобны - для квалифицированного, перепроектирует. Если пароль является тем же через все Ваше программное обеспечение, то каждый клиент становится уязвимым, когда тот пароль неизбежно становится известным. И потому что это трудно кодируется, это - огромная боль для фиксации.

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

Для получения дополнительной информации об этой частой ошибке, можно читать статья CWE-259. Статья содержит более полное определение, примеры и большую другую информацию о проблеме.

В Java, одном из самых легких способов сделать это должно использовать Предпочтительный класс. Это разработано для хранения всех видов настроек программы, некоторые из которых могли включать имя пользователя и пароль.

import java.util.prefs.Preferences;

public class DemoApplication {
  Preferences preferences = 
      Preferences.userNodeForPackage(DemoApplication.class);

  public void setCredentials(String username, String password) {
    preferences.put("db_username", username);
    preferences.put("db_password", password);
  }

  public String getUsername() {
    return preferences.get("db_username", null);
  }

  public String getPassword() {
    return preferences.get("db_password", null);
  }

  // your code here
}

В вышеупомянутом коде, Вы могли звонить setCredentials метод после показа диалогового окна, просящего имя пользователя и пароль. Когда необходимо соединиться с базой данных, можно просто использовать getUsername и getPassword методы для получения сохраненных значений. Данные для входа в систему не будут трудно кодированы в Ваши двоичные файлы, таким образом, декомпиляция не изложит угрозу безопасности.

Важное Примечание: предпочтительные файлы являются просто текстовыми XML-файлами. Удостоверьтесь, что Вы делаете соответствующие шаги, чтобы препятствовать тому, чтобы неавторизованные пользователи просмотрели необработанные файлы (полномочия UNIX, полномочия Windows, и так далее). В Linux, по крайней мере, это не проблема, потому что вызов Preferences.userNodeForPackage создаст XML-файл в корневом каталоге текущего пользователя, который нечитаем другими пользователями так или иначе. В Windows ситуация могла бы отличаться.

Более важные Примечания: было большое обсуждение в комментариях этого ответа и других о том, что корректная архитектура для этой ситуации. Исходный вопрос действительно не упоминает контекст, в котором используется приложение, таким образом, я буду говорить об этих двух ситуациях, я могу думать. Первое имеет место, в котором человек, использующий программу уже, знает (и разрешен знать), учетные данные базы данных. Второе имеет место, в котором Вы, разработчик, пытаетесь держать учетные данные базы данных в секрете от человека, использующего программу.

Первый Случай: Пользователь разрешен знать данные для входа в систему базы данных

В этом случае, решение, которое я упомянул выше, будет работать. Класс Java Preference будет, сохранил имя пользователя и пароль в простом тексте, но предпочтительный файл только будет читаем авторизованным пользователем. Пользователь может просто открыть предпочтительный XML-файл и считать данные для входа в систему, но это не угроза безопасности, потому что пользователь знал учетные данные для начала.

1137-секундный Случай: Попытка скрыть данные для входа в систему от пользователя

Это - более сложный случай: пользователь не должен знать данные для входа в систему, но все еще нуждается в доступе к базе данных. В этом случае у пользователя, запускающего приложение, есть прямой доступ к базе данных, что означает потребности программы знать данные для входа в систему загодя. Решение, которое я упомянул выше, не подходит для этого случая. Можно сохранить данные для входа в систему базы данных в предпочтительном файле, но он, пользователь будет в состоянии считать тот файл, так как они будут владельцем. На самом деле нет действительно никакого хорошего способа использовать этот случай безопасным способом.

Корректный Случай: Используя многоуровневую архитектуру

корректный способ сделать это состоит в том, чтобы иметь средний слой, промежуточный Ваш сервер базы данных и Ваше клиентское приложение, которое аутентифицирует отдельных пользователей и позволяет ограниченному набору операций быть выполненным. У каждого пользователя были бы их собственные данные для входа в систему, но не для сервера базы данных. Учетные данные предоставили бы доступ к среднему слою (уровень бизнес-логики) и будут отличаться для каждого пользователя.

у Каждого пользователя были бы их собственное имя пользователя и пароль, который мог быть сохранен локально в предпочтительном файле без любой угрозы безопасности. Это называют трехуровневая архитектура (уровни, являющиеся Вашим сервером базы данных, сервером бизнес-логики и клиентским приложением). Это более сложно, но это действительно - самый безопасный способ сделать этот вид вещи.

основной порядок операций:

  1. Клиент аутентифицирует с уровнем бизнес-логики с помощью персонального имени пользователя/пароля пользователя. Имя пользователя и пароль известны пользователю и не связаны с данными для входа в систему базы данных всегда.
  2. , Если аутентификация успешно выполняется, клиент выполняет запрос к уровню бизнес-логики, запрашивающему некоторую информацию от базы данных. Например, материально-технические ресурсы продуктов. Обратите внимание, что запрос клиента не является SQL-запросом; это - вызов удаленной процедуры такой как getInventoryList.
  3. уровень бизнес-логики соединяется с базой данных и получает запрошенную информацию. Уровень бизнес-логики отвечает за формирование безопасного SQL-запроса на основе запроса пользователя. Любые параметры к SQL-запросу должны быть санированы для предотвращения атак с использованием кода на SQL.
  4. уровень бизнес-логики передает список материально-технических ресурсов обратно клиентскому приложению.
  5. дисплеи клиента список материально-технических ресурсов пользователю.

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

118
ответ дан Grmpfhmbl 24 November 2019 в 08:53
поделиться

Поместите пароль в файл, который считает приложение. НИКОГДА не встраивайте пароли в исходный файл. Период.

Ruby имеет малоизвестный модуль, названный DBI:: DBRC для такого использования. Я не сомневаюсь, что Java имеет эквивалент. Так или иначе не трудно записать то.

15
ответ дан Aaron Digulla 24 November 2019 в 08:53
поделиться

Вы пишете веб-приложение? Если так, используйте JNDI для конфигурирования его внешне к приложению. Обзор доступен здесь :

JNDI обеспечивает универсальный путь к приложению, чтобы найти и получить доступ к удаленным сервисам по сети. Удаленный сервис может быть любым сервисом предприятия, включая службу обмена сообщениями или специализированный сервис, но, конечно, приложение JDBC интересуется главным образом сервисом базы данных. Как только объект DataSource создается и регистрируется в службе определения имен JNDI, приложение может использовать API JNDI для доступа к тому объекту DataSource, который может тогда использоваться для соединения с источником данных, который это представляет.

3
ответ дан Tim Howland 24 November 2019 в 08:53
поделиться

MD5 является хеш-алгоритмом, не, алгоритм шифрования, в коротком u наклоне возвращают wat u хешированный, можно только выдержать сравнение. Это должно идеально использоваться, храня информацию аутентификации пользователя и не имя пользователя дб и пароль. имя пользователя дб и pwd должны быть зашифрованы и сохранены в файле конфигурации, чтобы сделать наименьшее.

0
ответ дан renegadeMind 24 November 2019 в 08:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: