Etykiety

linux (14) php (14) Laravel (9) mysql (9) Hardware (8) Windows (6) sieci (5) PowerShell (4) software (4) MariaDB (3) apache (3) html (3) Microsoft (2) bezpieczeństwo LAN (2) cygwin (2) Akcesoria (1) CMS (1) Laptop (1) Open Office (1) drupal 7 (1) gpg (1) hosting (1) jquery (1) sieci LAN (1) xml (1) zabezpieczenie sieci LAN (1)

piątek, 28 kwietnia 2017

Ataki hakerskie. Jak się chronić?

Bezpieczeństwo IT jest dziś pojęciem bardzo ogólnym, odnoszącym się do metod stosowanych w celu zapewnienia ochrony przed nieautoryzowanym dostępem zarówno do mediów sieciowych jak i urządzeń należących do danej infrastruktury informatycznej.

Chciałbym już na wstępie tego artykułu zaznaczyć, że w praktyce żaden produkcyjny system informatyczny nie jest dziś zupełnie bezpieczny. Pełne bezpieczeństwo nie jest w tej dziedzinie możliwe do osiągnięcia. Nawet najwyższej klasy sprzętowe firewalle i inne podobne urządzenia, jakie są dziś stosowane w bankach i podobnych instytucjach, nie są w stanie zapewnić pełnego bezpieczeństwa. Dlaczego? Otóż dlatego, że całkowicie bezpieczny system nie był by funkcjonalny, a ochrona systemów informatycznych to dynamiczny proces, w którym ma miejsce nie tylko wdrażanie zabezpieczeń, lecz także ciągły nadzór zdarzeń oraz podejmowanie odpowiednich kroków w przypadku wystąpienia zagrożeń.

Fundamentalne znaczenie ma zrozumienie iż przejęcie kontroli przez hakera nad jakimkolwiek z elementów będących częścią danej infrastruktury IT, oznacza w praktyce utratę kontroli nad całym systemem, co wymaga podjęcia natychmiastowych, przewidywanych przez politykę bezpieczeństwa informacji środków.

Polityka bezpieczeństwa informacji


Polityka bezpieczeństwa informacji jest podstawowym elementem bezpieczeństwa IT w instytucjach rządowych i prywatnych. Powinna ona zarówno uwzględniać wszystkie możliwe cele ataków, obecne w danej infrastrukturze IT, jak również przedstawiać metody ochrony przed uwzględnionymi w niej zagrożeniami. Polityka bezpieczeństwa powinna również zawierać wykaz procedur stosowanych w różnego rodzaju sytuacjach podwyższonego ryzyka. Polityka ta jest dziś owszem powszechnie stosowana w różnego rodzaju organizacjach, lecz w praktyce mała jest z niej korzyść, ponieważ użytkownicy na ogół jej nie przestrzegają. I tu mamy duży problem, ponieważ w kwestiach bezpieczeństwa IT na ogół nawala najsłabsze ogniwo, czyli człowiek. Dlatego właśnie tak bardzo skuteczne bywają hakerskie ataki socjotechniczne, czyli te, w których czynnik ludzki odgrywa kluczową rolę.

Hakerski framework Metasploit zawiera cały zestaw narzędzi, za pomocą których można w bardzo prosty sposób przeprowadzić złożone i bardzo efektowne ataki socjotechniczne, bez posiadania dogłębnej wiedzy w tej dziedzinie.

Metasploit
Metasploit

Jak się skutecznie chronić przed atakami hakerskimi? W tym zakresie mam zamiar udzielić czytelnikom kilka ważnych wskazówek. Ponieważ temat jest bardzo rozległy, w tym artykule ograniczę się dosłownie do kilku prostych porad, ponieważ w przeciwnym przypadku musiałbym napisać całą książkę, a na to wyzwanie nie jestem jeszcze gotowy.

Ponieważ najpopularniejszym dziś systemem operacyjnym jest rodzina produktów Windows, dla poniższych zaleceń zakładam taki właśnie scenariusz.

Bezpieczeństwo komputera


Zupełnie bezpieczny komputer do niczego by się nam nie przydał gdyż nie mógł by on przechowywać jakichkolwiek informacji, czy być częścią jakiejkolwiek sieci. Taki komputer musiałby być odpięty od sieci, wyłączony, a na dodatek zamknięty w sejfie, do którego nikt nie zna możliwości dostępu. Wówczas można by uznać taki komputer za zupełnie bezpieczny. Bezpieczny, ale oczywiście bezużyteczny.

Skoro w praktyce nie da się zapewnić stu procentowego bezpieczeństwa komputera, to jak w takim razie należy chronić tego typu sprzęt? W tym zakresie mogę udzielić kilku przydatnych wskazówek.

Bezpieczeństwo komputera – ochrona przed atakami z dostępem fizycznym


