Добрый день, во время изучения СУБД MySQL пришел к вопросу: любой человек может открыть код проекта (я использую запуск приложения через .jar файл) и просмотреть какой логин и пароль я указал. Как "спастись" от этого?
MrH1tech
32 уровень
Взлом базы данных
Комментарии (26)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Rock133 Java Intern
6 августа 2021, 19:42
Как вариант сделать отдельное меню подключения с вводом адреса бд, логина и пароля, избежав тем самым внесения этих данных в код.
0
ram0973
5 августа 2021, 07:24
Вариант 1:
в resources создаешь 2 файла: application.properties.example и application.properties
application.properties добавляешь в .gitignore в корневой папке проекта
Читаешь
https://github.com/cdimascio/dotenv-java
И использовать .env тоже в .gitignore и также сделать пример .env.example
Лучше всего делать просто импорт переменных среды, это типа хорошая практика Это лучший вариант.
Передавать переменные окружения можно так (либо через докер/куб/GitHub Actions и так далее, если они используются)
Но команда останется в истории команд (надо написать внешний скрипт для запуска)
$ history
Вариант3: java -D<name>=<value>
недостаток тот же
Вариант4 (плохой): использовать args
Обычно ещё в таких темах упоминают это
Вариант 2:
+4
MrH1tech
6 августа 2021, 19:05
Очень крутой ответ! Всё понятно объяснили, спасибо!
0
hidden #2460969
7 августа 2021, 08:00
первые 2 варианта... у него JAR файл, поэтому вся программа попадёт на пк клиента. а там же и проперти придётся отдать, а в них все настройки.
всё что перечислено, это больше для серверной части. а на серверной части разницы нет, он всё равно изолирован от клиентов.
0
ram0973
7 августа 2021, 09:08
да, получается 1 вариант+шифрование?
0
hidden #2460969
7 августа 2021, 09:16
jar можно декомпилить) и понятен будет алгоритм.
правильный вариант один, разделить серверную часть и клиентскую. в серверной работать с бд, а между клиентской и серверной просто передавать шифрованный трафик
+6
Justinian Judge в Mega City One Master
4 августа 2021, 07:58
Когда люди изучают БД, то креденшенлы пихают в проект. Но учебный проект это котики и собачки.
Разница между учебными проектами и реальными, где-то такая же, как между сидением на табуретке на кухне и держанием в руках бублика, представляя себе водителем и непосредственным вождением 40 тонника в сильний ливень на горной дороге и ночью
Поэтому лично мне, непонятен контекст
Для учебы, то что ты описываешь нормально, на нормальной работе тебя никто не подпустит самому настраивать базу данных, это вопросы инфраструктуры и вотчина других специалистов + программистов поопытнее, поработаешь, увидишь как что делается, разберешься в этом, тогда сведется как и что должно быть сделано. Это путь по которому идет большинство, азы во время учебы - остальное и практические моменты во время работы.
Ведь джавист идет стажером/джуном на работу, да хоть и мидлом сразу, и все-равно потом еще минимум полгода доучивается как раз вот таким моментам, которые как правило дома не воссоздашь, да и не зачем
То есть тебе вообще про это не нужно думать, только зафиксировать, что на рабочих проектах все по другому. База данных и данные это самое ценное, что есть в програмном продукте как правило. И вопросы безопасности на первом месте.
Но возможно (ты контекст не предоставил, остается только гадать), у тебя есть ситуция, что по каким-то причинам, ты идешь не стандартным путем джава программиста, а хочешь создавать какие-то продукты НЕ имея опыта работы, не доучиваясь на работе (это как ординатура/интернатура у врачей), а сразу писать коммерческие продукты для небольших фирмочек или частные заказы.
Это наверное единственный кейс, при котором твой вопрос "как спастись" валиден, но этот кейс валиден для < 0.1% джавистов.
Ну тогда тебе набросали идей, креденшлы с кода убираются, БД настраиваешь и "прячешь", авторизация.
Если кто-то пустит разработчика без опыта работы к себе на реальный проект, они должны отдавать отчет в последствиях, они свои приоритеты выставили -экономия выше безопасности
+5
Сергеев ВикторMaster
3 августа 2021, 19:47
обычно такие данные выносятся за пределы приложения.
Это может быть конфигурационный файл, либо переменные окружения
Ну и корректным распрделение прав для той учетной записи которая используется в приложении, например не давать доступ к ненудным таблицам ил давать ограниченные права
+3
MrH1tech
3 августа 2021, 20:08
Можете посоветовать статьи/ролики на эту тему?
(Приложение пишу на JavaFX, БД MySQL)
0
Сергеев ВикторMaster
4 августа 2021, 12:46
https://docs.oracle.com/javase/tutorial/essential/environment/env.html#:~:text=Like%20properties%20in%20the%20Java,also%20between%20command%20line%20interpreters.
https://docs.spring.io/spring-boot/docs/1.5.6.RELEASE/reference/html/boot-features-external-config.html
+1
hidden #2460969
3 августа 2021, 19:05
ты используешь отдельно стороннюю БД + твой jar приложение?
0
MrH1tech
3 августа 2021, 19:47
Да, у пользователя на его компьютере есть .jar файл (само приложение) в котором я подключаюсь к базе данных MySQL. А следовательно в коде указан логин и пароль к самой базе данных
0
hidden #2460969
3 августа 2021, 19:49
а зачем такая архитектура? у тебя много пользователей для работы с одной БД?
0
MrH1tech
3 августа 2021, 20:07
Не очень понял вашего комментария.
В БД у меня хранятся значения для общих полей (например, ссылка на изображение логотипа). Сделано для того, чтобы изменить какие-то поля, не выпуская новую версию приложения.
0
hidden #2460969
3 августа 2021, 20:08
тогда о чем ты переживаешь, если у тебя в БД ничего ценного нет.
0
MrH1tech
3 августа 2021, 20:13
Так-то да. Но в будущих приложениях может получится, что будут важные поля (допустим, пользовательская информация (логин и пароль пользователя)) и будет не очень хорошо, если кто-то получит эту информацию.
P.S. Спрашиваю просто для расширения своих знаний
0
hidden #2460969
3 августа 2021, 20:19
так забудь про JavaFX и используй rest + Spring security для ролей и безопасности.
ты со своим JavaFX не учитываешь что твои пакеты можно и с помощью WireShark перехватить и всю инфу выцепить))
либо уж если хочешь JavaFX, то надо всё равно надо использовать промежуточное приложение, внутри которого уже будет работа с БД. а между этими приложениями можешь как-то пытаться шифровать трафик или же ещё что....
+3
MrH1tech
3 августа 2021, 20:24
Понял, спасибо за совет!
0
hidden #2460969
3 августа 2021, 20:29
а ещё дорабатывать JavFX сложно (ибо у каждого пользователя свой клиент, где надо проверять на наличие новых версий и тд)
гораздо проще использовать Spring REST + фронт на каком нибудь Таймелиф или же Angular+Webix и всё в одном месте. всё закрыто и удобно. можно работать как с телефона, так и с компа))
+3
wan-derer.ru
3 августа 2021, 18:54
При запуске приложения запросить имя/пароль у пользователя.
0
MrH1tech
3 августа 2021, 18:54
Я имел в виду логин и пароль от базы данных
0
wan-derer.ru
3 августа 2021, 18:54
И я.
0
Евгений Backend Developer в KHAN Group Expert
3 августа 2021, 18:56
Ну вообще по умолчанию всё, что находится у клиента - скомпрометировано. Надо относится к этому так. И уже от этого отталкиваться.
+4
MrH1tech
3 августа 2021, 18:58
А что именно делать? Просто забить или предпринять какие-то действия?
0
wan-derer.ru
3 августа 2021, 19:04
https://yandex.ru/search/?text=%D1%88%D0%B8%D1%84%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5+jar
0
MrH1tech
3 августа 2021, 19:21
Понял, спасибо!
0