Comments 11
Спасибо, а почему в последнем примере кода после равно ничего нет?
Как мне кажется, это не интуитивно выглядит и нужен коментарий, что это магия спринга. А то как-то как будто ты ничего не приравнял к свойству
В этом и заключалась неожиданность поведения для меня, достаточно обьявить переменную окружения с тем же именем, что и свойство. Далее, благодаря SystemEnvironmentPropertySource, Spring поищет значения свойств в переменных окружения перебирая различные варианты с ./_/- и регистрами. Если будет найдено значение, то им будет проинизиализированно свойство.
При этом, если в свойстве будет фигурировать несколько переменных окружения, то значение свойства всё равно будет из-за приоритета подстановок перетёрто значением в переменной с совпадающей с именем.
Знаете, неважно как там деды и прочее, а вот привычка все что нужно проинициализировать - прописать это явно, это хорошая привычка.
В этом плане "магия" оно хорошо конечно, но лучше явно задавать что куда и зачем. Иначе когда магия вдруг кончится (новая версия, проблемы с локалью, фаза луны) искать причину её перебоев тот еще геморрой.
Яростно поддерживаю
Не спорю, возможность есть и такая и такая, видимо решать нам самим как делать.
Показал какая может быть проблема из-за такого поведения, когда из-за совпадения имён происходит перетирание значения, при этом всё работает, но не так как задуманно было.
В этом плане "магия" оно хорошо конечно, но лучше явно задавать что куда и зачем.
Грань тонкая. С одной стороны, да, чем магии меньше, тем лучше. С другой стороны, если вы взяли какой-то инструмент с магией (а Spring именно такой), то неплохого бы знать его возможности. И тогда это перестает быть магией. А то так можно прийти к тому, что и DI окажется магией и лучше нам все делать явно.
Интересная мысль пришла в голову при просмотре вот про этого участка:
?someProperty=${PROPERTY}
Здесь мы передаём в ссылку переменную окружения, содержимое которой, насколько я понимаю, никак не фильтруется. Можно ли в сделать SQL-инъекцию через подобную переменную окружения, используя, например, validation query?
Могу предположить, что поскольку это конфигурация свойств драйвера, то обработка будет выполнена на программном уровне и иньекция не сработает.
Нужно будет попробовать. Написать что-то вроде
spring:
datasource:
hikari:
connection-test-query: ${VALIDATION_QUERY:"select 1 from dual"}
Покуда переменная окружения не задана, то всё хорошо. Однако, ничто не мешает мне задать её и прописать что-то вроде
export VALIDATION_QUERY='select 1 from dual; drop database my_prod_db"
Тогда при следующем перезапуске приложения оно грохнет базу.
спасибо за статью
А как вы определяете свойства переменными окружения в Spring Boot приложениях?