Komputer do którego haker może uzyskać dostęp fizyczny nie jest bezpieczny. Dlaczego? Otóż dlatego, że nawet jeśli system jest chroniony hasłem, to w dużej części przypadków można w prosty sposób takie hasło złamać, korzystając w tym celu z powszechnie dostępnego oprogramowania, takiego jak przykładowo Ophcrack. Haker, który uzyskał fizyczny dostęp do komputera, może uruchomić atakowaną maszynę z płyty CDROM lub z urządzenia USB z systemem Ophcrack bądź podobnym, pomijając wszelkie zabezpieczenia systemu Windows.

Łamanie haseł Windows - Ophcrack
Łamanie haseł Windows - Ophcrack

Ophcrack to oprogramowanie hakerskie, które umożliwia pozyskanie nazw użytkowników systemu Windows oraz skrótów NT ich haseł. Ponadto Ophcrack, na podstawie tęczowych tablic, jest w stanie odszyfrować skróty haseł i wyświetlić hakerowi ich postać jawną, która jest niezbędna do lokalnego zalogowania się do atakowanej maszyny. Jeśli hasło jest dość złożone, wówczas istnieje duże prawdopodobieństwo, że Opcrack nie poradzi sobie z nim tak szybko, a nawet w ogóle nie będzie w stanie wyliczyć jego postaci jawnej. Podczas gdy rozszyfrowanie prostych haseł zajmuje kilka-kilkanaście minut, to z bardziej złożonymi hasłami Ophcrack może sobie dość ciężko radzić, a niekiedy próba ich rozszyfrowania może zająć wiele godzin i dni, czasami nawet bez efektu. Pamiętajmy jednak, że nawet jeśli haker nie będzie w stanie zdobyć jawnej postaci pożądanego hasła, to aby zalogować się do atakowanej maszyny zdalnie, wystarczy mu informacja o nazwie użytkownika oraz o skrócie NT jego hasła. Posiadając te informacje haker może przykładowo skorzystać z narzędzia psexec pakietu frameworka hakerskiego Metaspoit, bądź z setek innych podobnych narzędzi dostępnych na różnych hakerskich portalach.

Metasploit
Metasploit

Jak więc chronić komputer przed atakami związanymi z nieautoryzowanym dostępem fizycznym? Otóż wyłączenie możliwości uruchamiania maszyny z innych mediów niż dysk z systemem Windows i ustawienie hasła dostępu do systemu BIOS to żadna ochrona, tylko lekkie utrudnienie, które można szybko ominąć wyciągając na chwilę bateryjkę CMOS w celu zresetowania ustawień BIOSa. Dość skuteczną ochronę przed tego typu atakami zapewni jednak szyfrowanie systemowego dysku za pomocą oprogramowania BitLocker. Aby w pełni cieszyć się z ogromnych możliwości jakie oferuje to oprogramowanie nasz sprzęt powinien być wyposażony w moduł TPM. Jednak można korzystać z oprogramowania BitLocker nawet w przypadku nie posiadania tego modułu jeśli administrator systemu na to pozwoli.

Szyfrowanie dysku - BitLocker

Uniemożliwi to łamanie haseł zapisanych w pliku SAM przy pomocy tęczowych tablic, lecz nie zapewni ochrony przed atakami brute-force. Jeśli hasła użytkowników są dość skomplikowane to metoda brute force raczej się nie powiedzie. Pamiętajmy jednak, że programy typu Ophcrack stają się dla hakera bezużyteczne w przypadku kont użytkowników logujących się do systemu za pomocą konta Microsoft, a także w przypadku kont domenowych, gdyż wówczas lokalny plik SAM nie zawiera ich haseł.

W skrócie poziom ochrony przed atakami lokalnymi można zwiększyć poprzez:
  • Wyłączenie w systemie BIOS możliwości bootowania maszyny z urządzeń USB i napędów optycznych oraz zastosowanie hasła dostępu do ustawień BIOS (utrudnienie);
  • Stosowanie kont Microsoft (Microsoft Account);
  • Stosowanie długich i złożonych haseł, zawierających duże i małe litery, cyfry oraz znaki specjalne;
  • Szyfrowanie dysku systemowego za pomocą oprogramowania BitLocker;


Bezpieczeństwo komputera: ataki zdalne


Najbardziej skuteczny rodzaj ataków zdalnych na komputery, czyli ataków przeprowadzanych przez sieć, to ataki socjotechniczne. Decydującym elementem w tego typu atakach jest człowiek, czyli najsłabsze ogniwo obrony, a strategia polega na skłonieniu ofiary do zrobienia czegoś, czego normalnie by nie zrobiła. Przykładem takiego ataku może być wysłanie do ofiary wiadomości email z przekonującą treścią oraz zainfekowanym załącznikiem, w który oczywiście ofiara kliknie, a wówczas z dużym prawdopodobieństwem hakerowi uda się przejąć kontrolę nad systemem.

