<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>xlab &#187; php</title>
	<atom:link href="http://xlab.pl/tag/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://xlab.pl</link>
	<description>XSolve laboratory - dzielimy się tym co wiemy...</description>
	<lastBuildDate>Mon, 09 Jan 2012 15:29:06 +0000</lastBuildDate>
	<language>pl</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>PFCongres 2011 &#8211; szybkie podsumowanie</title>
		<link>http://xlab.pl/pfcongres-2011-szybkie-podsumowanie/</link>
		<comments>http://xlab.pl/pfcongres-2011-szybkie-podsumowanie/#comments</comments>
		<pubDate>Mon, 03 Oct 2011 17:15:17 +0000</pubDate>
		<dc:creator>adam.gegotek</dc:creator>
				<category><![CDATA[Programowanie PHP]]></category>
		<category><![CDATA[konferencja]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://xlab.pl/?p=1880</guid>
		<description><![CDATA[W dniu siedemnastego września bieżącego roku, w holenderskim mieście Utrecht odbył się PFCongres 2011. Dla tych, którzy jeszcze nie wiedzą cóż to takiego, jest to konferencja poświęcona rozwojowi internetu skupiająca głównie entuzjastów PHP już ponad szósty raz z rzędu. Tegoroczna edycja została podzielona na dwie, dwujęzyczne, odbywające się równolegle części i gościła aż czternastu światowej [...]]]></description>
			<content:encoded><![CDATA[<p>W dniu siedemnastego września bieżącego roku, w holenderskim mieście Utrecht odbył się <a title="pfcongres" href="http://www.pfcongres.com/" target="_blank">PFCongres 2011</a>. Dla tych, którzy jeszcze nie wiedzą cóż to takiego, jest to konferencja poświęcona rozwojowi internetu skupiająca głównie entuzjastów PHP już ponad szósty raz z rzędu. Tegoroczna edycja została podzielona na dwie, dwujęzyczne, odbywające się równolegle części i gościła aż czternastu światowej sławy mówców wśród których znaleźli się:</p>
<p><em>Zeev Suraski</em> &#8211; izraelski programista PHP, współzałożyciel Zend Technologies. Z pomocą Andiego Gutmans&#8217;a w 1997 napisał PHP3, po czym dwa lata później stworzył Zend Engine.</p>
<p><em>Derick Rethans</em> &#8211; twórca mcrypt, input_filter, dbus i rozszerzeń typu date/time w PHP. Znany również z opieki nad projektem PHP&#8217;owego profilera Xdebug oraz z kilkuletniego zaangażowania w Apache Zeta Components.</p>
<p><em>Jouzas Kaziukenas</em> &#8211; założyciel i prezes firmy Web Species Ltd, mówca na konferencjach dotyczących technologii informatycznych, blogger.</p>
<p><em>Joshua Thijssen</em><strong> </strong>- starszy inżynier oprogramowania w Enrise/4Worx oraz właściciel prywatnej firmy NoxLogic.</p>
<p>Pomimo tego, iż byłem w stanie uczestniczyć tylko na przemówieniach w języku angielskim, muszę przyznać, że poruszono w nich kilka ciekawych tematów takich jak:</p>
<p>-<em> 15 porad dla użytkowników MySQL</em><br />
<em> -  Struktury danych SPL i ich złożoność</em><br />
<em>- Jak władać przestrzeniami nazw w PHP</em><br />
<em>- Nowa era frameworków w PHP</em><br />
<em>- Rozszerzenia w PHP, z czym i dlaczego ?</em></p>
<p>Oceniając je poprzez pryzmat programisty PHP, trzy pierwsze uważam za naprawdę wartościowe i godne uwagi.</p>
<p>Według mnie najciekawsze przemówienie wygłosił Joshua Thijssen, specjalista MySQL, który w zwięzły sposób pokazał kilkanaście sztuczek mogących znacznie przyspieszyć operacje na bazie danych. Uważam, że przejrzenie <a title="15 mysql protips" href="http://www.slideshare.net/jaytaph/15-protips-for-mysql-users-pfz" target="_blank">slajdów</a> z jego przemowy na pewno nauczy Was czegoś nowego. Pamiętajcie by nie ufać varchar&#8217;om! :)</p>
<p>Kolejnym, wybitnym przemówieniem popisał się Jurriën Stutterheim, który po krótkiej dygresji na temat złożoności algorytmów przeszedł do ciekawszej części poświęconej strukturom danych w PHP. Było naprawdę miło słuchać wykładu w którym dowodził, że prócz typowych tablic, PHP oferuje tak zaawansowane struktury jak: SplDoublyLinkedList, SplStack, SplQueue, SplHeap, SplMaxHeap, SplMinHeap, SplPriorityQueue, SplFixedArray i SplObjectStorage. Szczerze zachęcam do obejrzenia jego <a title="spl data structures" href="http://www.slideshare.net/norm2782/pf-congres20110917-datastructures" target="_blank">prezentacji</a>.</p>
<p>Chciałbym też wspomnieć o wystąpieniu Nicka Belhomme, który postanowił opowiedzieć o nowej funkcjonalności wprowadzonej do PHP dopiero w wersji 5.3. Jego tematem były oczywiście przestrzenie nazw (ang. namespaces), czyli abstrakcyjne kontenery stworzone do trzymania logicznie pogrupowanych unikatowych identyfikatorów. Jego <a title="mastering namespaces" href="http://www.slideshare.net/NickBelhomme/mastering-namespaces-pfcongres11" target="_blank">prezentacja</a> była szczególnie edukacyjna i istotna dla przyszłych projektów w PHP, obfitując przy tym dodatkowo w kilkanaście przykładów z kodami źródłowymi.</p>
<p>Na sam koniec chciałbym przytoczyć wypowiedź Jouzasa Kaziukenas&#8217;a. Starał się on ukazać zmiany jakie zaszły w świecie frameworków PHP&#8217;owych w przeciągu ostatnich sześciu lat. Muszę przyznać, że zrobił to wyjątkowo dobrze. Wymieniwszy kilka frameworków, w tym Symfony2, Zend Framework, Lithium, Alloy, Fuel, Fat-free oraz Flow3, jego uwagę na dłużej przykuło Symfony2. Przede wszystkim za sprawą innowacyjnych rozwiązań o których rozprawiał, takich jak: bundles, dependency injection oraz community driven development (GIT). Nie bez znaczenia okazały się również symfonowe interoperacyjność, szybkość i doskonała dokumentacja. Jouzas ponadto bardzo oczekiwał nowej, stabilnej wersji frameworka ZF2, którego premiery nie potrafił niestety określić. Jeśli w tym czasie chcielibyśmy czegoś z innej beczki, do wypróbowania zostają microframeworki. Pomimo tego, iż stworzone głównie dla małych projektów, z pewnością będą interesującą i godną uwagi alternatywą. Dla zainteresowanych, przytoczonym microframeworkiem został Silex.</p>
<p>Podsumowując konferencję PFCongres muszę przyznać, że uczestnictwo w niej było dla mnie bardzo cennym doświadczeniem. Miałem bowiem okazję poznać wiele ciekawostek i wodotrysków jak również zaznajomić się z nowinkami i przyszłymi trendami języka PHP. Miałem też okazję na własne oczy zobaczyć Tych, którzy wkładają ogromny wysiłek w jego rozwój. Co więcej, bardzo zmotywowało mnie ich entuzjastyczne podejście do dalszego rozwoju i udoskonalania owego języka. Liczę, że i w przyszłym roku zdołam stawić się na PFCongres, a jeśli i Ty czujesz się podobnie &#8222;wkręcony&#8221; w PHP, to serdecznie polecam i zapraszam Cie na to wydarzenie!</p>
]]></content:encoded>
			<wfw:commentRss>http://xlab.pl/pfcongres-2011-szybkie-podsumowanie/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Kiedy i dlaczego tworzyć oprogramowanie pod klucz i dlaczego framework Symfony2 pasuje tu jak ulał?</title>
		<link>http://xlab.pl/kiedy-i-dlaczego-tworzyc-oprogramowanie-pod-klucz-i-dlaczego-framework-symfony2-pasuje-tu-jak-ulal/</link>
		<comments>http://xlab.pl/kiedy-i-dlaczego-tworzyc-oprogramowanie-pod-klucz-i-dlaczego-framework-symfony2-pasuje-tu-jak-ulal/#comments</comments>
		<pubDate>Tue, 20 Sep 2011 07:38:03 +0000</pubDate>
		<dc:creator>Wojtek Sznapka</dc:creator>
				<category><![CDATA[Programowanie PHP]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[oprogramowanie dedykowane]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[symfony]]></category>
		<category><![CDATA[symfony2]]></category>

		<guid isPermaLink="false">http://xlab.pl/?p=1843</guid>
		<description><![CDATA[Gotowe rozwiązania Open Source Na rynku istnieje mnóstwo rozwiązań Open Source, rozwiązujące różne klasy zagadnień. Mowa tu o produktach e-commerce (Magento, Presta Shop), CMS (Drupal, Joomla, WordPress), systemach klasy CRM, ERP, czy DMS, a także „community builders”, czyli np. fora internetowe (PHP BB). W zdecydowanej większości powyższych przypadków nie potrzeba wiedzy programistycznej aby wdrożyć i [...]]]></description>
			<content:encoded><![CDATA[<h2>Gotowe rozwiązania Open Source</h2>
<p>Na rynku istnieje mnóstwo rozwiązań Open Source, rozwiązujące różne klasy zagadnień. Mowa tu o produktach e-commerce (Magento, Presta Shop), CMS (Drupal, Joomla, WordPress), systemach klasy CRM, ERP, czy DMS, a także „community builders”, czyli np. fora internetowe (PHP BB). W zdecydowanej większości powyższych przypadków nie potrzeba wiedzy programistycznej aby wdrożyć i rozwijać serwisy. Mają one obszerne zbiory rozszerzeń i wtyczek (plugins), które pozwalają dostosowywać systemy do potrzeb. Takie podejście pozwala na znaczne zmniejszenie kosztów wdrożenia aplikacji.</p>
<p>Pomimo tych zalet, często jest tak, że systemy te pasują do prostych modeli biznesowych, które w życiu codziennym występują nad wyraz rzadko. W starciu z rzeczywistością, wdrażanie takich systemów, a przede wszystkim utrzymanie i reakcje na rozwój rynku mają przełożenie na zasadę Pareto, która mówi o tym, że 80% funkcjonalności jesteśmy w stanie osiągnąć w 20% czasu, a 20% krytycznych funkcji systemu konsumuje 80% budżetu.</p>
<p>Głównymi problemami z jakimi spotykają się wdrożenia oparte o gotowe rozwiązania to przede wszystkim komplikacja logiki biznesowej systemu, której nie da się odwzorować na możliwości produktu. Często dochodzi do paradoksalnych sytuacji, w których model biznesowy trzeba dopasowywać do systemu, co nigdy nie powinno mieć miejsca. Inną kwestia jest rozwój aplikacji i zwiększenie ruchu, które powoduje, że dobrze działające oprogramowanie dla małej liczby użytkowników staje się bezużyteczne przy wielkim obciążeniu. Poza tym istnieje potencjalne ryzyko związane z atakami hakerskimi, gdyż kod jest otwarty i dostępny dla potencjalnych włamywaczy. Aby dostrzec skalę problemu, wystarczy przejrzeć serwisy z dostępnymi exploitami. Ostatnią kwestią, która przychodzi w tym momencie na myśl, jest to, że czasem społeczność rozwijająca dany produkt, w pewnym etapie może zaprzestać dalszych prac. Powodów może być kilka, raz jest to skłócenie zespołu, innym razem przejście na nową technologię, lub do innego projektu, pozostawiając dotychczasowych użytkowników samych sobie.</p>
<h2>Zalety tworzenia oprogramowania dedykowanego</h2>
<p>Wszystkie problemy opisane powyżej rozwiązuje oprogramowanie dedykowane, a nawet można się pokusić o stwierdzenie, że wnosi tutaj wiele wartości dodanych. Przede wszystkim klient dostaje dokładnie to czego potrzebuje i za co płaci. Oczywiście trzeba mieć na względzie, że nie każdy klient jest osobą techniczną i nie koniecznie musi mieć doświadczenie z systemami informatycznymi, więc doradztwo technologiczne jest tutaj nieocenioną wartością. Firma programistyczna na etapie przygotowania oferty doradza klientowi najlepsze rozwiązania, proponuje pewne opcje, tworząc przy tym najlepszą możliwą ofertę, budując relację i zaufanie z zamawiającym. Dzięki temu klient odzwierciedla swój model biznesowy w tworzonym systemie, nastawiając się na zysk z inwestycji w przyszłości. Poza tym oprogramowanie jest gotowe na rozwój, co jest bardzo ważnym czynnikiem, gwarantującym skuteczność przedsięwzięcia i reakcję na sygnały spływające od użytkowników lub na trendy rynkowe. Ważnym czynnikiem  jest tutaj również samopoczucie programistów, którzy nie klikają  w panelach administracyjnych Drupala czy Magento, ale programują i rozwiązują problemy, realizując się przy tym zawodowo.</p>
<h2>Nie wynajdujemy koła od nowa, czyli o frameworkach słów kilka</h2>
<p>Framework to z definicji zestaw uniwersalnych narzędzi na bazie których tworzy się aplikacje. Nie wyobrażalne jest, aby w tych czasach tworzyć systemy informatyczne bez wykorzystania takiego narzędzia. Aby lepiej zobrazować temat, możemy porównać do płyty podwoziowej samochodu. Daje nam ona wszelkie potrzebne mechanizmy, czyli ramę całego auta, łożyska, układ wydechowy, wiązki elektryczne. Na takiej ramie możemy stworzyć wiele rodzajów samochodów, np. pickup, miejski hatchback, średniej klasy sedan, lub ekskluzywny, drogi wóz. Podobnie jest z frameworkiem – zapewnia mechanizmy potrzebne w większości systemów. Mowa przede wszystkim o kontrolerze aplikacji, reagującym na żądania użytkownika, warstwie widoku, prezentującą dane w formie graficzne, warstwie dostępu do bazy danych, mechanizmie bezpieczeństwa, pozwalającą na autoryzowanie użytkowników i ograniczanie dostępu do poszczególnych części serwisu. To tylko niektóre z rozwiązań, nowoczesne frameworki dostarczają wiele więcej. Inną kwestią jest standaryzacja kodu tworzonego przy ich użyciu. Jest o wiele łatwiej nowej osobie wejść w projekt, jeśli framework narzuca standardy kodowania i rozwiązania umieszczane są w odpowiedniej strukturze kodu. Pozwala to na szybsze wdrażanie się nowych członków zespołu, a co za tym idzie na przyspieszenie całego rozwoju.</p>
<p>Jest jeszcze jedna ważna kwestia, która decyduje o sukcesie danego frameworka – liczba gotowych rozwiązań w postaci wtyczek lub komponentów. Jest to sytuacja analogiczna do gotowych rozwiązań Open Source, z tym, że tutaj łatwo rozszerzyć dany komponent oraz dostosować go do wymagań systemu. Mamy też zapewnione wsparcie społeczności w kwestii rozwiązywania problemów, tworzenia nowych funkcjonalności czy aktualizacji i wydawania poprawek.</p>
<h2>Dlaczego Symfony2 pasuje tutaj jak ulał?</h2>
<p>Symfony2 kontynuuje dobrą passę swojego poprzednika, który istnieje już 6 lat. Programiści wyciągnęli naukę z poprzedniej wersji, podpatrzyli rozwiązania z innych platform (Java, Ruby On Rails, Python i Django, czy Zend Framework) i przepisali całość od podstaw. Dzięki temu powstał najlepszy aktualnie framework PHP, który wygrywa przede wszystkim bardzo dobrą strukturą niezależnych modułów, które można rozwijać oddzielnie, a nawet wykorzystywać w innych projektach. Autorzy przewidzieli strukturę projektu tworząc tzw. Bundle, które są modułami, gotowymi do użycia w innych projektach (nawet wnętrze frameworka się z nich składa). W tym momencie warto wspomnieć o Bundlach dostarczanych przez programistów i firmy zewnętrzne (jest ich już prawie 600). Całość systemu jest oparta o nowoczesny kontener wstrzykiwania zależności (Dependency Injection Container), przez co podmiana kluczowych części systemu może być zrobiona w mgnieniu oka (to rozwiązanie bardzo szeroko stosuje się w Java EE oraz innych dojrzałych rozwiązaniach). Warto też zauważyć, że autorzy duży nacisk kładą na wydajność i szybkość działania, co jest zauważalne na pierwszy rzut oka, bez wnikliwych badań obciążeniowych.</p>
<p>O powadze sytuacji świadczy też fakt, że Symfony2 zostało w całości przeniesione do gita i jego kod jest utrzymywany w serwisie Github.com.  Dzięki temu każdy może go sklonować kod źródłowy, pracować na nim lokalnie wprowadzając poprawki czy tworząc nowe funkcjonalności, a później jednym kliknięciem wysłać prośbę o włączenie swoich zmian do głównego repozytorium. To powoduje, że na dzień dzisiejszy Symfony2 jest najczęściej rozgałęzianym  i najchętniej oglądanym repozytorium PHP na Githubie, a liczba osób, które miały swój wkład w rozwój przekracza 250. Poza tym za frameworkiem stoi francuska firma Sensio Labs, wraz z założycielem i głównym programistą Fabienem Potencierem. Ten fakt zapewnia stabilność rozwoju, wysoką jakość dokumentacji oraz dostępność szkoleń i materiałów. Firma ta zorganizowała nawet zbiórkę pieniędzy wśród społeczności i zleciła audyt bezpieczeństwa organizacji zajmującej się tego typu działaniami .</p>
<p>Reasumując, trzeba przyznać, że Symfony2 zrewolucjonizowało świat frameworków PHP, a można się nawet pokusić o stwierdzenie, że programiści innych języków (Python, Ruby, Groovy) też z szacunkiem patrzą na to rozwiązanie. Symfony2 idealnie nadaje się do rozwoju aplikacji dedykowanych i na pewno można go polecić do większości projektów.</p>
]]></content:encoded>
			<wfw:commentRss>http://xlab.pl/kiedy-i-dlaczego-tworzyc-oprogramowanie-pod-klucz-i-dlaczego-framework-symfony2-pasuje-tu-jak-ulal/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>RESTful Symfony2</title>
		<link>http://xlab.pl/restful-symfony2/</link>
		<comments>http://xlab.pl/restful-symfony2/#comments</comments>
		<pubDate>Mon, 01 Aug 2011 21:25:34 +0000</pubDate>
		<dc:creator>Wojtek Sznapka</dc:creator>
				<category><![CDATA[Programowanie PHP]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[rest]]></category>
		<category><![CDATA[symfony2]]></category>
		<category><![CDATA[webservice]]></category>

		<guid isPermaLink="false">http://xlab.pl/?p=1840</guid>
		<description><![CDATA[Jakiś czas temu na cotygodniowym evencie &#8222;Piątek z XSolve&#8221; przedstawiłem prezentację pt. &#8222;RESTful Symfony2&#8243;, opisującą jak w łatwy sposób przy użyciu frameworka Symfony2 i rozszerzenia RestBundle tworzyć API REST. RestBundle jest rozwijane przez grupę programistów Friends Of Symfony, którzy w większości tworzą również rdzeń frameworka. Zachęcam do zapoznania się z prezentacją i wypróbowania możliwości zarówno [...]]]></description>
			<content:encoded><![CDATA[<p>Jakiś czas temu na cotygodniowym evencie &#8222;Piątek z XSolve&#8221; przedstawiłem prezentację pt. &#8222;RESTful Symfony2&#8243;, opisującą jak w łatwy sposób przy użyciu frameworka Symfony2 i rozszerzenia RestBundle tworzyć API REST. RestBundle jest rozwijane przez grupę programistów Friends Of Symfony, którzy w większości tworzą również rdzeń frameworka. Zachęcam do zapoznania się z prezentacją i wypróbowania możliwości zarówno Symfony2 jak i FOSRestBundle.<span id="more-1840"></span></p>
<div class="prezi-player">
<style type="text/css" media="screen">.prezi-player { width: 650px; } .prezi-player-links { text-align: center; }</style>
<p><object id="prezi_wh4xxmz1uiar" name="prezi_wh4xxmz1uiar" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="650" height="500"><param name="movie" value="http://prezi.com/bin/preziloader.swf"/><param name="allowfullscreen" value="true"/><param name="allowscriptaccess" value="always"/><param name="bgcolor" value="#ffffff"/><param name="flashvars" value="prezi_id=wh4xxmz1uiar&amp;lock_to_path=0&amp;color=ffffff&amp;autoplay=no&amp;autohide_ctrls=0"/><embed id="preziEmbed_wh4xxmz1uiar" name="preziEmbed_wh4xxmz1uiar" src="http://prezi.com/bin/preziloader.swf" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="650" height="500" bgcolor="#ffffff" flashvars="prezi_id=wh4xxmz1uiar&amp;lock_to_path=0&amp;color=ffffff&amp;autoplay=no&amp;autohide_ctrls=0"></embed></object>
<div class="prezi-player-links">
<p><a title="</p>
<p>                            W prezentacji opiszę jak w łatwy sposób szybko tworzyć usługi SOA komunikujace się RESTem w Symfony2.</p>
<p>                        " href="http://prezi.com/wh4xxmz1uiar/restful-symfony2/">RESTful Symfony2</a> on <a href="http://prezi.com">Prezi</a></p>
</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://xlab.pl/restful-symfony2/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>XSolve Poland Symfony2 Launch Party</title>
		<link>http://xlab.pl/xsolve-poland-symfony2-launch-party/</link>
		<comments>http://xlab.pl/xsolve-poland-symfony2-launch-party/#comments</comments>
		<pubDate>Wed, 27 Jul 2011 13:18:07 +0000</pubDate>
		<dc:creator>Adam</dc:creator>
				<category><![CDATA[Ogólne]]></category>
		<category><![CDATA[Programowanie PHP]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[premiera php]]></category>
		<category><![CDATA[RC6]]></category>
		<category><![CDATA[symfony2]]></category>
		<category><![CDATA[symfony2 premiera]]></category>

		<guid isPermaLink="false">http://xlab.pl/?p=1824</guid>
		<description><![CDATA[W czwartek 28.07 odbędzie się oficjalna premiera Symfony2, następcy jednego z najpopularniejszych frameworków PHP, którego stworzenie zajęło grupie 225 osób z całego świata ponad półtora roku. Nowoczesny framework posiada kilkadzieisiąt nowych rozszerzeń oraz przepisany w całości rdzeń, a programiści śledzący jego rozwój doskonały powód do świętowania. W wielu miastach na całym świecie odbywają się imprezy związane [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;"><strong>W czwartek 28.07 odbędzie się oficjalna premiera Symfony2, następcy jednego z najpopularniejszych frameworków PHP, którego stworzenie zajęło grupie 225 osób z całego świata ponad półtora roku. Nowoczesny framework posiada kilkadzieisiąt nowych rozszerzeń oraz przepisany w całości rdzeń, a programiści śledzący jego rozwój doskonały powód do świętowania.</strong></p>
<p style="text-align: justify;">W wielu miastach na całym świecie odbywają się imprezy związane z premierą Symfony2. Także w Polsce programiści i osoby zainteresowane rozwojem tego frameworka będą mogły spotkać się i porozmawiać o jego możliwościach i zastosowaniach. W Gliwicach w siedzibie firm XSolve (branża software development) oraz Chilid (agencja New Marketing) w czwartek (28.07) odbędzie się XSolve Poland Symfony2 Launch Party! Impreza ma charakter otwarty i skierowana jest głównie do programistów pracujących we frameworku Symfony2 oraz osób działających w branży IT. Impreza organizowana jest przy promocyjnym wsparciu Wydawnictwa Helion, które zapewniło wartościowe nagrody dla gości, którzy wezmą udział w zaplanowanych konkursach.</p>
<p style="text-align: justify;">Spotkanie rozpocznie się o godzinie 17.00, w trakcie jego trwania odbędzie się prezentacja Symfony2, będzie również możliwość wymiany doświadczeń z programistami XSolve, którzy na co dzień korzystają z tego frameworka.</p>
<p style="text-align: justify;"><a href="http://www.facebook.com/event.php?eid=124217561004636" target="_blank">Polub wydarzenie na Facebooku!</a></p>
<p style="text-align: center;"><a href="http://xlab.pl/wp-content/uploads/2011/07/plakat_biel1.jpg"><img class="aligncenter size-full wp-image-1828" title="Symfony XSolve" src="http://xlab.pl/wp-content/uploads/2011/07/plakat_biel1.jpg" alt="symfony2, symfony, php, programowanie, framework symfony, framework" width="357" height="505" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://xlab.pl/xsolve-poland-symfony2-launch-party/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Dynamiczna konfiguracja środowiska LAMP dla lokalnej maszyny</title>
		<link>http://xlab.pl/dynamiczna-konfiguracja-srodowiska-lamp-dla-lokalnej-maszyny/</link>
		<comments>http://xlab.pl/dynamiczna-konfiguracja-srodowiska-lamp-dla-lokalnej-maszyny/#comments</comments>
		<pubDate>Wed, 23 Mar 2011 15:52:24 +0000</pubDate>
		<dc:creator>Wojtek Sznapka</dc:creator>
				<category><![CDATA[Programowanie PHP]]></category>
		<category><![CDATA[dnsmasq]]></category>
		<category><![CDATA[lamp]]></category>
		<category><![CDATA[mod vhost alias]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[vhost]]></category>
		<category><![CDATA[webdev]]></category>

		<guid isPermaLink="false">http://xlab.pl/?p=1790</guid>
		<description><![CDATA[Jeśli kiedykolwiek rozwijałeś aplikacje w PHP na swoim lokalnym komputerze, prawdopodobnie używałeś konfiguracji Apache opartej o vhosty. Kilkoma trikami możesz zmienić swojego linuksa w serwer developerski, bez konieczności konfigurowania vhosta dla każdej aplikacji z osobna. Przy minimalnym wysiłku konfiguracyjnym, potrzebowałeś do tego trzech kroków: pobrania repozytorium na dysk stworzenie konfiguracji vhost z jakąś nazwą serwera [...]]]></description>
			<content:encoded><![CDATA[<p>Jeśli kiedykolwiek rozwijałeś aplikacje w PHP na swoim lokalnym komputerze, prawdopodobnie używałeś konfiguracji <strong>Apache</strong> opartej o vhosty. Kilkoma trikami możesz zmienić swojego linuksa w serwer developerski, bez konieczności konfigurowania <strong>vhost</strong>a dla każdej aplikacji z osobna. Przy minimalnym wysiłku konfiguracyjnym, potrzebowałeś do tego trzech kroków:</p>
<ol>
<li>pobrania repozytorium na dysk</li>
<li>stworzenie konfiguracji <strong>vhost</strong> z jakąś nazwą serwera</li>
<li>stworzenie wpisu w <strong>/etc/hosts</strong> który będzie odzwierciedlał nazwę serwera użytego w <strong>vhoście</strong> na 127.0.0.1</li>
</ol>
<p>Jestem pewny, że powyższa ścieżka jest używana przez wielu programistów. Możemy pominąć dwa ostatnie kroki, ograniczając przygotowanie środowiska do umieszczenia kodu źródłowego w specjalnym folderze na dysku. Aby to osiągnąć potrzebujemy moduł Apache&#8217;a <strong>mod_vhost_alias</strong> oraz prosty serwer DNS, który będzie rozwiązywał lokalne domeny dla nas.<br />
Instalacja<strong> mod_vhost_alias </strong>jest dość prosta. Moduł jest prawdopodbnie dołączony do twojej instalacji Apache, pozostaje go tylko uruchomić następującą komendą:</p>
<pre>sudo a2enmod vhost_alias</pre>
<p>Dzięki <strong>mod vhost alias</strong> możemy dynamicznie wskazywać <strong>Document Root </strong>bazując na nazwie serwera. Wystarczy umieścić następującą konfigurację w pliku <strong>/etc/apache2/sites-enabled/000-default</strong></p>
<p><script src="https://gist.github.com/881441.js"> </script></p>
<p>Teraz wszystkie odwołania będą wskazywały na nasz /var/www/FIRST_PART_OF_DOMAIN/web, ponieważ użyliśmy modyfikatora %1. Możesz wprowadzić własną konwencję używając innych modyfikatorów w dyrektywie  <strong>VirtualDocumentRoot</strong> (<a href="http://httpd.apache.org/docs/2.2/mod/mod_vhost_alias.html">patrz dokumentacja</a>). Powyższa konfiguracja jest bardzo minimalistyczna, powinieneś dodać do niej jeszcze logowanie itp.</p>
<p>Ostatnią rzeczą, o jaką należy się zatroszczyć jest dynamiczne rozwiązywanie nazw domen. Najprostszym sposobem jest dodawanie nazwy serwera do pliku<strong> /etc/hosts</strong>, ale to wymaga dodawania wpisu dla każdego hosta. Na przykład wpis w <strong>/etc/hosts</strong>:</p>
<pre> 127.0.0.1 myapp.local.dev</pre>
<p>uruchomi aplikację zlokalizowaną w  /var/www/myapp/ (wskaże na katalog web/, według konwencji symfony). Jeśli chcesz to zautomatyzować, zainstaluj <strong>dnsmasq</strong>, prosty serwer DNS</p>
<pre>sudo apt-get install dnsmasq</pre>
<p>Następnie wyedytuj <strong>/etc/dnsmasq.conf</strong> file (może być położony gdzie indziej, tutaj na przykładzie Ubuntu):</p>
<pre>listen-address=127.0.0.1
address=/.local.dev/127.0.0.1</pre>
<p>Ostatnią rzeczą jest aktualizacja pliku <strong>/etc/resolv.conf</strong> przez dodanie adresu naszego DNSa na początek:</p>
<pre>nameserver 127.0.0.1</pre>
<p>Następnie restartujemy <strong>dnsmasq</strong> i <strong>Apache2</strong>:</p>
<pre>sudo /etc/init.d/apache2 restart
sudo /etc/init.d/dnsmasq restart</pre>
<p>Od teraz możesz się cieszyć nową konfiguracją środowiska LAMP. Każdy nowy projekt potrzebuje być tylko umieszczony w katalogu  /var/www/PROJECT_NAME i będzie od razu dostępny z poziomu przeglądarki pod adresem  PROJECT_NAME.local.dev</p>
]]></content:encoded>
			<wfw:commentRss>http://xlab.pl/dynamiczna-konfiguracja-srodowiska-lamp-dla-lokalnej-maszyny/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Symfony2 Showcase</title>
		<link>http://xlab.pl/symfony2-showcase/</link>
		<comments>http://xlab.pl/symfony2-showcase/#comments</comments>
		<pubDate>Mon, 31 Jan 2011 11:12:53 +0000</pubDate>
		<dc:creator>Wojtek Sznapka</dc:creator>
				<category><![CDATA[Programowanie PHP]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[symfony]]></category>
		<category><![CDATA[symfony2]]></category>
		<category><![CDATA[webdev]]></category>

		<guid isPermaLink="false">http://xlab.pl/?p=1740</guid>
		<description><![CDATA[Podczas pierwszego Piątku z XSolve w tym roku oraz pierwszego w nowej siedzibie, poprowadziłem prezentację na temat Symfony2, które wkrótce ujrzy światło dzienne. Symfony2 zostało przepisane od zera, porzucono kompatybilność wstecz, czego rezultatem jest nowoczesny framework, pozwalający szybko tworzyć bardzo złożone aplikacje. Nadąża on za najaktualniejszymi trendami w brażny, a autorzy chwalą się trzykrotną poprawą [...]]]></description>
			<content:encoded><![CDATA[<p>Podczas pierwszego Piątku z XSolve w tym roku oraz pierwszego w nowej siedzibie, poprowadziłem prezentację na temat Symfony2, które wkrótce ujrzy światło dzienne. Symfony2 zostało przepisane od zera, porzucono kompatybilność wstecz, czego rezultatem jest nowoczesny framework, pozwalający szybko tworzyć bardzo złożone aplikacje. Nadąża on za najaktualniejszymi trendami w brażny, a autorzy chwalą się trzykrotną poprawą wydajności i zmniejszeniem użycia pamięci o połowę.<br />
Aktualnie można przetestować Symfony2 pobierając wersję Preview Release 5 githuba. Ja już to zrobiłem, czego rezultatem jest poniższa prezentacja :-)</p>
<div style="width:645px" id="__ss_6761036"><strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/sznapka/symfony2-showcase" title="Symfony2 showcase">Symfony2 showcase</a></strong><object id="__sse6761036" width="645" height="540"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=symfony2showcase-110131050259-phpapp01&#038;stripped_title=symfony2-showcase&#038;userName=sznapka" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed name="__sse6761036" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=symfony2showcase-110131050259-phpapp01&#038;stripped_title=symfony2-showcase&#038;userName=sznapka" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="645" height="540"></embed></object>
<div style="padding:5px 0 12px">View more <a href="http://www.slideshare.net/">presentations</a> from <a href="http://www.slideshare.net/sznapka">sznapka</a>.</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://xlab.pl/symfony2-showcase/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Doctrine cache</title>
		<link>http://xlab.pl/doctrine-cache/</link>
		<comments>http://xlab.pl/doctrine-cache/#comments</comments>
		<pubDate>Mon, 17 Jan 2011 22:38:33 +0000</pubDate>
		<dc:creator>Paweł Sołtysek</dc:creator>
				<category><![CDATA[Programowanie PHP]]></category>
		<category><![CDATA[doctrine]]></category>
		<category><![CDATA[Optymalizacja]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://xlab.pl/?p=1662</guid>
		<description><![CDATA[Użycie mechanizmu keszującego (ang. cache) jest powszechnie uznawane za jedną z najefektywniejszych metod optymalizacji. Niestety mimo licznych zastosowań często pomija się wykorzystanie tego mechanizmu w celu przechowywania wyników zapytań do baz danych. Tymczasem dzięki wbudowanemu w Doctrine wsparciu dla keszowania możemy łatwo przyspieszyć obsługę zapytań SQL w naszych aplikacjach. Konfiguracja Podstawowa konfiguracja polega na ustawieniu odpowiedniej [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Użycie mechanizmu keszującego (ang. <em>cache</em>) jest powszechnie uznawane za jedną z najefektywniejszych metod optymalizacji. Niestety mimo licznych zastosowań często pomija się wykorzystanie tego mechanizmu w celu przechowywania wyników zapytań do baz danych. Tymczasem dzięki wbudowanemu w <a target="_blank" href="http://www.doctrine-project.org/documentation/manual/1_2/en/caching">Doctrine wsparciu dla keszowania</a> możemy łatwo przyspieszyć obsługę zapytań SQL w naszych aplikacjach.</p>
<h2>Konfiguracja</h2>
<p style="text-align: justify;">Podstawowa konfiguracja polega na ustawieniu odpowiedniej klasy sterownika oraz strategii keszowania. Doctrine dostarcza klasy sterowników dla większości powszechnie używanych mechanizmów keszujących (<a target="_blank" href="http://pecl.php.net/package/APC">APC</a>, <a target="_blank" href="http://xcache.lighttpd.net/">XCache</a>, <a target="_blank" href="http://php.net/manual/pl/book.memcache.php">memcache</a>) oraz dwie strategie keszowania (keszowanie wyników procesu parsowania zapytań DQL oraz keszowanie wyników zapytań SQL). W zależności od potrzeb konfigurację możemy przeprowadzić globalnie (do wyboru mamy konfigurację managera lub połączeń) lub lokalnie z poziomu konkretnego zapytania.</p>
<p style="text-align: justify;">Pracując z symfony ustawienia globalne najlepiej zdefiniować poprzez dodanie metody <em>configureDoctrine()</em> klasy ProjectConfiguration. W zależności od wybranej strategii rejestrujemy sterownik poprzez ustawienie odpowiedniego atrybutu (<strong>Doctrine_Core::ATTR_QUERY_CACHE</strong> lub <strong>Doctrine_Core::ATTR_RESULT_CACHE</strong>). Dodatkowo poprzez ustawienie atrybutu<strong> Doctrine_Core::ATTR_*_CACHE_LIFESPAN</strong> możemy ustawić czas ważności rekordów.</p>
<p><script src="https://gist.github.com/760563.js?file=globalConfiguration1.php"></script> </p>
<p style="text-align: justify;">Powyższa konfiguracja obejmuje wszystkie połączenia nawiązywane przez Doctrine. Czasem może zaistnieć potrzeba ograniczenia konfiguracji do konkretnego połączenia (na przykład jedno z dwóch połączeń jest nawiązywane do bazy danych modyfikowanej przez inną aplikacje). W takiej sytuacji możemy użyć metody <em>configureDoctrineConnectionName()</em> zastępując człon <em>Name</em> nazwą naszego połączenia.</p>
<p><script src="https://gist.github.com/761844.js?file=globalConfiguration2.php"></script> </p>
<p style="text-align: justify;">W razie potrzeby konfigurację możemy przeprowadzić z poziomu konkretnego zapytania. Służą do tego metody <em>useQueryCache()</em> oraz <em>useResultCache()</em> (w dalszej części artykułu poznamy szersze zastosowanie tych metod). Konfiguracja lokalna nadpisuje konfigurację globalną.</p>
<p>    <script src="https://gist.github.com/761014.js?file=sampleQuery.php"></script></p>
<h2>Keszowanie w praktyce</h2>
<p style="text-align: justify;">Mając poprawnie skonfigurowany sterownik jesteśmy gotowi, aby zastosować mechanizm keszujący do naszych zapytań. Kolejne kroki zależą od poziomu konfiguracji oraz wybranej strategii keszownia. Dla przykładu, jeśli wybraliśmy konfigurację globalną  oraz keszowanie wyników zapytań, należy powiadomić Doctrine, które zapytania mają być keszowane (keszowanie wyników procesu parsowania DQL jest automatycznie zastosowane do wszystkich zapytań). Służy do tego wczesniej poznana metoda <em>useResultCache()</em>. Metoda ta jako pierwszy parametr przyjmuje instancję sterownika lub wartość logiczną, który informuje czy dane zapytanie ma być objęte mechanizmem keszowania. Drugi parametr określa czas ważności rekordu dla naszego zapytania, natomiast trzeci jest identyfikatorem tego rekordu.</p>
<p><script src="https://gist.github.com/761131.js?file=sampleQuery2.php"></script> </p>
<p style="text-align: justify;">W ten sposób wynik zapytania po pierwszym wykonaniu zostanie umieszczony w mechanizmie keszującym pod nazwą <em>sample_query</em> na okres jednej godziny. W ciągu tej godziny każde kolejne wykonanie zapytania będzie oddelegowane do mechanizmu keszującego.</p>
<p style="text-align: justify;">Przekazując do zapytania dodatkowe parametry, musimy zadbać, aby każdemu ich zestawowi odpowiadał inny ciąg identyfikujacy wynik zapytania. Doctrine automatycznie wygeneruje odpowiedni identyfikator jeśli nie podamy go jawnie. Takie rozwiązanie jest niewygodne jeśli mamy w perspektywie zarządzanie zawartością mechanizmu keszującego (musimy znać idnentyfikator). Więcej o zarządzaniu wynikami operacji keszowania można przeczytać w poniższym paragrafie.</p>
<p style="text-align: justify;">Metoda <em>useQueryCache()</em> poza tym, że nie przyjmuje trzeciego parametru (identyfikatora) działa analogicznie do <em>useResultCache()</em>. Szczegółowe informacje można znaleźć w <a target="_blank" href="http://www.doctrine-project.org/api/orm/1.2/doctrine/doctrine_query_abstract.html">dokumentacji API</a>.</p>
<h2>Co dalej?</h2>
<p style="text-align: justify;">Keszowanie wyników zapytań niesie ze sobą pewne niebezpieczeństwo &#8211; dane mogą szybko stać się nieaktualne. Wraz ze sterownikami otrzymujemy <a target="_blank" href="http://www.doctrine-project.org/api/orm/1.2/doctrine/doctrine_cache_driver.html#summary_method">zestaw metod</a> umożliwiających zarządzanie zawartością  mechanizmu keszującego. W połączeniu z <a target="_blank" href="http://www.doctrine-project.org/projects/orm/1.2/docs/manual/event-listeners/en#record-hooks">mechanizmem zdarzeń</a> możemy automatycznie usuwać skeszowane wyniki, zapewniając sobie w ten sposób aktualność danych. </p>
<p> <script src="https://gist.github.com/761229.js?file=Foo.class.php"></script></p>
<p style="text-align: justify;">Wolne od takich problemów jest keszowanie wyników parsowania DQL, które zarządzane jest przez Doctrine automatycznie.<br />
<h2>Podsumowanie</h2>
<p style="text-align: justify;">Pomimo oczywistych zalet, stosowanie mechanizmu keszującego powinno być dobrze przemyślane. O&nbsp;ile keszowanie sparsowanych zapytań DQL jest bezpieczne (jeśli stosujemy <em>prepared statements</em>) i&nbsp;zaleca się jego użycie w większości projektów, to wykorzystanie skeszowanych wyników zapytań powinno dotyczyć tylko wybranych przypadków, w których ma sens i faktycznie przyniesie nam korzyści. Nie należy zapominać tutaj o zasadzie, że nie wszystko co zostało opisane jako dobra metoda na polepszenie wydajności aplikacji, będzie dawało taki rezultat we wszystkich sytuacjach.</p>
<p style="text-align: justify;">
]]></content:encoded>
			<wfw:commentRss>http://xlab.pl/doctrine-cache/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Atak session fixation &#8211; czym jest i jak się przed nim bronić</title>
		<link>http://xlab.pl/atak-session-fixation-czym-jest-i-jak-sie-przed-nim-bronic/</link>
		<comments>http://xlab.pl/atak-session-fixation-czym-jest-i-jak-sie-przed-nim-bronic/#comments</comments>
		<pubDate>Fri, 19 Nov 2010 21:32:09 +0000</pubDate>
		<dc:creator>Wojtek Sznapka</dc:creator>
				<category><![CDATA[Programowanie PHP]]></category>
		<category><![CDATA[bezpieczeństwo]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[sesje]]></category>

		<guid isPermaLink="false">http://xlab.pl/?p=1606</guid>
		<description><![CDATA[Sesje internetowe są powszechnie wykorzystywanym mechanizmem w aplikacjach internetowych. Nieprawidłowe ich użycie, może narażać aplikację na podatność na atak session fixation. W poście opiszę jak działa atak i jak się przed nim bronić, zarówno z punktu widzenia programisty, jak i jej użytkownika.]]></description>
			<content:encoded><![CDATA[<h1>Sesje w aplikacjach internetowych</h1>
<p>Ze względu na fakt, że protokół HTTP jest bezstanowy, wyszła potrzeba, aby identyfikować wywołania tego samego użytkownika i przechowywać zmienne pomiędzy nimi. Tym mechanizmem są sesje. Każda sesja jest identyfikowana ciągiem znaków (domyślnie jest to losowy, 32 znakowy łańcuch), który jest przechowywany w ciasteczku (<em>cookies</em>) lub przekazywany przez URL. Identyfikator sesji jest unikalny dla użytkownika, a więc osoba, która w nieładny sposób wejdzie w jego posiadanie, praktycznie wykrada tożsamość danego użytkownika w danej aplikacji (portalu, sklepie internetowym, blogu, portalu społecznościowym).</p>
<h1>Zagrożenia</h1>
<p>Jako że, ciasteczka, czyli mechanizm zapisu informacji w przeglądarce użytkownika przez aplikację internetową, są mechanizmem względnie bezpiecznym, projektanci aplikacji zawsze powinni wybierać ten sposób przechowywania identyfikatora sesji. Przekazywanie SESSID (<em>session id</em>) w url&#8217;u wystawia aplikację na zagrożenie atakiem <em>session fixation</em>.</p>
<p>Szkodnik, który przejmie naszą sesje, może poczynić spore spustoszenie w naszej przestrzeni systemu, od publikacji kompromitujących treści, poprzez dostęp do prywatnych danych, historii naszej działalności (np. zakupów), poprzez nawet wykonanie jakiś transakcji na nasze konto. Zagrożenia jakie za tym idą, są różne, ze względu na różne specyfiki aplikacji webowych.</p>
<h1>Co to jest <em>session fixation</em>?</h1>
<p><em>Session fixation</em> polega na podsunięciu użytkownikowi linku do atakowanej aplikacji z spreparowanym identyfikatorem sesji, który jest znany atakującemu. Jak to działa w praktyce? Przygotowujemy url w postaci http://moja.aplikacja?sekcja=profil&amp;SESSID=1234abcd1234abcd1234abcd1234abcd i sugerujemy użytkownikowi jego kliknięcie, posyłając np. emailem lub linkując go pod jakieś zdjęcie. Użytkownik wchodzi do atakowanej aplikacji. Jako, że korzysta z nowej sesji, loguje się do systemu i wykonuje jakieś operacje. Atakujący wchodzi do aplikacji z tego samego linka i ma do dyspozycji zalogowane konto, dzięki czemu może wykonać dowolne operacje w imieniu skompromitowanego użytkownika.</p>
<p>Ze względu na specyfikę tego ataku, często w sieci stosuje się inne określenie: <em>session riding</em>, ponieważ &#8222;jeździmy&#8221; na czyjejś sesji, gdzie uzyskano odpowiedni dostęp do systemu.</p>
<h1>Jak się bronić przed tym atakiem z punktu widzenia programisty?</h1>
<p>Metoda jest prosta i domyślnie włączona w nowych wersjach PHP. <strong>Nigdy</strong> nie powinno się  używać identyfikatora sesji przekazywanego przez URL! Aby to osiągnąć, można użyć następujących ustawień PHP (w pliku php.ini):<br />
<script src="https://gist.github.com/707179.js?file=php.ini"></script></p>
<p>Poza tym, powinniśmy regenerować id sesji przed logowaniami (metodą <em>session_regenerate_id</em>). Ostatnią rzeczą, która ochroni nas też przed innymi atakami, polegającymi na wyłudzeniu tożsamości, jest ponowne sprawdzenie hasła przed krytycznymi operacjami, takimi jak zmiana hasła, zmiana danych profilowych, usunięcie konta, czy dokonanie jakiejś sporej płatności. Tą metodę stosuje m.in. znany portal LinkedIn.</p>
<h1>Jak się bronić przed tym atakiem z punktu widzenia użytkownika aplikacji?</h1>
<p>Jako, że nie wiemy, czy aplikacja z której korzystamy jest podatna na tego typu ataki, powinniśmy zawsze ostrożnie korzystać z linków, które dostajemy z nieznanych źródeł. Jeśli jesteśmy zalogowani do portalu X, a za chwilę dostaniemy podejrzanie długi link, po wejściu na który znowu jesteśmy proszeni o hasło, to znaczy, że coś nie gra i należy się dwa razy zastanowić na dalszymi krokami.</p>
]]></content:encoded>
			<wfw:commentRss>http://xlab.pl/atak-session-fixation-czym-jest-i-jak-sie-przed-nim-bronic/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Dostęp do prywatnych właściwości obiektu z innego obiektu w PHP</title>
		<link>http://xlab.pl/dostep-do-prywatnych-wlasciwosci-obiektu-z-innego-obiektu-w-php/</link>
		<comments>http://xlab.pl/dostep-do-prywatnych-wlasciwosci-obiektu-z-innego-obiektu-w-php/#comments</comments>
		<pubDate>Tue, 16 Nov 2010 10:59:17 +0000</pubDate>
		<dc:creator>Wojtek Sznapka</dc:creator>
				<category><![CDATA[Programowanie PHP]]></category>
		<category><![CDATA[OOP]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[private]]></category>

		<guid isPermaLink="false">http://xlab.pl/?p=1602</guid>
		<description><![CDATA[PHP oferuje 3 modyfikatory dostępu do właściwości i metod: prywatne (private), chronione (protected) i publiczne (public). Właściwości i metody prywatne nie są dostępne z poza obiektu, jak również z metod obiektu dziedziczącego. Z jednym wyjątkiem&#8230; Mogą być pobierane/modyfikowane z poziomu metod obiektu, który jest instancją tej samej klasy. Więcej na ten temat w manualu: PHP manual [...]]]></description>
			<content:encoded><![CDATA[<p>PHP oferuje 3 modyfikatory dostępu do właściwości i metod: prywatne (<em>private</em>), chronione (<em>protected</em>) i publiczne (<em>public</em>). Właściwości i metody prywatne nie są dostępne z poza obiektu, jak również z metod obiektu dziedziczącego. Z jednym wyjątkiem&#8230; Mogą być pobierane/modyfikowane z poziomu metod obiektu, który jest instancją tej samej klasy. Więcej na ten temat w manualu: <a href="http://www.php.net/manual/en/language.oop5.visibility.php#language.oop5.visibility-other-objects">PHP manual</a><br />
<script src="https://gist.github.com/701303.js?file=privateVisibilityFromTheOtherObjects.php"></script></p>
<p>Jak widać, Foo::modifyProperty zmienił prywatną właściwość innego obiektu. Właściwie <em>type-hinting</em> nie jest tu wymagane, ale jego brak może wprowadzić wiele zamieszania :-)<br />
Pomimo, że PHP oferuje takie rozwiązanie, szczerze odradzam stosowanie go w codziennej praktyce&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://xlab.pl/dostep-do-prywatnych-wlasciwosci-obiektu-z-innego-obiektu-w-php/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Wywoływanie procedur składowanych MSSQL z poziomu PHP</title>
		<link>http://xlab.pl/wywolywanie-procedur-skladowanych-mssql-z-poziomu-php/</link>
		<comments>http://xlab.pl/wywolywanie-procedur-skladowanych-mssql-z-poziomu-php/#comments</comments>
		<pubDate>Mon, 05 Jul 2010 07:48:17 +0000</pubDate>
		<dc:creator>Wojtek Sznapka</dc:creator>
				<category><![CDATA[Programowanie PHP]]></category>
		<category><![CDATA[mssql]]></category>
		<category><![CDATA[pdo]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[sql server]]></category>

		<guid isPermaLink="false">http://xlab.pl/?p=1492</guid>
		<description><![CDATA[Pracując z bazą MS SQL Server z poziomu aplikacji PHP prędzej czy później zajdzie potrzeba używacia procedur składowanych. Aby wywołać taką procedurę z poziomu PHP, należy posłużyć się biblioteką PDO, tak jak pokazano to poniżej: $conn = new PDO('dblib:host=127.0.0.1;dbname=database', 'user', 'pass'); $stmt = $conn-&#62;prepare("EXEC sp_SaveMagicNumber ?"); $stmt-&#62;bindValue(1, 5, PDO::PARAM_INT); $stmt-&#62;execute(); Kod z powyższego listingu wywoła [...]]]></description>
			<content:encoded><![CDATA[<p>Pracując z bazą MS SQL Server z poziomu aplikacji PHP prędzej czy później zajdzie potrzeba używacia procedur składowanych. Aby wywołać taką procedurę z poziomu PHP, należy posłużyć się biblioteką PDO, tak jak pokazano to poniżej:<span id="more-1492"></span></p>
<pre class="php" name="code">    $conn = new PDO('dblib:host=127.0.0.1;dbname=database', 'user', 'pass');
    $stmt = $conn-&gt;prepare("EXEC sp_SaveMagicNumber ?");
    $stmt-&gt;bindValue(1, 5, PDO::PARAM_INT);
    $stmt-&gt;execute();</pre>
<p>Kod z powyższego listingu wywoła procedurę sp_SaveMagicNumber z parameterem 5. Jeśli używamy symfony wraz z Doctrine, możemy (a nawet powinniśmy) zamienić pierwszą linijkę na:</p>
<pre class="php" name="code">    $conn = Doctrine_Manager::getInstance()-&gt;getConnection();</pre>
<p>Można też przekazywać parametry jako &#8222;placeholdery&#8221;, jak na listingu poniżej:</p>
<pre class="php" name="code">    $conn = Doctrine_Manager::getInstance()-&gt;getConnection();
    $stmt = $conn-&gt;prepare("EXEC sp_IntroduceYourself :name, :surname");
    $stmt-&gt;bindValue(':surname', 'Sznapka', PDO::PARAM_STR);
    $stmt-&gt;bindValue(':name', 'Wojtek', PDO::PARAM_STR);
    $stmt-&gt;execute();</pre>
<p>Ostatnim punktem programu są parametry typu OUTPUT, czyli zwracające wartości z procedury składowanej (podobnie jak parametry funkcji PHP przekazywanych przez referencję). Niestety biblioteka PDO posiada błąd, który uniemożliwia poprawne działanie metod z takimi parametrami. W idealnym przypadku, jeśli parametr w MSSQL jest zdefiniowany jako OUTPUT powinniśmy go dostać następujący sposób:</p>
<pre class="php" name="code">    $conn = Doctrine_Manager::getInstance()-&gt;getConnection();
    $stmt = $conn-&gt;prepare("EXEC sp_GetCountry :city, :country OUTPUT");
    $stmt-&gt;bindValue(':city', 'Gliwice', PDO::PARAM_STR);
    $country = NULL;
    $stmt-&gt;bindParam(':country', $country, PDO::PARAM_STR | PDO::PARAM_INPUT_OUTPUT);
    $stmt-&gt;execute();
    printf("Dla miasta %s procedura zwraca kraj %s", $city, country);</pre>
<p>Niestety pomimo wielu prób, nie udało się obejść tego błędu i na chwilę obecną wygląda na to, że nie ma sposobu na pozyskiwanie parametrów typu OUTPUT z procedur składowanych MSSQL. Podobne problemy można spotkać na bugtrackerze PHP: http://bugs.php.net/bug.php?id=50555</p>
]]></content:encoded>
			<wfw:commentRss>http://xlab.pl/wywolywanie-procedur-skladowanych-mssql-z-poziomu-php/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

