Pokazywanie postów oznaczonych etykietą bezpieczeństwo. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą bezpieczeństwo. Pokaż wszystkie posty

sobota, 14 grudnia 2024

Dockle - narzędzie do skanowania już zbudowanych obrazów Docker

 W poprzednim poście opisałem narzędzie do skanowania obrazów dockera Trivy link. W tym wpisie wspomnę o narzędziu, które służy do skanowania kwestii bezpieczeństwa już zbudowanych narzędzi, które w dodatku posiada dosyć dobrą możliwość wpięcia w proces CI/CD czyli Dockle.

Szerzej opisane co to narzędzie robi jest na blogpoście a na portalu Medium - link



Linki:

https://github.com/goodwithtech/dockle - kod źródłowy na github

https://containers.goodwith.tech/ - strona projektu

https://shrihariharidas73.medium.com/dockle-container-image-linter-for-security-helping-build-the-best-practice-docker-image-easy-b4853fb3675e - blogpost z opisem czym jest dockle

Trivy - narzędzie do skanowania podatności obrazów Docker

Budując lub wykorzystując obraz Dockerowy warto mieć świadomość że ten obraz często i gęsto posiada własne zależności, np. różnego rodzaju oprogramowanie zainstalowane przez Twórców obrazu dockerowego. Każde z tych narzędzi czy bibliotek może posiadać swoje podatności bezpieczeństwa. Jeżeli zbudujemy obraz, np. bazując na Node.js, który z kolei bazuje m.in. "buildpack-deps:stretch" to musimy mieć świadomość, że jeśli paczka "buildpack-deps:stretch" będzie posiadała jakąś podatność bezpieczeństwa to nasz obraz również będzie ją posiadał. W tym celu warto skanować obrazy dockerowe pod kątem podatności bezpieczeństwa. Przykładowe narzędzie: Trivy.


Linki:

https://trivy.dev/latest/ - strona projektu

https://github.com/aquasecurity/trivy - kod źródłowy na githubie

https://wkontenerach.pl/zarobili-36000-usd-z-kopania-kryptowalut-przez-podatne-obrazy-dockerowe-na-docker-hub/ - blogpost z uzasadnieniem dlaczego warto skanować swoje kontenery pod kątem podatności bezpieczeństwa.

wtorek, 5 listopada 2024

onetimesecret.com

Czasami zdarza nam się prośba o wysłanie do kogoś jakiegoś hasła albo dyskretnej wiadomości, która po przeczytaniu powinna zostać usunięta. Czasami stosuje się do tego Teams, gdzie po przeczytaniu wiadomość jest usuwana z chatu. A co jeśli chcemy wysłać dyskretną wiadomość do kogoś, kto nie ma Teamsów? Tutaj z pomocą przychodzi strona onetimesecret.com , gdzie możemy wpisać naszą wiadomość, którą odbiorca za pomocą specjalnie wygenerowanego linku będzie mógł wyświetlić tylko raz. Wygenerowany przez nas link będzie mógł zostać odczytany tylko raz, co (przynajmniej w teorii) powoduje że nawet jeśli ktoś w przyszłości wykradnie skrzynkę pocztową naszą lub adresata naszej wiadomości to (przynajmniej w teorii) nie powinien poznać hasła przez nas przekazanego.

Strona może nie jest idealna, ale zawsze to kolejny kamyczek do ogródka zwanego bezpieczeństwem. 

piątek, 18 lutego 2022

OWASP ZAP

Yesterday I was at a local .net group meeting. One of the presentations was about automatic tools for improving code quality. The first of the presented tools was the SonarQube that is a tool for static code analize that I know and use. The second presented tool for dynamic UI testing in terms of security was OWASP ZAP. It is a "proxy" tool, i.e. it is used to place it between the browser and the visited page, which can view or modify information sent from / to the browser. If anyone has used Fiddler, know what a "browser proxy" is (same type of tool but improved).

OWASP ZAP in the default mode is used to make the user use the page in "normal" mode, and the tool underneath checks for any security vulnerabilities. If someone uses Selenium for automatic tests, then by connecting OWASP ZAP gets additional safety tests.

It is also possible to run OWASP ZAP from the script level, which makes it possible to insert it into the CI / CD tool or to generate a weekly report. It is recommended to test on a different instance than production / test because full tests can take a long time and generate server load.