Programy antywirusowe owszem zapobiegają wykonaniu podejrzanego kodu, lecz generalnie są skuteczne w przypadku znanych producentowi oprogramowania wirusów i trojanów, czyli tych które widnieją w bazie danych stosowanego programu. Dlatego, swoją drogą, zalecane jest regularne aktualizowanie bazy danych oprogramowania antywirusowego. Lecz to nie wszystko co należy zrobić by się przed tego typu atakami zabezpieczyć.

Zawodowi hakerzy są w stanie napisać wrogi kod na konkretne zlecenie. Kod ten nie zostanie wykryty przez większość programów antywirusowych, ponieważ nie będą one miały o nim żadnych informacji. Pomijając wyspecjalizowany kod, pisany przez zawodowców na zlecenie za dość duże pieniądze, prawda jest taka, że od pojawienia się nowego typu wirusa/trojana, mija co najmniej 2-3 tygodnie zanim producenci antywirusów uwzględnią go w swoich bazach danych. Co to wszystko oznacza? Oznacza to, że należy się w dodatkowy sposób chronić przed możliwością wykonania podejrzanego kodu na naszych komputerach. Jak to zrobić?

Dość wysoki poziom ochrony przed wykonywaniem podejrzanego kodu można uzyskać włączając w systemie Windows funkcję DEP – Data Execution Prevention.

Oto jak to zrobić:
  • Uruchomić eksplorator plików;
  • Trzymając myszkę nad ikonką Ten Komputer należy przycisnąć prawy klawisz myszki i wybrać Właściwości;
  • Z widniejącego w prawej części widoku menu należy wybrać Zaawansowane Ustawienia Systemu;
  • W zakładce Zaawansowane należy w sekcji Wydajność kliknąć w Ustawienia;
  • Należy wybrać zakładkę Zapobieganie Wykonywaniu Danych;
  • Włączyć ochronę DEP w odpowiednim trybie;


Jak ustawić funkcję DEP
Jak ustawić funkcję DEP


Jak ustawić funkcję DEP
Jak ustawić funkcję DEP

Zapora ogniowa systemu Windows stanowi dobrą ochronę przed wieloma rodzajami ataków z wykorzystaniem sieci. Oferuje ona bardzo dużo zaawansowanych ustawień. W większości przypadków dobry poziom ochrony zapewniają już standardowe ustawienia oprogramowania. Zapora powinna być zawsze włączona, ewentualnie pod kontrolą oprogramowania antywirusowego.

Poziom ochrony w zakresie wrogiego kodu można dodatkowo zwiększyć ograniczając możliwość uruchamiania przez użytkowników dowolnego oprogramowania. W tym celu należy skorzystać z przystawki Zasady Zabezpieczeń Lokalnych secpol.msc, definiując odpowiednie reguły zabezpieczeń w ustawieniach Zasady Ograniczeń Oprogramowania. Na stronach Technet Microsoft można znaleźć szczegółowe instrukcje o tym jak to zrobić.

Zasady oprogramowania umożliwiają sporą kontrolę nad tym co jest w systemie uruchamiane. Jednak są to ustawienia bardzo rygorystyczne. O ile wprowadzenie zasad oprogramowania w wielu przedsiębiorstwach napotyka się na duży opór ze strony użytkowników, o tyle w warunkach domowych ograniczenia tego typy przeważnie zupełnie tracą sens, chyba że korzystamy z kilku ulubionych programów i nie zamierzamy niczego innego uruchamiać.

Zasady zapezpieczeń lokalnych
Zasady zapezpieczeń lokalnych

Innym rodzajem ataków zdalnych są ataki sieciowe, wykorzystujące luki bezpieczeństwa w oprogramowaniu ofiary. Są to bardzo powszechne ataki, ze względu na prostotę ich przeprowadzania. Hakerski framework Metasploit zawiera cały zestaw narzędzi i modułów umożliwiających przeprowadzanie tego typu ataków bez konieczności posiadania gruntownej wiedzy informatycznej. Jak to działa? Otóż od momentu otrzymania przez producenta oprogramowania informacji o potencjalnym problemie do chwili pojawienia się poprawek zawartych w aktualizacjach mija przeważnie wiele miesięcy. Okres ten może być krótszy w przypadku bardzo poważnych problemów, które stanowią realne zagrożenie. Informacje o lukach bezpieczeństwa w oprogramowaniu są publicznie dostępne. Jeśli chodzi o system Windows 10 to całą listę problemów mamy tutaj: https://www.cvedetails.com/vulnerability-list/vendor_id-26/product_id-32238/Microsoft-Windows-10.html

