ASP.NET

Jak przechowywać wrażliwe dane i nie wrzucać ich na GitHub? Na przykładzie ASP.NET MVC

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.

Tagi:asp.netDaj Się Poznać 2017githubMVCwrażliwe dane

komentarzy 5

  • Awatar
    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 ;)

    Odpowiedz
  • Awatar
    Michał Chęciński

    21 kwietnia 2017 08:20

    Dobre rozwiązanie. Nie pomyślał bym o takim. Dzięki :-)

    Odpowiedz
  • Awatar
    nrm

    23 kwietnia 2017 23:18

    U mnie to samo co u Comandera: #tylkoENV ;)

    Odpowiedz
  • Awatar
    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 ;)

    Odpowiedz
  • Awatar
    Radosław

    26 kwietnia 2017 09:22

    :)

    Odpowiedz

Zostaw odpowiedź