Tool is Open Source and supported by Community.

Summary:

We have 3 main modes: 

  • the user clicks on the page himself (useful when we have an automatic tester using Selenium) 
  • basic scanning mode (useful to plug into a CI / CD tool and test automatically, e.g. with a larger deploy)
  • full scan mode (takes a long time, so it should be done on a separate server in a night task mode).

Linki:

czwartek, 2 kwietnia 2015

AML - Listy Sankcyjne

AML (Anti-Money Laundering), zwane potocznie przeciwdziałaniem praniu brudnych pieniędzy, ale... również i wspieraniu terroryzmu, są to działania, mające na celu wykrycie i odpowiednie zaraportowanie podejrzanych transakcji, a nast. ich zablokowanie, włącznie z zamrożeniem konta osob podejrzanych.

Wymogi stosowania AML w spółkach finansowych nakładają stosowne organy, takie jak np. KNF, Komisja Europejska czy Departament Skarbu USA.

Te podmioty, publikują m.in. listy os. podejrzanych. Na takich listach znajduja się znani dyktatorzy, organizacje terrorystyczne, ale ost., po aneksji Krymu również przedstawiciele Rosjiego parlamentu zaangażowani w wojnę na Ukrainie.

Te listy, zwane listami sankcyjnymi, publikowane są w różnych formatach, np. XML. W związku z powyższym, zrobiłem jednolity parser kilku list do postaci obiektowej, przy okazji udostępniając część kodów źródłowych na githubie, aby ułatwić innym walkę z terroryzmem.

Listy sankcyjne, które zostały ograne w aplikacji to:
  • Consolidated list of persons, groups and entities subject to EU financial sanctions
  • Specially Designated Nationals List (SDN)
  • Foreign Sanctions Evaders (FSE)
  • Palestinian Legislative Council (PLC) List 

Projekt postanowiłem umieścić na githubie, zarówno pod moim profilem (link), jak i pod egidą .Net Developers Poland. Jeżeli ktoś ma ochotę do rozwijania tego projektu, to zdecydowanie zapraszam.

Linki:

niedziela, 1 lutego 2015

Weekend z kryptografią (PGP, CryptoCat, encrypted mail storage)

Po zmianie systemów operacyjnych na komputerze prywatnym oraz na smartfonie przyszedł czas na ochronę prywatności w przypadku wysyłania/obierania wiadomości. W ten weekend pod ostrzał poszła komunikacja za pomocą maili oraz próba zabezpieczenia komunikatora, z którego korzystam najczęściej (chat na facebooku).

Najpierw mail. O ile samemu nie posiadamy możliwości postawienia własnego serwera pocztowego, to warto zajrzeć na tą listę hostingów i wybrać coś dla siebie, wg. własnych potrzeb. Celowo nie będę doradzał konkretnego hostingu, ponieważ każdy z nas jest inny i ma nieco inne potrzeby.

Kolejnym etapem, po założeniu skrzynki mailowej, jest zgranie klienta pocztowego thunderbird oraz dogranie do niego rozszerzenia enigmail. Gdy mamy już skrzynkę pocztową, na której maile będą trzymane w sposób zaszyfrowany, klienta mailowego (maili nie czytamy w przeglądarce), oraz zgrany odpowiednie rozszerzenie do obsługi podpisywania/szyfrowania, to pozostało nam jeszcze tylko wygenerować swoją parę kluczy PGP (jak to zrobić opisane jest tutaj) i skonfigurować nasz klucz z klientem enigmail.
Ja dodatkowo, dla wygody zainstalowałem sobie jeszcze KGpg, ale spokojnie można wszystko zrobić z terminala.

Mamy takie coś i.... wuala ;) Nasze maila są zdecydowanie bardziej bezpieczne niż były wcześniej. Teraz tylko pozostaje nam przekonać jak najwięcej naszych znajomych aby również domyślnie szyfrowali swoje maile za pomocą PGP (oraz zweryfikować ich klucze publiczne z fingerprintem jakimś innym kanałem, np. przez tel.) i "jesteśmy w domu" :D Jeśli NSAGCHQ, albo jacyś inni, domorośli hakerzy chcą czytać nasze maile, to niech się przynajmniej nieco wysilą ;)