Na podstawie publicznie dostępnych informacji o lukach powstają odpowiednie moduły frameworków Hakerskich. W szczegółowych informacjach publicznych o danym problemie technicznym można się dowiedzieć, między innymi, czy został już opracowany związany z nim moduł frameworka Metasploit. Niekiedy jednak jest tak, że hakerzy tworzą własny kod, jeszcze przed pojawieniem się publicznych informacji o danej luce. Są bowiem tacy zawodowi hakerzy, którym wcale nie zależy na nagłośnieniu problemu, lecz bardziej na wykorzystaniu istniejącej luki w celu osiągnięcia zysku.

W skrócie poziom ochrony przed atakami zdalnymi można znacznie zwiększyć poprzez:
  • Korzystanie tylko z najnowszych wersji oprogramowania;
  • Stosowanie sprawdzonego oprogramowania antywirusowego z zawsze aktualną bazą wirusów;
  • Włączenie odpowiedniego poziomu ochrony DEP;
  • Stosowanie lokalnych zasad oprogramowania;
  • Stosowanie zapory ogniowej systemu Windows;

Jak działa typowy atak hakerski

Film przedstawia przebieg typowego ataku hakerskiego.



Bezpieczeństwo IT – monitorowanie aktywności podstawą bezpieczeństwa


Żadne z opisanych wcześniej zaleceń nie zapewni długoterminowej ochrony systemu, jeśli pominiemy fundamentalną część polityki bezpieczeństwa, związaną z monitorowaniem aktywności w sieci i w samym systemie. Warto zapoznać się w tym celu z możliwościami jakie oferują zaawansowane dzienniki systemu Windows oraz z oprogramowaniem służącym do monitorowania ruchu w sieci. Gorąco polecam program WireShark, którego jestem zwolennikiem od wielu lat. Ciekawe narzędzia umożliwiające dokładny nadzór procesów można znaleźć w darmowym pakiecie Microsoft SysInternal Suite.

A więc zaglądajmy do dzienników systemu Windows i monitorujmy procesy oraz ruch w sieci. Gdy już będziemy mieli w tym wprawę, będziemy w stanie dostrzec zagrożenia, które często pozostają niezauważane przez powszechne oprogramowanie mające na celu chronić system.

Podsumowanie


Mam nadzieję, że powyższe wskazówki okażą się czytelnikom przydatne. Są to jednak podstawowe porady, dotyczące samego komputera. Pamiętajmy, że komputery są jednak częścią sieci, w których ważną rolę odgrywają także inne urządzenia, takie jak routery, switche, access pointy i tym podobne. Należy więc pamiętać również o tych urządzeniach i odpowiednio je zabezpieczyć. O tym jak to zrobić postaram się napisać innym razem.
Jeśli są jakieś pytania lub wątpliwości, lub ktoś pragnie się podzielić własną wiedzą w tym zakresie, bardzo proszę o komentarze.

poniedziałek, 24 kwietnia 2017

PHP a połączenie z serwerem MySQL

Php i MySQL stanowią podstawę funkcjonalności większości rozbudowanych aplikacji web oraz firmowych witryn internetowych. Każdy zawodowy twórca aplikacji web dobrze wie jak ważny jest wybór odpowiedniej platformy bazodanowej dla swoich projektów. Kluczowe znaczenie w tym zakresie ma także sposób łączenia się z serwerem baz danych z poziomu skryptów php, tak aby interakcja użytkowników z tabelami danych była efektywna i nie stanowiła zagrożeń.

PHP a połączenie z serwerem MySQL
PHP a połączenie z serwerem MySQL

Z poziomu skryptów php można ustanowić połączenie z serwerem bazodanowym MySQL na kilka sposobów. W tym artykule postaram się omówić zalety i wady każdej z tych metod. Przedstawię również porównanie podstawowych cech każdego z tych rozwiązań.

W celach dydaktycznych przygotowałem kilka przykładowych skryptów, które pojawiają się w tym artykule. Jeśli któryś z czytelników będzie miał ochotę przetestować ich działanie, do czego oczywiście gorąco zachęcam, dołączam wspólny fragment skryptów, zawierający zmienne dotyczące nazwy hosta, użytkownika, hasła i nazwy bazy danych, które należy ustawić w pierwszych liniach kodu wedle własnych potrzeb:

$host = 'localhost' ; // nazwa hosta $user = 'uzytkownik' ; // użytkownik $password = 'haslo' ; // hasło $db = 'bazadanych '; // baza danych

Z góry zaznaczam, że zawarte w artykule skrypty mają charakter czysto szkoleniowy i nie są opatrzone w zabezpieczenia charakterystyczne dla środowisk produkcyjnych.

Połączenie z serwerem MySQL za pomocą funkcji mysql_connect() - nie stosować


Łączenie się z serwerem MySQL za pomocą funkcji php mysql_connect() to na dziś dzień już archaiczny sposób uzyskania tego typu połączenia z poziomu skryptu php. Niestety spora ilość nieświadomych entuzjastów proceduralnego PHP wciąż z niego korzysta. Poniżej przedstawiony szkoleniowy skrypt php jest prostym przykładem użycia funkcji mysql_connect(). Skrypt ustanawia połączenie z serwerem, wybiera bazę danych oraz wykonuje prostą kwerendę dopasowującą użytkownika i hasło. Tego typu procedura bywa często stosowana w celach związanych z uwierzytelnianiem:

