najlepsze praktyki dotyczące bezpieczeństwa PHP

 przewodnik dotyczący bezpieczeństwa php

ponieważ PHP jest podstawą prawie każdej witryny, bezpieczeństwo PHP nie powinno być uważane za nieistotne za wszelką cenę. Jednak programiści PHP mają przywilej Unikania typowych zagrożeń, takich jak fałszowanie żądań między witrynami, zastrzyki SQL i manipulowanie danymi. A wszystko to przydaje się dzięki wbudowanym funkcjom zabezpieczeń PHP, które ułatwiają programistom ochronę witryny.

PHP jest uważany za najpotężniejszy język po stronie serwera, PHP wykorzystuje 80 procent światowej sieci, z 10 milionami najlepszych domen. Z tego powodu należy zrozumieć, że PHP pomoże Ci chronić się przed atakami.

zabezpieczenie aplikacji internetowych przed wszelkiego rodzaju sfałszowanymi próbami ataku jest ostatecznym obowiązkiem programisty stron internetowych. Powinieneś zbudować aplikacje internetowe na tyle ochronne, aby nie mieć problemów z bezpieczeństwem ani luk.

PHP jest najczęściej używanym językiem programowania po stronie serwera na całym świecie. Różne aplikacje PHP dzielą różne części kodu i skryptów z innymi aplikacjami internetowymi. W przypadku wykrycia luki w udostępnionym fragmencie kodu, wszystkie aplikacje korzystające z tego udostępnionego fragmentu kodu są narażone na ryzyko i uważane za luki.

Chroń swoje aplikacje w chmurze

Cloudways oferuje 2FA, bezpłatny SSL i bardziej zaawansowane funkcje bezpieczeństwa na zarządzanych serwerach, które zapewniają bezpieczeństwo aplikacji.

PHP jest najbardziej krytykowanym językiem skryptowym, jeśli chodzi o bezpieczeństwo. Duża część programistów i ekspertów QA uważa, że PHP nie ma solidnych technik zabezpieczania aplikacji. Werdykt ma też pewne podstawy, ponieważ PHP jest najstarszym i powszechnie używanym językiem do tworzenia aplikacji internetowych. Ale przez długi czas od PHP 5.6, nie widzieliśmy żadnych większych aktualizacji dotyczących bezpieczeństwa i dlatego język boryka się z pewnymi problemami bezpieczeństwa.

jak bezpieczne jest PHP

PHP jest tak samo bezpieczne jak każdy inny ważny język. PHP jest tak bezpieczne, jak każdy większy język po stronie serwera. Dzięki nowym frameworkom i narzędziom PHP wprowadzonym w ciągu ostatnich kilku lat zarządzanie najwyższej klasy zabezpieczeniami jest teraz łatwiejsze niż kiedykolwiek.

jeśli zrobimy porównanie PHP jest równomiernie zabezpieczone. Rails, Java, Javascript i inne języki, wszystkie miały swoje luki na przestrzeni lat. „Jeśli znajdziesz język, który nie miał luki w jakimś kształcie lub formie, możesz napisać bezpieczny kod w PHP doskonale.

problemy z bezpieczeństwem w PHP CMS

popularne CMS, takie jak WordPress, Joomla, Magento i Drupal są zbudowane w PHP i według Sucuri, większość luk w PHP CMS wyszła na jaw w ciągu roku 2017:

  • problemy z bezpieczeństwem WordPress wzrosły z 74% w 2016 Q3 do 83% w 2017.
  • problemy z bezpieczeństwem Joomla spadły z 17% w trzecim kwartale 2016 r.do 13,1% w 2017 r.
  • kwestie bezpieczeństwa Magento nieznacznie wzrosły z 6% W trzecim kwartale 2016 r.do 6,5% w 2017 r.
  • problemy z bezpieczeństwem Drupala nieznacznie spadły z 2% w trzecim kwartale 2016 r.do 1,6% w 2017 r.

porównanie infekcji cms

porównanie infekcji cms

