HyperLink
Bejelentkezés
E-mail: 
Jelszó: 





Skip Navigation Links
 

Web szerver túlterhelés elleni védelme


Példaprogram letöltése

13209 bájt

Könnyedén túlterhelhető a web szerverünk, ha egy-egy web alkalmazásunk igen sok kérést kap rövid idő alatt. Ebben a példában egy olyan megoldást keresünk, mellyel korlátozható az, hogy egy időegység alatt maximum hány kérést szolgál ki az alkalmazásunk, ha ezek a kérések ugyanarról az IP címről érkeznek.

A példában azt fogjuk figyelni, hogy egy IP címről érkezik-e tíz kérés egy perc időtartam alatt.
Ezt úgy valósítjuk meg, hogy minden, az alkalmazásunkhoz érkező kérés esetén eltároljuk az ügyfél IP címét a Cache-ben egy perc időtartamra, vagyis egy perc után az adott bejegyzést a Cache automatikusan törli. Ezek után most már csak meg kell számlálnunk egy kérés kiszolgálása előtt, hogy az adott IP cím szerepel-e már a Cache-ben tíznél többször vagy sem. Ha igen, akkor biztosak lehetünk benne, hogy egy perc alatt ugyanattól az ügyféltől már tíz kérés érkezett, így annak kiszolgálását elutasíthatjuk.
A Page Load eseményénél helyezzük az IP címet a Cache-re és itt ellenőrizzük azt is, hogy kérés kiszolgálható-e vagy sem.
Itt első lépésként meghatározzuk a kliens IP címét.
      string ip = Request.UserHostAddress;
Ezt követően kell egy olyan nevet generálnunk, amilyen névvel még nincs objektum elhelyezve a Cache-ben. Ehhez egy konstans szöveget és egy véletlenszerű számot választunk, majd ellenőrizzük, hogy e névvel létezik-e már objektum a Cache-ben. Ha igen, akkor egy újabb nevet generálunk.
      Random r = new Random();
      do
      {
        s = "OverLoadIPAddress_" + r.Next(int.MaxValue);
      }
      while (Cache.Get(s) != null);
Ha már adott a név, akkor elhelyezhetjük az IP címet a Cache-ben. Ehhez a Cache Add függvényét hívjuk meg. Ebben megadjuk, hogy az aktuális időponthoz képest hatvan másodpercig maradjon meg ez az adat a Cache-en.
      Cache.Add(s, ip, null, DateTime.Now.AddSeconds(60), Cache.NoSlidingExpiration, CacheItemPriority.High, null);
Végül már csak annyi a teendőnk, hogy ellenőrizzük, hogy az adott IP cím kiszolgálása megtörténhet-e, vagy már nem. Ehhez a belső Access nevű függvényünket hívjuk, melynek paraméterként átadjuk a vizsgálandó IP címet. Visszatérési értékként egy logikai értéket kapunk, mely ha igaz, akkor a kérést kiszolgálhatjuk.
      if (Access(ip))
      {
        Label3.ForeColor = Color.Green;
        Label3.Text = "Hozzáférés engedélyezett!";
      }
      else
      {
        Label3.ForeColor = Color.Red;
        Label3.Text = "A hozzáférés tiltott a túl sok kérés miatt!";
      }
    }
Nézzük miként is működik az Access függvény.
    private bool Access(string ip)
    {
      string s;
      int count = 0;
Az adott IP cím számlálásához végig kell mennünk a Cache összes bejegyzésén és ellenőrizni, hogy az adott IP hányszor szerepel. Ehhez kérünk a Cache-től egy IDictionaryEnumerator interfészt a GetEnumerator függvényének hívásával.
      IDictionaryEnumerator de = Cache.GetEnumerator();
Ezt követően egy while ciklussal könnyedén végigmehetünk az összes elemen, melynél a MoveNext függvény fogja mindig a következő elemet szolgáltatni.
      while (de.MoveNext())
      {
Itt kiolvassuk a Cache bejegyzés nevet.
        s = de.Key.ToString();
Amelyben ellenőrizzük, hogy a név tartalmazza-e az általunk választott szöveg konstanst, vagy valamilyen más objektumról van esetleg szó.
        if (s.IndexOf("OverLoadIPAddress") != -1)
        {
Ha IP címet tároló objektumot találunk, akkor ellenőrizzük, hogy annak értéke egyezik-e a paraméterként kapott IP címmel.
          if (de.Value.ToString() == ip)
          {
Ha igen, akkor az adott IP cím már szerepel a Cache-ben, így növelhetjük a számlálót.
            count++;
          }
        }
      }
Visszatérési értékként pedig akkor adunk igaz értéket, ha a számlálónk nem haladta meg a tízet, vagyis a kérés még kiszolgálható.
      return count<10;    
    }

Könyv
Ez a cikk megtalálható ebben a könyvben: C# Software Offline 2001 évkönyv 357. oldal

Felhasználási feltételek
A Software Online szoftverfejlesztői magazin mindegyik cikke, minden megjelent képe, és egyéb publikált anyaga szerzői jog védelme alatt áll! Bármilyen formában történő másodlagos terjesztésük, közzétételük vagy felhasználásuk kizárólag a kiadó előzetes írásbeli engedélyével történhet!

Copyright © 1999-2012 Animare Software Kft. Minden jog fenntartva!
| Készült: Animare Stúdió | Adatvédelem | Kapcsolat |