$conn = mysql_connect($host, $user, $password); if (!$conn) { die('Nie połączono: ' . mysql_error()); } $db = mysql_select_db($db, $conn); if (!$db) { die ('Nie można wybrać bazy danych: ' . mysql_error()); } $query = sprintf("SELECT * FROM users WHERE login='%s' AND pwd='%s'", mysql_real_escape_string($login), mysql_real_escape_string($pwd));

Metoda ta, choć dziś raczej przestarzała, ma jedną wielką zaletę, a mianowicie stanowi świetny materiał historyczno-szkoleniowy dla początkujących programistów. Czemu? Otoż zapoznanie się ze starymi metodami ochrony przed atakami sql-injection może nie tylko okazać się niemałą ciekawostką, lecz może być bardzo przydatne w zrozumieniu natury tych ataków. Metoda ta ma bowiem jedną poważną wadę: nie udostępnia bezpośrednio narzędzi programistycznych chroniących przed atakami typu sql-injection, przez co jej stosowanie w środowisku produkcyjnym a priori odpada. Programista musi tutaj zawsze pamiętać o zabezpieczaniu serwera MySQL poprzez funkcje mysql_real_escape_string(), co może okazać się bardzo uciążliwe, a zarazem nie zupełnie skuteczne, szczególnie przy dużej ilości kodu związanego z zapytaniami. Kolejną wadą tej funkcji jest konieczność stosowania proceduralnego kodu, co samo w sobie stanowi wielką przeszkodę w tworzeniu profesjonalnych rozwiązań.

Połączenie z serwerem MySQL za pomocą klasy PDO


Stosowanie klasy PDO w celu łączenia się z serwerem MySQL z poziomu php gwarantuje ochronę przed atakami typu sql-injection, pod warunkiem stosowania metod tej klasy zgodnie z zaleceniami podręcznika. Metody klasy PDO są łatwe do zrozumienia i bardzo proste w użyciu. Duża elastyczność tej klasy względem obsługi różnorodnych serwerów baz danych, możliwość bezpiecznego wiązania parametrów zapytań z określeniem typu parametru PDO oraz szybkość działania metod, mogą być decydującymi argumentami w kwestii wyboru odpowiedniej opcji dla projektowanej aplikacji.

Możliwość obsługi serwera bazodanowego innego niż MySQL to mocny atut elastyczności, umożliwiający generalnie bezproblemową migrację serwera bazy danych, bez konieczności dużych ingerencji w kod php aplikacji klienckiej. Głównie ze względu na tą cechę moim wyborem, szczególnie w przypadku złożonych aplikacji php, jest zawsze PDO.

Na chwilę obecną klasa php PDO wspiera sterowniki obsługujące następujące serwery bazodanowe:
  • CUBRID
  • MS SQL Server
  • Firebird
  • IBM
  • Informix
  • MySQL
  • MS SQL Server
  • Oracle
  • ODBC i DB2
  • PostgreSQL
  • SQLite
  • 4D

Jedynym mankamentem klasy PDO, oczywiście jeśli można taką cechę uznać za mankament, jest brak proceduralnego API, co może być sporym utrudnieniem dla początkujących programistów. Aby korzystać z klasy PDO programista musi mieć doświadczenie z programowaniem obiektowym. Jednak stabilność i elastyczność działania miewają przeważnie swoją cenę, a ewentualny wkład w naukę programowania obiektowego ze strony nowicjuszy php pragnących rozpocząć przygodę z PDO przyniesie tak czy inaczej ogromną satysfakcję i wielkie korzyści.

Poniżej przedstawiam typowy skrypt php wykorzystujący klasę PDO do nawiązania połączenia z bazą danych serwera MySQL w celu zapisania prostego wiersza danych do tabeli. Zobaczmy jak to się robi obiektowo za pomocą metod klasy PDO:

// ## Połączenie php PDO MySql i prosty zapis wiersza danych try { $conn = new \PDO("mysql:host={$host};dbname={$db}", $user, $password, array( PDO::MYSQL_ATTR_INIT_COMMAND=>"SET NAMES utf8", PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION ) ); $stm = $conn->prepare("insert into kontrahenci (imie, nazwisko, kodKraju) values (:imie, :nazwisko, :kodKraju) "); $stm->bindValue(':imie', $_POST['imie'], PDO::PARAM_STR); $stm->bindValue(':nazwisko', $_POST['nazwisko'], PDO::PARAM_STR); $stm->bindValue(':kodKraju', $_POST['kodKraju'], PDO::PARAM_INT); $stm->execute(); } catch (PDOException $e) { echo "Wystąpił błąd PDO"; }