Kolejny, popularnym kanałem rozmowy, po za mailami, jest chat. W moim przypadku, jest to chat na portalu facebook, który domyślnie nie jest szyfrowany, ale w sposób stosunkowo prosty, sami możemy mu to szyfrowanie zapewnić. Służy do tego darmowe rozszerzenie do przeglądarki o nazwie crypto.cat. Stosunkowo łatwo się to integruje z listą kontaktów na fb, więc jak obie strony używają cryptocata, to na fb wiadomość jest zaszyfrowana.

Na razie crypto.cat posiada pewną wadę, czyli brak przycisku "scroll down" po liście znajomych (można to zrobić tylko za pomocą myszy, która nie zawsze działa), ale jak opisuje to Ryan Hellyer ta niedogodność powinna zostać poprawiona w najbliższej przyszłości.

edit: przydatny link, dla użytkowników firefoxa -> link

sobota, 17 stycznia 2015

CyanogenMod

Ost. czasy zainteresowałem się nieco bardziej szeroko rozumianym "bezpieczeństwem w internecie". Mówiąc "szeroko rozumianym", mam również na myśli ochronę prywatności, włączając w to również ochronę przed programem PRISM. O ile w dzisiejszych czasach całkowite "zniknięcie" jest niemożliwe, o tyle zawsze można próbować chronić swoją prywatność. Szczególnie, gdy po ost. atakach terrorystycznych na gazetę Charlie Hebdo słyszy się głosy polityków chcących wprowadzić pełną inwigilację (oraz cenzurę) internetu uk-spy-agencies-need-more-powers-says-cameron.

W tym miejscu, należy wspomnieć słynny cytat Benjamina Franklina:
"Ci którzy rezygnują z Wolności w imię bezpieczeństwa, nie zasługują na żadne z nich."
Ale w takim razie jak się bronić?
Z całą pewnością, trzeba mieć świadomość, jakie dane zbierają na nasz temat amerykańskie korporacje. Jednym z najbardziej krytycznych urządzeń, jest tel. komórkowy, z zainstalowanym modułem gps oraz podłączeniem do internetu. Taki tel. posiada głośnik, mikrofon, kamerę, lokalizator gps. Dosłownie wszystko, czego potrzeba, aby śledzić oraz inwigilować daną osobę.

Na pierwszy ogień idzie wiec wymiana systemu operacyjnego. Domyślny system jaki miałem, czyli Android niestety, nie pozwalał mi na pełną kontrolę, np. nie pozwalał mi na usunięcie aplikacji do portalu facebook.com. Nie dało się odinstalować facebooka, to odinstalowałem cały system ;)

Czy instalacja jest trudna? Nie. Uważam, że jest stosunkowo prosta.

Na wiki cyanogenmod'a znaleźć odpowiedni, dla siebie model tel., a nast. wejść w link pod zakładką "Installation", np. Install_CM_for_anzu.

Proces instalowania jest opisany bardzo dobrze. O ile czasami trzeba doinstalować pewne dodatkowe biblioteki (np. adb) lub uruchomić niektóre skrypty jako root (np. sudo fastboot zamiast fastboot) o tyle jedny większy problem miałem dopiero przy punkcie 8, w którym syst. operacyjny na laptopie (Ubuntu) nie wykrywał podłączonego urządzenia, ale wtedy znalazłem inny przydatny link, dzięki któremu udało mi się sprawnie dokończyć proces instalacji.



czwartek, 1 stycznia 2015

KeePassX – przechowuj hasła bezpiecznie (i wieloplatformowo)

W jednym z moich poprzednich wpisów, z maja 2014 zrobiłem notkę nt. programu KeePass. Kto nie zna tego programu, niech się zapozna, ponieważ zwiększa on bezpieczeństwo haseł, jakie mamy na różnych serwisach internetowych.

Dzięki temu programowi, możemy mieć unikalne i bardzo bezpieczne hasła dla każdej z witryn, do których się logujemy. KeyPass sam w sobie jest fajny, ale posiadał pewne ograniczenie -> został napisany w .NET, a co za tym idzie, natywnie działał pod Windowsem lub za pomocą biblioteki Mono na Linuksach.

Teraz przedstawiam kolejną ewolucję tego oprogramowania, czyli KeePassX, który początkowo był portem KeePass na Linuxa, a obecnie został oddzielnym programem.

