Każda większa aplikacja będzie w końcu musiała mieć wbudowane wrażliwe dane w swój kod. Jak podejść do tematu, zachowując się odpowiedzialnie? Tego dowiesz się w dzisiejszym wpisie, napisanym pod wpływem chwili, kiedy sam się nad tym zastanawiałem. W moim przypadku były to dane dostępowe do serwera SMTP, które musiałem gdzieś umieścić, podczas budowania serwisu do obsługi poczty email. Zapraszam do lektury.
TL;DR
Wrażliwe dane trzymaj w osobnym pliku, który będziesz mógł w prosty sposób wykluczyć w .gitignore. Poniżej informacja, jak zrobić to w ASP.NET MVC.
Słowem wstępu
Zapytasz, o co chodzi? Co za problem wpisać dane w kodzie? W zasadzie żaden, ale… nie w życiu tak nie rób!
Przez pomyłkę prawie puściłem pulla na GitHuba z danymi serwera SMTP, które „na szybko” wpisałem w metodzie odpowiedzialnej za wysyłkę email, a przecież w Internecie nic nie ginie. Jak więc podejść do tematu, żeby nie informować o haśle do konta innych użytkowników, którzy obserwują, czy przeszukują repozytoria?
Dużo pytań, z których formułuje się jedno, zawarte w tytule.
Jak przechowywać wrażliwe dane i nie wrzucać ich na GitHub?
Jest na to prosty sposób, przynajmniej jeśli chodzi o aplikację pisaną w ASP.NET MVC. Można wykorzystać plik Web.config.
Jeśli otworzysz sobie plik Web.config, ujrzysz dość sporego XMLa konfigurującego Twoją aplikację. Do zawartości tagów <appSettings> można dostać się z poziomu kodu za pomocą:
SenderEmail = ConfigurationManager.AppSettings["email.SenderEmail"];
… gdzie email.SenderEmail to nazwa pola w tym XMLu.
<appSettings> <add key="email.SenderEmail" value="invite@todo.team" /> </appSettings>
Ale, ale… przecież Web.config jest najczęściej trzymany w repozytorium. To nadal umieszczanie w nim wrażliwych danych. Pójdźmy więc dalej.
<appSettings file="Services.config"> <add key="webpages:Version" value="3.0.0.0" /> </appSettings>
Wystarczy, że w tagu otwierającym, w atrybucie file umieścisz ścieżkę do nowego pliku. W moim przypadku nazwałem go sobie Services.config. Pełny kod dodatkowego pliku dla jednego klucza jest następujący:
<?xml version="1.0" encoding="utf-8" ?> <appSettings> <add key="email.SenderEmail" value="invite@todo.team" /> </appSettings>
Oczywiście nic nie stoi na przeszkodzie, żeby go rozbudowywać wedle potrzeb.
Fajnie, wrażliwe dane są w osobnym pliku, co z tego? No tu już sprawa jest chyba oczywista. Co robi programista, żeby nie wysyłać pliku do repozytorium? Deklaruje go w .gitignore.
path/to/file/Services.config
Proste i skuteczne, o czym się już przekonałem.
Comandeer
20 kwietnia 2017 20:24
Ostatnio zaczyna mnie przekonywać całkowicie inne podejście: trzymanie tego typu danych w zmiennych środowiskowych. W PHP jest do tego fajna biblioteka: https://github.com/vlucas/phpdotenv ale myślę, że ASP .NET gorsze nie jest i też ma coś takiego ;)
Michał Chęciński
21 kwietnia 2017 08:20
Dobre rozwiązanie. Nie pomyślał bym o takim. Dzięki :-)
nrm
23 kwietnia 2017 23:18
U mnie to samo co u Comandera: #tylkoENV ;)
buli
24 kwietnia 2017 16:21
Zaskoczyło mnie że ten atrybut „file” jest obsługiwany od czasów .NET Framework 1.1. Nie spotkałem się, a wygląda na fajne rozwiązanie w niektórych scenariuszach :)
Podejście ze zmiennymi środowiskowymi wydaje się mieć jedną dodatkową zaletę nad trzymaniem tego w systemie plików. Można np. podpiąć kod trzymany na publicznym repozytorium (GitHub) do usługi hostingu (np. na Azure) i włączyć continuous deployment po każdym commicie. Kod leci wtedy z publicznego źródła, hasła ze zmiennych środowiskowych i wszystko od razu działa ;)
Radosław
26 kwietnia 2017 09:22
:)