Połączenie z serwerem MySQL za pomocą MySQLi


MySQLi jest nie tylko świetnym rozwiązaniem dla początkujących programistów, ze względu na możliwość wyboru zarówno obiektowego jak i proceduralnego API, ale zapewnia optymalną ochronę przed atakami sql-injection, podobnie do klasy PDO. Kolejnym atutem MySQLi jest jego szybkość i w tym zakresie MySQLi ma przewagę nad PDO. Niestety MySQLi jest o wiele trudniejsze do opanowania niż PDO. Dodatkowym mankamentem, w przeciwieństwie do możliwości jakie oferuje klasa PDO, jest tutaj brak możliwości wiązania parametrów zapytań po nazwach. Przykładowy skrypt pokazuje jak nawiązać połączenie korzystając z MySQLi w zakresie API obiektowego oraz jak wygląda tutaj kwestia wiązania parametrów kwerend:

mysqli_report(MYSQLI_REPORT_STRICT); try { $conn = new mysqli($host, $user, $password, $db) ; $stm = $conn->prepare(" insert into kontrahenci (imie, nazwisko, kodKraju) values (?, ?, ?) "); $stm->bind_param('Jan', 'Kowalski', 1); $stm->execute(); } catch (Exception $e ) { echo "Wystąpił błąd Mysqli"; exit; }


Co wybrać


Najlepszy wybór zazwyczaj wywodzi się z doświadczenia. Aby jednak czytelnikom ułatwić zrozumienie generalnych możliwości każdego z omawianych tutaj rozwiązań, przygotowałem poniższą tabelę:
Porównanie cech mysql_connect(), PDO oraz MySQLi
Cecha mysql_connect() PDO MySQLi
Ochrona przed sql-injection NIE TAK  TAK 
Styl proceduralny  TAK  NIE  TAK
 Styl obiektowy NIE  TAK  TAK 
Różne sterowniki (nie tylko MySQL) NIE  TAK NIE
 Wartości parametrów po nazwie NIE  TAK  NIE 
 Łatwość użytkowania TAK  TAK  NIE 
 Przygotowywanie zapytań po stronie klienta NIE  TAK  NIE 
 Przygotowywanie zapytań po stronie serwera NIE  TAK  TAK 
 PHP 5.x TAK  TAK  TAK 
 PHP 7.x NIE  TAK  TAK 


Test szybkości kwerend oraz kody php


Osoby pragnące sprawdzić szybkość działania opisanych tutaj rozwiązań, zachęcam do przetestowania mojego skryptu, który mierzy czas wykonania dowolnej kwerendy oraz czas wykonania kodu php odpowiedzialnego za nawiązanie połączenia z serwerem, ustawienie bazy danych, wykonanie zapytania i zwrócenie wyników w 3 omawianych wariantach łączenia się z serwerem MySQL:

// Porównanie szybkości odczytu danych z serwera MySQL // dla mysql_connect(), PDO oraz MySQLi // Autor: informatyka-porady.blogspot.com // Licencja: friko // // Tutaj należy ustawić odpowiednie dla własnego serwera wartości $host = ""; // np. localhost lub 127.0.0.1 $user = ""; $password = ""; $db = ""; echo "<pre>"; // Kwerenda odczytu lub zapisu danych bez wiązania parametrów zapytania // Można klasycznie użyć np. "SELECT BENCHMARK(1000000,ENCODE('hello',RAND()))" // Lub zastosować dowolną kwerendę... // W celach testowych warto wyłączyć caching // Stosując w kwerendach frazę SQL_NO_CACHE: np. "SELECT SQL_NO_CACHE * from abc" $query = ""; // mysql_connect() $time_start = microtime(true); $easyconn = mysql_connect($host, $user, $password); if (!$easyconn) { die('Nie udało się nawiązać połączenia: ' . mysql_error()); } $easyconn_db = mysql_select_db($db, $easyconn); if (!$easyconn_db) { die ('Nie można wybrać bazy danych: ' . mysql_error()); } mysql_query('set profiling=1'); mysql_query($query); $q = mysql_query('show profiles'); $result = mysql_fetch_assoc($q); $time_end = microtime(true); echo "Połączenie mysql_connect(). Czas wykonania zapytania: ".$result['Duration']."\n"; echo "Czas wykonania skryptu php zapytania sql:".(($time_end - $time_start)/60)."\n\n"; $easyconn = null; try { // PDO $time_start = microtime(true); $conn = new \PDO("mysql:host={$host};dbname={$db}", $user, $password, array( PDO::MYSQL_ATTR_INIT_COMMAND=>"SET NAMES utf8", PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION ) ); $conn->query('set profiling=1'); $conn->query($query); $data = $conn->query('show profiles'); $result = $data->fetchAll(PDO::FETCH_ASSOC); $time_end = microtime(true); echo "Połączenie PDO. Czas wykonania zapytania:".$result[0]['Duration']."\n"; echo "Czas wykonania skryptu php zapytania sql:".(($time_end - $time_start)/60)."\n\n"; $conn = null; // MySQLi mysqli_report(MYSQLI_REPORT_STRICT); $time_start = microtime(true); $conn = new mysqli($host, $user, $password, $db) ; $conn->query('set profiling=1'); $conn->query($query); $data = $conn->query('show profiles'); $result = $data->fetch_assoc(); $time_end = microtime(true); echo "Połączenie MySQLi. Czas wykonania zapytania:".$result['Duration']."\n"; echo "Czas wykonania skryptu php zapytania sql:".(($time_end - $time_start)/60)."\n\n"; $conn = null; } catch (PDOException $e) { echo "Nie udało się nawiązać połączenia PDO"; } echo "</pre>";