obecna sytuacja nie jest wystarczająco dobra, ale dzięki współpracownikom open source, którzy starają się przezwyciężyć problemy i widzieliśmy kilka drastycznych zmian w PHP ostatnio. PHP 7.x został uruchomiony w zeszłym roku z różnymi aktualizacjami i poprawkami. The best thing about PHP 7.x odnosi się do aktualizacji zabezpieczeń, które naprawdę zmieniły protokół bezpieczeństwa języka.

co zawiera ten poradnik bezpieczeństwa PHP?

od bardzo dawna pracuję nad bezpieczeństwem i wydajnością PHP, będąc bardzo aktywnym w społeczności PHP, pytając najlepszych programistów o porady i sztuczki, których używają w swoich projektach na żywo. Dlatego głównym celem tego kursu bezpieczeństwa PHP jest zapoznanie Cię z najlepszymi praktykami bezpieczeństwa w aplikacjach internetowych PHP. Będę definiował następujące problemy i wymieniał możliwe rozwiązania dla nich.

  • regularnie aktualizuj PHP
  • Cross Site scripting (XSS)
  • ataki SQL Injection
  • Cross Site request forgery XSRF/CSRF
  • Przechwytywanie sesji
  • Ukryj pliki z przeglądarki
  • bezpiecznie przesyłaj pliki
  • używaj certyfikatów SSL dla https
  • wdrażaj aplikacje PHP w chmurach

uwaga: nie traktuj tego jako kompletnej ściągawki. Muszą istnieć lepsze sposoby i bardziej unikalne rozwiązania, które programiści zastosowaliby w swoich aplikacjach, aby były idealnie zabezpieczone.

najlepsze praktyki bezpieczeństwa PHP

podczas tworzenia aplikacji internetowej PHP inżynier sieci powinien zająć się najlepszymi praktykami bezpieczeństwa. Niezabezpieczona aplikacja internetowa daje hakerom szansę na pobranie cennych danych, takich jak informacje o klientach lub dane karty kredytowej. Ponadto naruszenie danych może mieć Ekstremalny wpływ na ważność Twojej organizacji i przyszłe operacje.

regularnie aktualizuj PHP

w tej chwili najbardziej stabilną i najnowszą dostępną wersją PHP jest PHP 8. Polecam, że musisz zaktualizować swoją aplikację PHP do tej nowej. Jeśli nadal używasz PHP 5.6 lub 7, będziesz mieć wiele przestarzałych aplikacji podczas aktualizacji PHP. Będziesz także musiał zaktualizować swój kod i zmienić niektóre logiki funkcjonalne, takie jak hashowanie haseł itp. Dostępne są również narzędzia do sprawdzania deprecjacji kodu i pomagania w ich migracji. Poniżej wymieniłem kilka narzędzi:

  1. PHP Compatibility Checker
  2. PHP MAR
  3. Phan

jeśli używasz PHPStorm, możesz użyć kontroli zgodności PHP 7, która pokaże ci, który kod spowoduje problemy.

Czytaj Więcej: Hosting PHP w Cloudways

Cross-Site scripting (XSS)

Cross Site scripting to rodzaj złośliwego ataku internetowego, w którym zewnętrzny skrypt jest wstrzykiwany do kodu lub wyjścia witryny. Atakujący może wysłać zainfekowany kod do użytkownika końcowego, podczas gdy przeglądarka nie może zidentyfikować go jako zaufanego skryptu. Atak ten występuje głównie w miejscach, w których Użytkownik ma możliwość wprowadzania i przesyłania danych. Atak może uzyskać dostęp do plików cookie, sesji i innych poufnych informacji o przeglądarce. Spójrzmy na przykład żądania GET, które wysyła niektóre dane za pośrednictwem adresu URL:

URL: http://example.com/search.php?search=<script>alert('test')</script>$search = $_GET ?? null;echo 'Search results for '.$search;

możesz dowiedzieć się tego ataku za pomocą htmlspecialchars. Również za pomocą ENT_QUOTES, można uciec pojedyncze i podwójne cudzysłowy.

$search = htmlspecialchars($search, ENT_QUOTES, 'UTF-8');echo 'Search results for '.$search;

tymczasem ataki XSS mogą być również wykonywane za pomocą atrybutów, zakodowanych schematów URI i kodowania kodu.

Czytaj więcej: zapobieganie XSS w Laravel

