Helyi? Biztonságos?

A nagyobb osztálykönyvtárak hátránya, hogy nincs élő ember, aki elejétől a végéig képes lenne átlátni. Ezért aztán születnek olyan kódrészletek, melyek lényegesen egyszerűbben is megírhatóak lennének.

Az egyik gyakori eset annak lekérdezése, hogy SSL-en keresztül nézik-e az oldalt. A brute force megoldás valami ilyesmi:

    if( this.Request.Url.ToString().StartsWith( "https" ) )...

Badarság a System.Uri-t Stringgé alakítani, mikor az helyből szét tudja szedni az URL-t, tehát akár ezt is írhatjuk:

    if( this.Request.Url.Scheme == Uri.UriSchemeHttps )...

A legegyszerűbb azonban talán mégis ez:

    if( this.Request.IsSecureConnection )...

Meg lehet nézni Reflectorban, a FormsAuthentication osztály SetAuthCookie metódusa is ezt használja:

    if( !current.Request.IsSecureConnection && RequireSSL )
    {
        throw new HttpException( SR.GetString( "Connection_not_secure_creating_secure_cookie" ) );
    }

 

Amennyiben csak a HTTPS a kérdés, még alig van különbség a fenti sztring buheráláshoz szükséges karakterek száma és a legolvashatóbb megoldás karakterszáma között. Ámde a helyzet sokkal zűrösebb, ha azt kell vizsgálnunk, hogy helyi kapcsolaton keresztül nézik az oldalt, vagy távolról. A balga módszer nekiesni az URL-nek és megkeresni benne a localhostot. Ez még String.IndexOf hívással is szörnyű, de láttam már olyat, aki biztosra akart menni és ezért előbb a ":" mentén, aztán a "/" mentén felsplittelte az URL sztringet, majd a keletkező tömbök közül a megfelelőre nézett sztring egyezést. Téptem a hajam….

A kérdés eldöntéséhez elméletben meg kell vizsgálni, hogy az alábbi esetek közül igaz-e valamelyik:

  • A cél domain localhost.
  • A cél IP cím 127.0.0.1.
  • A cél IP cím a gép valamelyik IP címe.

Mivel a localhost címe 127.0.0.1, ezért ha IP cím alapján nézzük, akkor csak az a kérdés, hogy a kérés a 127.0.0.1-re, vagy a gép valamelyik címére érkezett-e.

Természetesen erre is van rövid megoldás a HttpRequest osztályban:

    if( this.Request.IsLocal )...

Elfogadhatóan rövid, nem? Nézzük meg Reflectorral, hogyan működik:

    public bool IsLocal
    {
        get
        {
            string userHostAddress = this.UserHostAddress;
            if( string.IsNullOrEmpty( userHostAddress ) )
            {
                return false;
            }
            return ( ( ( userHostAddress == "127.0.0.1" ) || 
( userHostAddress == "::1" ) ) ||
( userHostAddress == this.LocalAddress ) ); } }

Ez valóban jól működik az összes fenti esetre, de persze csak akkor, ha az ember sejti, hogy van ilyen tulajdonság, amit csak le kell kérdezni. Nincs mese, a legtöbb hasonló probléma esetén úgy kell hozzáállni a .NET Frameworkhöz, hogy van itt x ezer darab osztály, jó sokan írták és jó sok helyen használják, tutira megoldották már azt, amivel én csak most szembesültem. Ez nálam általában beválik, ha a megoldás nem az MSDN-ből, akkor a Google-ből kiderül.

 

Technorati tags:
Advertisements

One thought on “Helyi? Biztonságos?

  1. István

    Azt hiszem, fontos dolgokra tapintottál rá… A legtöbb problémába, amelyet meg akarunk oldani, valaki már biztosan belebotlott. Ha már kettőnél többen is, akkor, lehet, hogy a .NET keretrendszerben is va rá kész megoldás 🙂 A keretrendszer forráskódja az egyik legjobb kiindulás az ilyen és ehhez hasonló kérdések megválaszolására…
     

Vélemény, hozzászólás?

Adatok megadása vagy bejelentkezés valamelyik ikonnal:

WordPress.com Logo

Hozzászólhat a WordPress.com felhasználói fiók használatával. Kilépés / Módosítás )

Twitter kép

Hozzászólhat a Twitter felhasználói fiók használatával. Kilépés / Módosítás )

Facebook kép

Hozzászólhat a Facebook felhasználói fiók használatával. Kilépés / Módosítás )

Google+ kép

Hozzászólhat a Google+ felhasználói fiók használatával. Kilépés / Módosítás )

Kapcsolódás: %s