Linki:
Strona projektu: http://www.keepassx.org/
Adres na githubie: https://github.com/keepassx/keepassx

sobota, 24 maja 2014

KeePass – przechowuj hasła bezpiecznie

Jednym z problemów, z jakimi spotykają się różni użytkownicy komputerów, posiadający dostęp do wielu zasobów (np. aplikacji internetowych, baz danych itp.) jest problem związany z ilością potrzebnych loginów i haseł. W teorii hasło do każdego konta powinno być inne, jednak w praktyce bardzo trudno jest pamiętać 20-50 różnych haseł do różnych kont. Na szczęście, z pomocą przychodzi nam darmowa aplikacja "KeePass", która będzie przechowywała za nas odpowiednie loginy i hasła w sposób bezpieczny (zaszyfrowany). My, jako użytkownicy, jedynie potrzebujemy znać hasło do naszego pliku z zaszyfrowanymi danymi w KeePass (który możemy przenosić między komputerami, np. za pośrednictwem pendrive), a już szczegółowe loginy i hasła do konkretnych stron, aplikacji, usług, baz danych znajdować się będą w KeePass-ie. 

Linki: 

czwartek, 16 stycznia 2014

Data recovery from damaged HDD

Ost. czasy, całe moje dane prywatne, włączając w to zdjęcia oraz filmy, kręcone podczas różnych okazji przerzuciłem z dysku twardego na dysk zewnętrzny i... pewnego dnia przypadkowo usunąłem z tego dysku pliki startowe. Efekt? Zarówno windows, jak i ubuntu linux nie były w stanie się dobrać do tych danych :(

Ponieważ te dane były dla mnie cenne, postanowiłem spróbować je odzyskać. Po przetestowaniu kilku przeznaczonych do tego celu programów, w końcu trafiłem na cgsecurity test disk

Dzięki temu, konsolowemu programikowi, udało mi się skopiować dane z dysku zewnętrznego, na inny dysk twardy, czyli udało mi się odzyskać dane, na czym mi najbardziej zależało, a że program jest dodatkowo udostępniony za darmo na mocy Licencji GNU to polecam go dalej.

piątek, 18 października 2013

Rozszyfrowywanie CAPTCHA z pomocą zewnętrznego (płatnego) klienta

CAPTCHA, to rodzaj techniki stosowanej jako zabezpieczenie na stronach www, celem której jest dopuszczenie do przesłania danych tylko wypełnionych przez człowieka link do wikipedii.

Najczęściej jest to rysunek, który wymaga od użytkownika własnoręcznego wpisania, tworzony w taki sposób, aby rozwiązanie tego sposobem mechanicznym było maksymalnie skomplikowane. Same algorytmy rozwiązywania captcha są skomplikowane i bazują na algorytmach szyfrowania i deszyfrowania. Na szczęście, nie musimy się znać na wszystkim i można te zadanie zlecić komuś innemu, kto się na tym zna dużo lepiej niż my. Przykładem firmy, która się specjalizuje w rozwiązywania zabezpieczeń typu CAPTCHA jest deathbycaptcha.

Najnowsza wersja (4.2) posiada bibliotekę przygotowaną dla języków:
-.NET (C#, Visual Basic)
- AutoIt3
- iMacros
- C (client and libs' source code)
- Java
- Perl 5+
- PHP v5+
- Python v2.5+ and v3.0+
- Command-line tool for Windows, Linux (i386 and x86-64) (see usage note below)
- Plugin for MyAdTools bots

oraz klienta firm 3 (nie wspierane przez producenta)
- Ruby

Producent udostępnia przykład wykorzystania API w językach:
- PHP
- C#

Osobiście wybrałem przykład działający w C# i działa tak, jak należy, tzn. do projektu dodajemy bibliotekę .dll, w wykonywanym pliku .cs dokładamy nową przestrzeń nazw, za pomocą której tworzymy obiekt. Na obiekcie wywołujemy przeciążoną metodę .Decode (captcha możemy podać, np. jako tablicę bajtów) i... to wszystko :)
Dodatkowo mamy metodę GetBalance(), która sprawdza bilans naszego konta (czyli w razie potrzeby możemy napisać automat przypominający nam o tym, że kończą się pieniądze przeznaczone na rozwiązywanie captcha).


Ile to kosztuje?
1k Captcha - 1.390 dolara, co przy aktualnym kursie dolara daje nam ~ 4.22zł za każde rozwiązane 1k CAPTCHA, czyli nie jest to jakiś nie wiadomo jaki majątek.

poniedziałek, 30 września 2013

Odrobina kryptografi

W przypadku, gdy zaistnieje potrzeba wykorzystania kryptografii, tj. zakodowania pewnych danych w aplikacji (z możliwością ich późniejszego odszyfrowania), powinno się unikać korzystania ze standardowych algorytmów szyfrujących dostępnych w .NET 2.0, ponieważ nie zapewniają one wystarczającego bezpieczeństwa.  W miarę bezpieczny, wydaje się algorytm  AES, jednak jak to w kryptografii bywa, skuteczna użyteczność poszczególnych algorytmów z biegiem czasu maleje.

Link, do działającego algorytmu w C#, można znaleźć na stackoverflow.com

Osobiście miałem okazję z niego korzystać w momencie, gdy jedynym skutecznym sposobem przekazania danych identyfikacyjnych z głównego okna aplikacji do popupa było wysłanie danych za pomocą querystringa (klient zażyczył sobie przeniesienie wszystkich plików typu BLOB z naszej bazy danych, do zewnętrznego syst. plików obsługiwanego przez firmę zewnętrzną z możliwością obsługi załączników do wniosku przez aplikacje trzecie).

Inne przydatne linki:
stackoverflow.com - how-to-start-learn-cryptography-with-c-sharp
http://stackoverflow.com - c-sharp-rsa-encryption-decryption-with-transmission



środa, 25 września 2013

Konfiguracja IIS do hostowania aplikacji wykorzystującej SSL

Zgodnie z zapowiedzią, zaprezentowaną jakiś czas temu tutaj na blogu, po blisko 2 latach postanowiłem porzucić sharepointa i skoncentrować się na programowaniu w .NET. Jednym z zadań, jakie zostało mi postawionych, było stworzenie aplikacji webowej\web service, który jako swój element składowy będzie wykorzystywał inny web service zabezpieczony certyfikatem SSL.

Przystąpiłem więc do pracy. Pierwszą rzeczą, którą zrobiłem, to zainstalowałem certyfikat na komputerze (dwuklik na certyfikacie, a nast. 'next->next->wpisz hasło -> next->itd.').

Następnie stworzyłem aplikację webową, która wykorzystywała ten web service i wyświetlała odpowiednie dane na stronie .aspx. Pocz. visual studio nie chciało się u mnie podłączyć do web service (zapewne kwestia servera proxy w korpo), bo z 'iPlusa' wszystko chodziło tak jak należy.
Sposobem, aby zaczęło mi to działać w sieci korporacyjnej, okazało się włączenie programu Fiddler. Początkowo planowałem go użyć do zdiagnozowania problemu, natomiast... samo jego wykorzystanie rozwiązało mój problem na maszynie developerskiej (zapewne wynika to z faktu, że Fiddler w domyślnych ustawieniach wymusza autentykację).


Ok, aplikacja na maszynie developerskiej to jedno. Jeszcze trzeba to postawić na IIS, aby inni ludzie mieli do tego dostęp. O ile stworzenie puli aplikacji i wgranie tam strony było proste, o tyle sprawienie, aby nasza aplikacja mogą bez problemów wykorzystywać zewnętrzny web service z SSL przysporzyło mi nieco pracy (Error 403).


Rozwiązanie polega na tym, że należy stworzyć własny certyfikat i ustawić w ISS 'powiązania' (ang. 'bindings'). Jak to zrobić można przeczytać tutaj oraz tutaj (2 art. do czytania)


oraz upewnić się w ustawieniach puli aplikacji, że aplikacja będzie uruchamiana z konkretną tożsamością użytkownika (ponieważ ta konkretna aplikacja nie posiadała swojego typu 'logowania', to jest personifikowana jako konto admina w puli aplikacji).



sobota, 27 października 2012

Podniesienie uprawnień sharepoint

Bardzo często podczas pisania programów w technologii sharepoint (np. Visual Web Part) zdarza się konieczność czasowego podniesienia uprawnień użytkownika dla wykonania konkretnej czynności. Przykładem, mogą być uprawnienia do listy. Normalny użytkownik posiada uprawnienia tylko do odczytu elementów listy (elementy listy sharpoint są podobne do rekordów w bazie danych), a co za tym idzie nie posiada uprawnień do tworzenia/modyfikowania elementów listy. Aby taki użytkownik mógł utworzyć/zmodyfikować element na takiej liście za pomocą napisanej przez nas aplikacji (np. mógł utworzyć nową 'fakturę' za pomocą aplikacji, do zarządzania fakturami, opartej na listach sharepoint), trzeba czasowo podnieść jego uprawnienia. Podniesienie uprawnień w kodzie C# w praktyce oznacza pobranie SPSite z podwyższonymi uprawnieniami (tzw. SuperSite).
Przykład:



SPSecurity.RunWithElevatedPrivileges(delegate()
{
    using (SPSite
superSite = new SPSite(SPContext.Current.Site.ID))
    {
        using (SPWeb
superWeb = superSite.OpenWeb(SPContext.Current.Web.ID))
        {
            // Your code here
        }
    }
});
 
Podczas pobierania SuperSite lepiej jest jednak wykorzystać wrapper, w postaci klasy SPSecurityHelper, zademonstrowanej przez Dana Larsona na jego tech-blogu
Klasa SPSecurityHelper:

using Microsoft.SharePoint;


    /// <summary>A class for working with elevated privilege</summary>
    public static class SPSecurityHelper
    {
        /// <summary>Returns an elevated site</summary>
        /// <param name="theSite">
        /// The site that you want an elevated instance of.
        /// You must dispose of this object unless it is part of SPContext.Current.
        /// </param>
        /// <returns>An elevated site context.</returns>
        /// <remarks>Be sure to dispose of objects created from this method.</remarks>
        public static SPSite GetElevatedSite(SPSite theSite)
        {
            var sysToken = GetSystemToken(theSite);
            return new SPSite(theSite.ID, sysToken);
        }

        /// <summary>Gets a UserToken for the system account.</summary>
        /// <param name="site"></param>
        /// <returns>A usertoken for the system account user./returns>
        /// <remarks>Use this token to impersonate the system account</remarks>
        public static SPUserToken GetSystemToken(SPSite site)
        {
            site.
CatchAccessDeniedException = false;
            try
            {
                return site.SystemAccount.UserToken;
            }
            catch (UnauthorizedAccessException)
            {
                SPUserToken sysToken = null;

                // Only use runwithelevated to grab the system user token.
                SPSecurity.RunWithElevatedPrivileges(
                    delegate()
                    {
                        using (SPSite lolcatKiller = new SPSite(site.ID))
                        {
                            sysToken = lolcatKiller.SystemAccount.UserToken;
                        }
                    }
                );
                return sysToken;
            }
        }
    }
 Wykorzystanie klasy SPSecurityHelper:

 using (SPSite superSite = SPSecurityHelper.GetElevatedSite(SPContext.Current.Site))
{
    using (SPWeb superWeb = superSite.OpenWeb(SPContext.Current.Web.ID))
    {
               // Your code here
    }
}

 Sposób wykorzystania jest bardzo prosty, tzn. do klasy SPSecurityHelper przekazujemy obiekt zwykłego SpSite, natomiast z powrotem dostajemy obiekt tego samego SpSite z podwyższonymi uprawnieniami. Dzięki wykorzystaniu klasy SPSecurityHelper kod jest krótszy oraz lepszy jakościowo.

Adres komputera, korzystającego z naszej strony

    Uzyskanie informacji nt. komputera, z którego wykonano jakąś czynność jest bardzo ważne, z punktu widzenia bezpieczeństwa. Informacja ta, jest ważna zarówno w przypadku systemów wewnętrznych (intranet), jak i systemów zewnętrznych (internet).
    W przypadku intranetu, jednym ze szczególnych przypadków jest "usuwanie rekordów z bazy danych" (np. usuwanie faktur w systemie księgowym), gdzie oprócz loginu osoby wykonującej akcję (dost. z systemu), chcemy mieć dla pewności informacje nt. komputera, z którego wykonano akcję.
    W przypadku internetu, chcemy mieć zazwyczaj informacje, nt. komputera, który próbuje się włamać do naszego systemu, lub wykonuje inną nieporządaną akcję (np. atak DDoS).

W jaki sposób uzyskać informację nt. komputera, korzystającego z naszego systemu? Wykorzystamy do tego celu klasy z przestrzeni nazw "System.Web" oraz "System.Net".

using System.Web;
using System.Net;
IPHostEntry hostEntry = Dns.GetHostEntry(HttpContext.Current.Request.ServerVariables["REMOTE_HOST"].ToString());

Praktyczny sposób wykorzystania zmiennej hostEntry prezentuje przykład, wykonany na zwykłej stronie asp.net (web forms):


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web;
using System.Net;
using System.Text;

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        string ComputerName = "";
        IPAddress[] IpAdressList = null;
        StringBuilder sb = new StringBuilder();
        try
        {
            IPHostEntry hostEntry = Dns.GetHostEntry(HttpContext.Current.Request.ServerVariables["REMOTE_HOST"].ToString());
            ComputerName = hostEntry.HostName.ToString();
            IpAdressList = hostEntry.AddressList;
        }
        catch { }
        sb.AppendLine(string.Format("Nazwa komputera {0}", ComputerName));
        if (IpAdressList != null)
        {
            for(int i=0; i < IpAdressList.Length; i++)
            {
                sb.AppendLine(string.Format("Typ adresu IP {0}, adres IP {1}", IpAdressList[i].AddressFamily, IpAdressList[i].ToString()));
            }
        }
        string computerInfo = sb.ToString();
    }
}

   Posiadając informacje nt. komputera, możemy te informacje zapisać do bazy danych, lub do logów. W przypadku aplikacji asp.net preferuję wykorzystania gotowego rozwiązania, jakim jest log4net, natomiast w przypadku Sharepoint 2010 logowanie do natywnych logów sharepointa (jak sie to robi opisze w jednym z przyszłych wpisów).

Edit: Niestety te metody w praktyce nie okazały się na tyle dobre, jak być powinne. Nowe metody:

        public static string GetUser_IP()
        {
            string VisitorsIPAddr = string.Empty;
            if (HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"] != null)
            {
                VisitorsIPAddr = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"].ToString();
            }
            else if (HttpContext.Current.Request.UserHostAddress.Length != 0)
            {
                VisitorsIPAddr = HttpContext.Current.Request.UserHostAddress;
            }
            return VisitorsIPAddr;
        }
        public static string GetUserIP()
        {
            string ipList = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
            if (!string.IsNullOrEmpty(ipList))
            {
                return ipList.Split(',')[0];
            }
\            return HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
        }
Używanie
        string visitorIp = GetUser_IP();
        int intAddress = BitConverter.ToInt32(IPAddress.Parse(visitorIp).GetAddressBytes(), 0);

sobota, 22 września 2012

Obrona przed XTML Injection, XSS (Cross-Site Scripting) poprzez Strip

Jednym z najpoważniejszych zagrożeń związanych z bezpieczeństwem aplikacji internetowych jest HTML Injection, czyli jedna z odmian Code Injection. Problem bezpieczeństwa związany HTML Injection polega głównie na Cross-Site Script, czyli wstrzyknięciu na stronę www kodu HTML zawierającego wykonujące się skrypty (np. w języku 'Javascript'), które mogą służyć m.in. do zmiany ustawień konta, wyciągania wrażliwych danych od użytkownika i innych niepożądanych czynności.
Kod HTML zawierający szkodliwe skrypty można wstrzyknąć np. do textBoxów pobierających od użytkownika dane.

W jaki sposób się przed tym bronić? Jednym ze skutecznych sposobów ochrony przed tego typu nieczystymi zagraniami jest walidacja tekstu wpisywanego przez użytkownika za pomocą wyrażeń regularnych.Metodą, która wykonuje za nas odpowiednią walidację, jest przedstawiona poniżej metoda Strip:

using System.Text.RegularExpressions;

public static string Strip(string text)
{
    return Regex.Replace(text, @"<(.|\n)*?>", string.Empty);
}
 Stosowanie przez nas tej metody, na każdym "stringu" wpisywanym przez użytkownika, przed zapisaniem go do bazy danych, nie będzie miało zauważalnego wpływu na wydajność, za to zdecydowanie podniesie bezpieczeństwo naszej aplikacji.