ataki SQL Injection

SQL injection jest najczęstszym atakiem w skryptach PHP. Pojedyncze zapytanie może zagrozić całej aplikacji. W ataku SQL injection atakujący próbuje zmienić dane przekazywane za pomocą zapytań. Załóżmy, że bezpośrednio przetwarzasz dane użytkownika w zapytaniach SQL i nagle anonimowy atakujący potajemnie używa różnych znaków, aby je ominąć. Zobacz poniższe zapytanie SQL:

$sql = "SELECT * FROM users WHERE username = '" . $username . "';

$username może zawierać zmienione dane, które mogą uszkodzić bazę danych, w tym usunąć całą bazę danych w mgnieniu oka. Więc jakie jest rozwiązanie? CHNP. Polecam zawsze korzystać z przygotowanych oświadczeń. PDO pomaga w zabezpieczaniu zapytań SQL.

$id = $_GET ?? null;

połączenie pomiędzy bazą danych a aplikacją odbywa się za pomocą poniższego oświadczenia:

$dbh = new PDO('mysql:dbname=testdb;host=127.0.0.1', 'dbusername', 'dbpassword');

możesz wybrać nazwę Użytkownika na podstawie powyższego ID, ale poczekaj! Tutaj kod SQL 'GET data’ zostanie wprowadzony do twojego zapytania. Uważaj, aby uniknąć takiego kodowania i zamiast tego użyj przygotowanych instrukcji:

$sql = "SELECT username, email FROM users WHERE id = ".$id." ;foreach ($dbh->query($sql) as $row) { printf ("%s (%s)\n", $row, $row);}

teraz możesz uniknąć powyższej możliwości SQL injection, używając

$sql = "SELECT username, email FROM users WHERE id = :id";$sth = $dbh->prepare($sql, );$sth->execute();$users = $sth->fetchAll();

również dobrą praktyką jest używanie doktryny ORM lub elokwentnej, ponieważ istnieje najmniejsza możliwość wstrzykiwania zapytań SQL w nich.

Czytaj Więcej: Ochrona witryny PHP przed SQL Injection

fałszowanie żądań krzyżowych XSRF/CSRF

atak CSRF jest zupełnie inny niż ataki XSS. W ataku CSRF użytkownik końcowy może wykonywać niechciane działania na uwierzytelnionych stronach internetowych i może przesyłać złośliwe polecenia do witryny, aby wykonać wszelkie niepożądane działania. CSRF nie może odczytać danych żądania i głównie kieruje żądanie zmiany stanu, wysyłając łącze lub zmienione dane w znacznikach HTML. Może zmusić użytkownika do wykonywania żądań zmiany stanu, takich jak transfer środków, zmiana adresów e-mail itp. Zobaczmy ten adres URL, w którym żądania GET wysyłają pieniądze na inne konto:

GET http://bank.com/transfer.do?acct=TIM&amount=100 HTTP/1.1

teraz, jeśli ktoś chce wykorzystać aplikację internetową, zmieni adres URL z nazwą i kwotą w ten sposób

http://bank.com/transfer.do?acct=Sandy&amount=100000

teraz ten adres URL można wysłać pocztą elektroniczną w dowolnym pliku, obrazku itp., a atakujący może poprosić o pobranie pliku

lub kliknąć na obrazek. A gdy tylko to zrobisz, natychmiast skończysz z wysyłaniem ogromnej ilości pieniędzy, o których nigdy nie wiesz.

przejęcie sesji

przejęcie sesji jest szczególnym rodzajem złośliwego ataku internetowego, w którym atakujący potajemnie kradnie identyfikator sesji użytkownika. Ten identyfikator sesji jest wysyłany do serwera, na którym powiązana tablica $_SESSION weryfikuje swoją pamięć w stosie i zapewnia dostęp do aplikacji. Przejęcie sesji jest możliwe poprzez atak XSS lub gdy ktoś uzyskuje dostęp do folderu na serwerze, na którym przechowywane są dane sesji.

aby zapobiec przechwyceniu sesji zawsze wiązaj sesje z adresem IP, aby:

$IP = getenv ( "REMOTE_ADDR" );