Na moim serwerze wykonanie powyższego skryptu z zapytaniem SQL

SELECT BENCHMARK(1000000,ENCODE('hello',RAND()))

poskutowało wyświetleniem poniżej przedstawionych wyników:

Połączenie mysql_connect(). Czas wykonania zapytania: 17.36685392 Czas wykonania skryptu php zapytania sql:0.28945664962133 Połączenie PDO. Czas wykonania zapytania:17.36803179 Czas wykonania skryptu php zapytania sql:0.28948030074437 Połączenie MySQLi. Czas wykonania zapytania:17.38116807 Czas wykonania skryptu php zapytania sql:0.28969765106837

A więc MySQLi okazało się najbardziej powolne :-)

Czy któryś z czytelników zna inny sposób na wykonanie tego typu testów, oczywiście z poziomu skryptu PHP? Jeśli tak, to będę wdzięczny za komentarze.

poniedziałek, 17 kwietnia 2017

Serwis Lenovo: uszkodzenie mechaniczne laptopa

W połowie zeszłego roku zdecydowałem się na zakup laptopa dla graczy Lenovo Y700-17. Laptop sprawował się świetnie przez wiele miesięcy, lecz w lutym tego roku sprzęt zdecydowanie zaczął odmawiać posłuszeństwa. Niedowierzając w to, że praktycznie nowy i mało używany sprzęt za ponad 4000 zł mógł się tak szybko popsuć, postanowiłem spróbować przywrócić system Windows 10, lecz okazało się to niemożliwe do wykonania ze względu na problemy z zapisem danych na dysk.



Laptop Lenovo na gwarancji


Ponieważ najwidoczniej dysk twardy uległ awarii, oddałem laptopa do serwisu Saturn - gdzie sprzęt został zakupiony – w celu dokonania naprawy gwarancyjnej.

Serwis Lenovo: bardzo negatywne opinie klientów!


Dlaczego jednak oddałem sprzęt do punktu serwisowego Saturn, zamiast wysłać go bezpośrednio do serwisu Lenovo, co teoretycznie znacznie przyśpieszyłoby przebieg procedury? Otóż szukając w sieci informacji o serwisie Lenovo i sposobie załatwienia procedury reklamacyjnej, natknąłem się na sporą ilość bardzo negatywnych opinii osób, które oddały sprzęt Lenovo do autoryzowanego serwisu w ramach gwarancji. Na podstawie komentarzy i opinii znajdujących się w sieci, serwis Lenovo rzekomo słynie z odmawiania naprawy gwarancyjnej z powodu tak zwanego "uszkodzenia mechanicznego". Po zapoznaniu się z treścią licznych negatywnych opinii dotyczących autoryzowanego serwisu Lenovo, znajdujących się nie tylko na różnych portalach społecznościowych, lecz także na kilku znanych forach prawnych, zdecydowałem się oddać sprzęt do serwisu Saturn aby uzyskać niezależne od autoryzowanego serwisu Lenovo pisemne potwierdzenie – w postaci protokołu przyjęcia sprzętu do naprawy - braku widocznych usterek mechanicznych w moim laptopie. Mój laptop nie był nawet lekko zarysowany i wolałem uzyskać pisemne i niezależne potwierdzenie takiego stanu rzeczy! Na wszelki wypadek, po przeczytaniu komentarzy osób, które postanowiły złożyć sądowy pozew przeciwko autoryzowanemu serwisowi Lenovo, postanowiłem się z góry dobrze zabezpieczyć przed niemiłymi niespodziankami.

Prawnie istotne potwierdzenie stanu sprzętu: protokół przyjęcia do naprawy


Pracownik serwisu Saturn dokładnie obejrzał sprzęt, po czym sporządził protokół przyjęcia reklamacyjnego, na którym mi zależało i który przedstawiam poniżej:

Protokół przyjęcia sprzętu do naprawy gwarancyjnej
Protokół przyjęcia sprzętu do naprawy gwarancyjnej


Serwis Lenovo: uszkodzenie mechaniczne!


