{"id":169,"date":"2018-02-05T23:50:24","date_gmt":"2018-02-05T22:50:24","guid":{"rendered":"https:\/\/brozanski.net\/?p=169"},"modified":"2018-02-06T00:02:39","modified_gmt":"2018-02-05T23:02:39","slug":"169","status":"publish","type":"post","link":"https:\/\/brozanski.net\/index.php\/2018\/02\/05\/169\/","title":{"rendered":"PHP &#8211; jak pomaga nam w bezpiecznym pisaniu aplikacji"},"content":{"rendered":"<p>PHP &#8211; pozna\u0142 go prawie ka\u017cdy programista, kt\u00f3ry kiedykolwiek pr\u00f3bowa\u0142 napisa\u0107 stron\u0119 internetow\u0105, troch\u0119 bardziej skomplikowan\u0105 ni\u017c statyczny HTML. Jest prosty, \u0142atwy w nauce i wybaczaj\u0105cy wiele b\u0142\u0119d\u00f3w. Niestety wraz z prostot\u0105 id\u0105 b\u0142\u0119dy, kt\u00f3re do\u015b\u0107 mocno przys\u0142u\u017cy\u0142y si\u0119 opinii, \u017ce jest to wymarzony cel atak\u00f3w hakerskich. <\/p>\n<p>Wi\u0119kszo\u015b\u0107 pocz\u0105tkuj\u0105cych, ale i tak\u017ce cz\u0119\u015b\u0107 zaawansowanych programist\u00f3w nie zdaje sobie sprawy jak poprawnie u\u017cywa\u0107 j\u0119zyka PHP, aby unikn\u0105\u0107 podstawowych podatno\u015bci na ataki, kt\u00f3re mog\u0105 wp\u0142yn\u0105\u0107 na bezpiecze\u0144stwo wystawionej w Internecie aplikacji. Cz\u0119\u015bciowo te\u017c sam j\u0119zyk nie pomaga nam w rozwi\u0105zaniu tych problem\u00f3w, a tylko powoduje w nas fa\u0142szywe poczucie bezpiecze\u0144stwa. Przyk\u0142adem tego mo\u017ce by\u0107 to w jaki spos\u00f3b PHP wspomaga programist\u00f3w w tak podstawowej funkcjonalno\u015bci jak walidacja danych wej\u015bciowych (ang. input validation &#8211; IV) i enkodowanie wyj\u015bciowe (ang. output encoding), kt\u00f3re sa podstawow\u0105 technik\u0105 chroni\u0105c\u0105 przed podatno\u015bciami takimi jak XSS  &#8211; Cross Site Scripting i wstrzykiwanie kodu (Injection).<\/p>\n<p>Tak dla przypomnienia XSS to podatno\u015b\u0107 umo\u017cliwiaj\u0105ca wywo\u0142anie kodu JavaScript na przeglarce u\u017cytkownika, co mo\u017ce s\u0142u\u017cy\u0107 np. do przej\u0119cia sesji u\u017cytkownika (poprzez zdalne odczytywanie cistek z sesjami), b\u0105d\u017a nawet ca\u0142ego komputera (patrz atak z wykorzystaniem narz\u0119dzia BeEF). Wstrzykiwanie umo\u017cliwia wywo\u0142ywanie nieporz\u0105danych polece\u0144 po stronie serwera, np. w warstwie pow\u0142oki (bash) lub na bazie danych (SQLInjection).<\/p>\n<p>Jak napisa\u0142em wy\u017cej podstaw\u0105 technik\u0105 ochrony przed tego typu atakami jest sprawdzanie tego, co nam u\u017cytkownik wysy\u0142a do aplikacji. Zasada jest prosta:<br \/>\n<strong>&#8222;Ka\u017cde dane wej\u015bciowe, kt\u00f3re mog\u0105 by\u0107 zmodyfikowane na zewn\u0105trz aplikacji, musz\u0105 by traktowane jako potencjalnie niebezpieczne&#8221;<\/strong><br \/>\nTak wi\u0119c, za dane wej\u015bciowe traktujemy nie tylko dane wprowadzane w polach formularzy, ale r\u00f3wnie\u017c warto\u015bci nag\u0142\u00f3wk\u00f3w HTTP (zw\u0142aszcza niestandardowych) czy warto\u015bci w ciasteczkach (ang. cookies). Chroni\u0107 powinni\u015bmy si\u0119 przede wszystkim przed danymi, kt\u00f3re w swojej tre\u015bci zawieraj\u0105 fragmenty kodu HTML i JS, skrypt\u00f3w bash czy zapyta\u0144 SQL.<\/p>\n<p>Jak PHP pomaga nam chroni\u0107 si\u0119 przed nieporz\u0105danymi warto\u015bciami? Mo\u017cna by powiedzie\u0107, \u017ce nie daje nam wiele. Przede wszystkim nale\u017cy zwr\u00f3ci\u0107 uwag\u0119 na to, \u017ce PHP jest j\u0119zykiem dynamicznie typowanym. Co to znaczy? J\u0119zyk ten nie por\u00f3wnuje typu warto\u015bci i typu zmiennej do jakiej te warto\u015bci s\u0105 przypisywane. Weryfikacja nast\u0119puje dopiero wtedy gdy chcemy na tych danych wykona\u0107 jak\u0105\u015b operacj\u0119. Zwykle silne typowanie jest pierwsz\u0105 lini\u0105 obrony podczas weryfikacji wprowadzanych danych, a jego brak powoduje problem, gdzie nie mo\u017cemy jednoznacznie zaznaczy\u0107, \u017ce wskazana zmienna ma by\u0107 na przyk\u0142ad tylko warto\u015bci\u0105 ca\u0142kowit\u0105, lub np. typem binarnym.<br \/>\nInnym sposobem walidacji danych wej\u015bciowych jest poddawanie ich niestandardowym testom. Programista jest zmuszony zbudowa\u0107 w\u0142asne weryfikatory wprowadzanych danych, np. opartych na whitelistach lub wyra\u017ceniach regularnych (cho\u0107 tutaj istniej\u0105 r\u00f3wnie\u017c techniki omijania takich test\u00f3w), dzi\u0119ki czemu &#8222;wpuszcza&#8221; do swojej aplikacji tylko warto\u015bci takie jakich si\u0119 mo\u017ce spodziewa\u0107.<br \/>\nWarta uwagi, cho\u0107 rozwi\u0105zuj\u0105ca tylko jeden z szeregu problem\u00f3w, jest funkcja <code>strip_tags()<\/code>. Funkcja ta pozwala na usuni\u0119cie z przekazanej warto\u015bci wszelkie tagi HTML. Niestety zastosowanie jej nie chroni przed atakami XSS, gdzie wstrzykiwany niebezpieczny kod jest w pola atrybut\u00f3w tag\u00f3w HTML (np. w formularzach). Wtedy poradzi\u0107 mo\u017cemy sobie tylko whitelist\u0105 dozwolonych znak\u00f3w.<\/p>\n<p>Co zrobi\u0107 je\u015bli jednak dane wej\u015bciowe obejd\u0105 filtry? Wtedy pom\u00f3c nam mo\u017ce tzw. encodowanie. Encodowanie zamienia nam znaki danych wej\u015bcowych w taki spos\u00f3b, aby by\u0142y poprawnie wy\u015bwietlane w docelowym \u015brodowisku (np. na stronie HTML, na wy\u015bwietlaczu elektronicznym) oraz, aby nie wp\u0142ywa\u0142y na spos\u00f3b renderowania (np. nie by\u0142y interpretowane jako kod HTML, JS, czy jako operacje steruj\u0105ce).<br \/>\nCo w kwestii encodowania daje nam PHP? Pierwsza strona w wynikach google podaje nam g\u0142\u00f3wnie u\u017cycie funkcji <code>htmlspecialchars()<\/code>. Funkcja zamienia <strong>znaki specjalne<\/strong> na tzw. encje HTML (np. &#8222;<\" na \"<code>&amp;lt;<\/code>&#8222;, &#8222;>&#8221; na &#8222;<code>&amp;gt;<\/code>&#8222;, patrz: <a href=\"http:\/\/us.php.net\/htmlspecialchars\" rel=\"noopener\" target=\"_blank\">htmlspecialchars<\/a>). T\u0119 sam\u0105 czynno\u015b\u0107 wykonuje inna funkcja PHP &#8211; <code>htmlentities()<\/code> (patrz: <a href=\"http:\/\/us3.php.net\/manual\/en\/function.htmlentities.php\" rel=\"noopener\" target=\"_blank\">htmlentities()<\/a>, z tym, \u017ce enkoduje ona wszystkie znaki, kt\u00f3re maj\u0105 swoje odpowiedniki w encjach HTML, a nie tylko znaki specjalne. Niestety funkcje te nie przydadz\u0105 si\u0119 gdy w naszych danych musimy dopu\u015bci\u0107 znaki specjalne, aby umo\u017cliwi\u0107 np. wproqwadzane bardziej skomplikowanych tre\u015bci (np. nazwiska z apostrofami, czy prosty kod HTML). Tutaj pomog\u0105 nam tylko whitelisty.<\/p>\n<p>Og\u00f3lnie PHP jest ubogi je\u015bli chodzi o ochron\u0119 aplikacji przed wprowadzanymi danymi i wymaga od programisty do\u015b\u0107 du\u017cej uwagi a tak\u017ce powtarzalnej pracy do wykonania, aby zaimplementowa\u0107 odpowiednie techniki ochrony (mechanizm template&#8217;\u00f3w). Powoduje to, \u017ce proste aplikacje, cz\u0119sto nie s\u0105 chronione w odpowiedni spos\u00f3b i podatne na szereg, nawet do\u015b\u0107 prostych atak\u00f3w. Mam nadziej\u0119, \u017ce wkr\u00f3tce b\u0119de m\u00f3g\u0142 opisa\u0107 jeden przyk\u0142ad z \u017cycia na jaki mia\u0142em okazj\u0119 si\u0119 natkn\u0105\u0107.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>PHP &#8211; pozna\u0142 go prawie ka\u017cdy programista, kt\u00f3ry kiedykolwiek pr\u00f3bowa\u0142 napisa\u0107 stron\u0119 internetow\u0105, troch\u0119 bardziej skomplikowan\u0105 ni\u017c statyczny HTML. Jest prosty, \u0142atwy w nauce i wybaczaj\u0105cy wiele b\u0142\u0119d\u00f3w. Niestety wraz z prostot\u0105 id\u0105 b\u0142\u0119dy, kt\u00f3re do\u015b\u0107 mocno przys\u0142u\u017cy\u0142y si\u0119 opinii, \u017ce jest to wymarzony cel atak\u00f3w hakerskich. Wi\u0119kszo\u015b\u0107 pocz\u0105tkuj\u0105cych, ale i tak\u017ce cz\u0119\u015b\u0107 zaawansowanych programist\u00f3w\u2026 <span class=\"read-more\"><a href=\"https:\/\/brozanski.net\/index.php\/2018\/02\/05\/169\/\">Read More &raquo;<\/a><\/span><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[11],"tags":[26],"class_list":["post-169","post","type-post","status-publish","format-standard","hentry","category-security","tag-miroburn_challenge"],"_links":{"self":[{"href":"https:\/\/brozanski.net\/index.php\/wp-json\/wp\/v2\/posts\/169","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/brozanski.net\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/brozanski.net\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/brozanski.net\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/brozanski.net\/index.php\/wp-json\/wp\/v2\/comments?post=169"}],"version-history":[{"count":13,"href":"https:\/\/brozanski.net\/index.php\/wp-json\/wp\/v2\/posts\/169\/revisions"}],"predecessor-version":[{"id":182,"href":"https:\/\/brozanski.net\/index.php\/wp-json\/wp\/v2\/posts\/169\/revisions\/182"}],"wp:attachment":[{"href":"https:\/\/brozanski.net\/index.php\/wp-json\/wp\/v2\/media?parent=169"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/brozanski.net\/index.php\/wp-json\/wp\/v2\/categories?post=169"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/brozanski.net\/index.php\/wp-json\/wp\/v2\/tags?post=169"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}