uważaj na to podczas pracy na localhost, ponieważ nie podaje dokładnego adresu IP, ale wartości typu :::1 lub :::127. Powinieneś szybko unieważnić (wyłączony plik cookie, wyłączony magazyn sesji, usuń ślady) sesję za każdym razem, gdy wystąpi naruszenie i zawsze staraj się nie ujawniać identyfikatorów w żadnych okolicznościach.

w przypadku plików cookie najlepszą praktyką jest nigdy nie używanie serializacji danych przechowywanych w pliku cookie. Hakerzy mogą łatwo manipulować Plikami cookie, co powoduje dodanie zmiennych do zakresu. Bezpiecznie usuń takie pliki cookie:

setcookie ($name, "", 1);setcookie ($name, false);unset($_COOKIE);

pierwsza linia kodu zapewnia, że plik cookie wygasa w przeglądarce, druga linia przedstawia standardowy sposób usunięcia pliku cookie (dlatego nie można przechowywać false w pliku cookie). Trzecia linia usuwa plik cookie ze skryptu.

Czytaj więcej: Serwer Redis jako Obsługa sesji PHP

Ukryj pliki z przeglądarki

jeśli korzystałeś z mikro-frameworków PHP, musisz widzieć określoną strukturę katalogów, która zapewnia prawidłowe rozmieszczenie plików. Frameworki pozwalają mieć różne pliki, takie jak kontrolery, modele, plik konfiguracyjny(.yaml) itp w tym katalogu, ale przez większość czasu przeglądarka nie przetwarza wszystkich plików, ale są one dostępne do zobaczenia w przeglądarce. Aby rozwiązać ten problem, nie należy umieszczać plików w katalogu głównym, ale w folderze publicznym,aby nie były one dostępne przez cały czas w przeglądarce. Spójrz na strukturę katalogów Slim framework poniżej:

smukła struktura katalogów

smukła struktura katalogów

bezpieczne przesyłanie plików

przesyłanie plików jest niezbędną częścią każdej aplikacji do przetwarzania danych użytkownika. Ale pamiętaj, że w niektórych momentach pliki są również używane do ataków XSS, jak już wyjaśniłem powyżej w artykule. Wracając do podstaw, Zawsze używaj żądania POST w formularzu i deklaruj właściwość enctype= „multipart / form-data” w znaczniku< form >. Następnie zweryfikuj Typ pliku za pomocą klasy finfo w ten sposób:

$finfo = new finfo(FILEINFO_MIME_TYPE);$fileContents = file_get_contents($_FILES);$mimeType = $finfo->buffer($fileContents);

programiści mogą tworzyć własne, niestandardowe i bardzo bezpieczne reguły walidacji plików, ale niektóre frameworki, takie jak Laravel, Symfony i codeigniter, mają już predefiniowane metody walidacji typów plików.

spójrzmy na inny przykład. HTML formularza powinien być taki:

<form method="post" enctype="multipart/form-data" action="upload.php"> File: <input type="file" name="pictures" multiple="true"> <input type="submit"></form>

I upload.php zawiera następujący kod:

foreach ($_FILES as $key => $error) { if ($error == UPLOAD_ERR_OK) { $tmpName = $_FILES; $name = basename($_FILES); move_uploaded_file($tmpName, "/var/www/project/uploads/$name"); }}

prawidłowe deklarowanie UPLOAD_ERR i basename () może zapobiec atakom przechodzenia przez katalog, ale kilka innych walidacji – takich jak rozmiar pliku, zmiana nazwy pliku i przechowywanie przesłanych plików w lokalizacji prywatnej-jest również wymagane w celu wzmocnienia bezpieczeństwa aplikacji.

Czytaj więcej: Przesyłanie obrazów i plików w PHP

użyj certyfikatów SSL dla HTTPS