Serwis Saturn oczywiście przekazał laptop do serwisu producenta po czym – ku mojemu kompletnemu zaskoczeniu – ze strony serwisu Lenovo otrzymałem odmowę naprawy gwarancyjnej! Oczywiście powodem było... uszkodzenie mechaniczne! Serwis Lenovo przygotował wycenę naprawy i skrupulatnie załączył dowody uszkodzenia mechanicznego w postaci kilku zdjęć. Żadnego uszkodzenia tego typu oczywiście nie było w chwili przekazania laptopa do punktu serwisowego Saturn. Gdybym wiedział o istnieniu jakiegokolwiek uszkodzenia mechanicznego, to skorzystał bym z góry z ochrony G-Max, którą wykupiłem wraz z laptopem i za którą słono zapłaciłem, bo ponad 700zł. Oto dokumentacja, którą otrzymałem ze serwisu Lenovo za pośrednictwem firmy Saturn:

Uszkodzenie mechaniczne którego wcześniej nie było
Uszkodzenie mechaniczne którego wcześniej nie było

Uszkodzenie mechaniczne którego wcześniej nie było
Uszkodzenie mechaniczne którego wcześniej nie było
Panowie serwisanci Lenovo zdejmują klawisze i szukają cieczy!
Panowie serwisanci Lenovo zdejmują klawisze i szukają cieczy!

Sprzęt na gwarancji: wycena naprawy z powodu uszkodzenia mechanicznego!
Sprzęt na gwarancji: wycena naprawy z powodu uszkodzenia mechanicznego!


Walka z wiatrakami


Skoro serwis Saturn wystawił protokół przyjęcia sprzętu, w którym nie było mowy o jakichkolwiek uszkodzeniach mechanicznych, to skąd nagle wzięły się uszkodzenia udokumentowane przez serwis Lenovo? Ktoś najwidoczniej musiał przyczynić się do ich powstania! Skoro jednak sprzęt przekazałem osobiście do serwisu Saturn, to właśnie ta firma była prawnie odpowiedzialna za jakiekolwiek niezgodności sprzętu z opisem widniejącym w protokole przyjęcia sprzętu do naprawy. Próbowałem wyjaśnić okoliczności powstania uszkodzeń mechanicznych dzwoniąc, pisząc i kilkakrotnie udając się osobiście do punktu serwisowego Saturn. Moje wysiłki w tym kierunku poszły jednak na marne. Dodam jeszcze, że jedna z konsultantek telefonicznych firmy Saturn próbowała mnie nakłonić do skorzystania z wykopionej ochrony G-Max w celu załatwienia całej sprawy w prosty sposób. Ani firma Saturn, ani autoryzowany serwis Lenovo nie czuli się odpowiedzialni za powstałe uszkodzenia mechaniczne.

Adwokat i magiczna naprawa sprzętu w ramach gwarancji


Czując się nieco bezsilnie i niezręcznie w zaistniałej sytuacji, postanowiłem przestać walczyć z wiatrakami i udać się do dobrego adwokata. Adwokat do którego się wybrałem, uznając ewentualny proces w Sądzie z góry za wygrany, wysłał do firmy Saturn krótkie i zwięzłe pismo, za co zapłaciłem około 200zł, po czym - jakby w skutek magicznego zaklęcia - otrzymałem od serwisu Lenovo informację, iż zgłoszenie reklamacyjne zostało zrealizowane. Poniżej przedstawiam potwierdzenie wykonania bezpłatnej naprawy gwarancyjnej. Na dokumentacji widnieje również informacja o wykupionej przeze mnie ochronie G-Max, z której jednak nie miałem powodu korzystać, skoro uszkodzenia powstały po oddaniu sprzętu do naprawy!

Sprzęt Lenovo naprawiony bezpłatnie
Sprzęt Lenovo naprawiony bezpłatnie

Można jednak zauważyć, iż naprawa gwarancyjna nie objęła wszystkich elementów znajdujących się we wcześniejszym kosztorysie serwisu Lenovo. Nie dość, że sposób powstania uszkodzeń mechanicznych pozostaje do dziś niewyjaśniony - winni są prawdopodobnie pracownicy Saturn, kurierzy, bądź serwisanci Lenovo, to najwidoczniej wstępna wycena naprawy okazała się zwykłym naciąganiem klienta na wydatki, skoro naprawę udało się wykonać o wiele niższym kosztem!

Na dodatek panowie serwisanci zgubili gdzieś klawisz, o którym mowa w protokole przyjęcia sprzętu i który dołączyłem z prośbą o przymocowanie, wraz z jego elementami mocującymi.

Czy ktoś z Was ma podobne doświadczenie?


Jeśli ktoś z Was ma podobne doświadczenie z serwisem Lenovo to bardzo proszę o komentarze. Nie dajmy się naciągać na bezpodstawne koszty!