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ą:
1 | SenderEmail = ConfigurationManager.AppSettings["email.SenderEmail"]; |
… gdzie email.SenderEmail to nazwa pola w tym XMLu.
1 2 3 |
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.
1 2 3 | <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:
1 2 3 4 | <?xml version="1.0" encoding="utf-8" ?> <appSettings> </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.
1 | path/to/file/Services.config |
Proste i skuteczne, o czym się już przekonałem.
Tagi: asp.net • Daj Się Poznać 2017 • github • MVC • wrażliwe dane
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 ;)
Dobre rozwiązanie. Nie pomyślał bym o takim. Dzięki :-)
U mnie to samo co u Comandera: #tylkoENV ;)
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 ;)
:)