wszystkie nowoczesne przeglądarki, takie jak Google Chrome, Opera, Firefox i inne, zalecają używanie protokołu HTTPS dla aplikacji internetowych. HTTPs zapewnia bezpieczny i szyfrowany kanał dostępu dla niezaufanych witryn. Musisz dołączyć HTTPS, instalując certyfikat SSL w swojej witrynie. Wzmacnia również aplikacje internetowe przed atakami XSS i uniemożliwia hakerom odczytywanie przesyłanych danych za pomocą kodów. Cloudways zapewnia bezpłatne certyfikaty SSL za pomocą jednego kliknięcia, które są ważne przez 90 dni i można je łatwo odwołać lub odnowić jednym kliknięciem. Możesz postępować zgodnie z instrukcjami dotyczącymi konfigurowania certyfikatów SSL w aplikacjach PHP, WordPress, Magento i Drupal.

wdrażaj Aplikacje PHP w chmurach

Hosting jest ostatnim i najważniejszym krokiem dla każdej aplikacji internetowej, ponieważ zawsze tworzysz projekt na lokalnych serwerach PHP i wdrażasz je na serwerach live, które oferują hosting współdzielony, chmurowy lub dedykowany. Zawsze polecam korzystanie z hostingu w chmurze, takiego jak DigitalOcean, Linode, AWS. Są szybkie, bezpieczne i bezpieczne dla każdego rodzaju strony internetowej i aplikacji. Zawsze zapewniają zabezpieczoną warstwę zapobiegającą atakom DDOS, Brute force i phishing, które są bardzo szkodliwe dla aplikacji internetowych.

Możesz również polubić: pułapki hostingu współdzielonego Laravel dla Twoich projektów

aby wdrażać aplikacje PHP na serwerach w chmurze, musisz mieć dobre umiejętności linuksowe, aby tworzyć potężne stosy internetowe, takie jak LAMP lub LEMP, co często kosztuje czas i budżet dla profesjonalistów Linuksowych. Zamiast tego platforma hostingowa Cloudways managed PHP i MySQL zapewnia łatwy sposób wdrażania serwerów za pomocą Thunderstack w ciągu kilku kliknięć na wyżej wymienionych dostawców chmury. Thunderstack pomaga w całkowitym zabezpieczeniu aplikacji PHP przed różnymi złośliwymi atakami i gwarantuje zoptymalizowaną wydajność.

Czytaj więcej: Enhanced Cloudways Staging Environment jest teraz dostępny dla wszystkich użytkowników

document Root Setup

document root dla aplikacji PHP na dowolnym serwerze musi być ustawiony na var/www/html, aby użytkownicy mogli uzyskać dostęp do twojej witryny za pośrednictwem przeglądarki. Ale w niektórych przypadkach, gdy tworzysz API z frameworkami takimi jak Laravel, Symfony i Slim, musisz zaktualizować webroot do folderu ’ / public.

/public obsługuje wyjście aplikacji podobne do prostej strony PHP z indeksem.plik php. Celem ustawienia webroota na var/www/html/public jest ukrycie poufnych plików, takich jak .htaccess i … env, które zawierają zmienne środowiskowe i poświadczenia API bazy danych, poczty, płatności.

również frameworki takie jak Laravel, Symfony zalecają, aby nie przenosić wszystkich plików do folderu głównego, zamiast tego stworzenie ładnej struktury katalogów do zapisywania powiązanych plików, takich jak widok, modele i kontrolery, jest bardziej rozsądnym podejściem.

Zaloguj wszystkie błędy i ukryj w produkcji

po stworzeniu strony internetowej i wdrożeniu na serwerze live. Pierwszą rzeczą, którą musisz zrobić, to wyłączyć wyświetlanie błędów, ponieważ hakerzy mogą uzyskać te same cenne informacje z błędów. Ustaw ten parametr w swoim php.plik ini:

display_errors=Off

teraz, po wyłączeniu wyświetlania, Zaloguj błędy PHP do określonego pliku dla przyszłych potrzeb:

log_errors=Onerror_log=/var/log/httpd/php_scripts_error.log

oczywiście możesz zmienić nazwę pliku, jak chcesz.

Możesz również polubić: Uprość rejestrowanie błędów Laravel za pomocą integracji z paskiem Rollbar PHP

Whitelist Public IP dla Mysql

podczas pracy z aplikacjami PHP często musisz skonfigurować bazę danych mysql w skryptach wewnętrznych, a także w klientach mysql. Większość klientów służy do konfigurowania zdalnego połączenia MySQL, które wymaga adresu IP lub innej nazwy hosta dostarczonego przez serwer hostingowy, aby utworzyć połączenie.

publiczny adres IP dla zdalnego połączenia Mysql musi być na białej liście na serwerze hostingowym, aby anonimowy użytkownik nie mógł uzyskać dostępu do bazy danych. Na przykład w Cloudways możesz dodać do białej listy IP jako:

teraz możesz podłączyć SQLyog lub Mysql workbench do pracy zdalnej z bazą danych.

P: Jak przetestować bezpieczeństwo PHP?

A: na rynku dostępnych jest kilka narzędzi do skanowania kodu, które mogą pomóc w analizie jakości kodu i bezpieczeństwa aplikacji PHP. PHP Malware Finder (PMF) jest jednym z najlepszych narzędzi do testowania zabezpieczeń, które pomaga znaleźć złośliwe kody w plikach. Możesz również użyć RIPS, które jest popularnym narzędziem do analizy kodu, które pomaga znaleźć luki w kodzie w czasie rzeczywistym.

P: Jak zapewnić bezpieczeństwo baz danych PHP?

A: aby zapewnić bezpieczeństwo bazy danych, zawsze powinieneś używać praktyk takich jak ochrona SQL injection, zapory bazy danych, regularne szyfrowanie danych i podobne inne.

P: Jaka jest bezpieczna metoda szyfrowania hasła w PHP?

A: Md5 to skrót od Message Process 5, a sha1 to skrót od Secure Hash Algorithm 1. Oba są wykorzystywane do szyfrowania ciągów. Po zaszyfrowaniu ciąg znaków staje się powtarzalny, aby go dekodować. Md5 i sha1 są wyjątkowo przydatne podczas przechowywania haseł w bazie danych.

P: Co to jest luka w zabezpieczeniach PHP?

A: PHP Object Injection to luka na poziomie aplikacji, która wydaje się pozwalać napastnikowi na wykonywanie różnych rodzajów szkodliwych ataków, takich jak wstrzyknięcie kodu, wstrzyknięcie SQL, przemierzanie ścieżek i odmowa usługi.

atak DDoS naraża wiele ataków na systemy komputerowe. Zwykle cele to serwery, strony internetowe lub inne zasoby sieciowe.

dzieje się tak, gdy dane wejściowe dostarczone przez użytkownika nie są zarządzane przed przekazaniem ich do funkcji PHP unserialize (). Ponieważ PHP zezwala na serializację obiektów, agresorzy mogą przekazywać serializowane ciągi ad-hoc do bezbronnego wywołania unserialize ().

Kończę!

cóż, najlepsze praktyki bezpieczeństwa PHP to bardzo rozległy temat. Programiści z całego świata mają tendencję do opracowywania różnych przypadków użycia w celu zabezpieczenia aplikacji internetowych. Podczas gdy wiele firm prowadzi różne programy nagród, aby znaleźć luki w zabezpieczeniach i luki w swoich aplikacjach, a tym samym nagradzać ekspertów ds. bezpieczeństwa, którzy wskazują krytyczne luki w aplikacjach. Ten artykuł obejmuje podstawowe problemy z bezpieczeństwem PHP, aby pomóc ci zrozumieć, jak zabezpieczyć projekty PHP przed różnymi złośliwymi atakami. W przyszłości napiszę również o kilku innych wskazówkach i Sztuczkach dotyczących bezpieczeństwa PHP. Do tego czasu możesz podzielić się swoimi przemyśleniami i praktykami dotyczącymi bezpieczeństwa w sekcji komentarzy poniżej.

podziel się swoją opinią w komentarzu. Skomentuj teraz

Udostępnij ten artykuł

Opinia klienta na

„Cloudways hosting ma jedną z najlepszych prędkości obsługi klienta i hostingu”

Sanjit C

Shahroze Nawaz

Shahroze jest menedżerem społeczności PHP w Cloudways-zarządzanej platformie hostingowej PHP. Poza życiem zawodowym uwielbia filmy i Podróże. Możesz wysłać do niego e-mail na adres

Połącz się na: forum społeczności Twittera

Leave a Reply

Twój adres e-mail nie zostanie opublikowany.