Ultimate PHP Security Best Practices
vzhledem k tomu, PHP je páteří pro téměř každý web, proto, PHP bezpečnost by neměla být považována za zanedbatelnou za každou cenu. Vývojáři PHP však mají oprávnění vyhnout se běžným hrozbám, jako je padělání požadavků na více webů, injekce SQL a manipulace s daty. A to vše se hodí pomocí vestavěných bezpečnostních funkcí PHP, které vývojářům usnadňují ochranu webových stránek.
PHP je považován za nejvýkonnější jazyk na straně serveru, PHP využívá 80 procent světového webu s 10 miliony domén. Z tohoto důvodu je třeba pochopit, že PHP vám pomůže chránit před útočníky.
zabezpečení webových aplikací před všemi druhy padělaných pokusů o útok je nejvyšší povinností webového vývojáře. Měli byste vytvořit své webové aplikace dostatečně ochranné, aby neměly žádné bezpečnostní problémy nebo mezery.
PHP je nejpoužívanější webový programovací jazyk na straně serveru na světě. Různé PHP aplikace sdílejí různé části svého kódu a skriptů s jinými webovými aplikacemi. V případě, že je sdílená část kódu zjištěna jako zranitelná, jsou všechny aplikace používající tuto sdílenou část kódu ohroženy a považovány za zranitelné.
Udržujte své aplikace v bezpečí v cloudu
Cloudways nabízí 2FA, bezplatné SSL a pokročilejší bezpečnostní funkce na spravovaných serverech, které udržují vaši aplikaci v bezpečí.
PHP je nejvíce kritizovaný skriptovací jazyk, pokud jde o bezpečnost. Velká část vývojářů a odborníků na QA si myslí, že PHP nemá robustní techniky pro zabezpečení aplikací. Verdikt má také nějaký důvod, protože PHP je nejstarším a široce používaným jazykem pro vývoj webových aplikací. Ale po dlouhou dobu od PHP 5.6 jsme neviděli žádné významné aktualizace týkající se zabezpečení, a proto jazyk čelí některým bezpečnostním problémům.
jak Bezpečný je PHP
PHP je stejně bezpečný jako jakýkoli jiný hlavní jazyk. PHP je stejně bezpečné jako jakýkoli hlavní jazyk na straně serveru. Díky novým rámcům a nástrojům PHP zavedeným v posledních několika letech je nyní snazší než kdy jindy spravovat špičkové zabezpečení.
pokud provedeme srovnání, PHP je rovnoměrně zabezpečeno. Rails, Java, Javascript a další jazyky mají v průběhu let své zranitelnosti. „Pokud najdete jazyk, který neměl zranitelnost nějakého tvaru nebo formy, můžete napsat zabezpečený kód v PHP dokonale dobře.
bezpečnostní problémy v PHP CMS
populární CMS jako WordPress, Joomla, Magento a Drupal jsou postaveny v PHP a podle Sucuri, většina zranitelností v PHP CMS vyšel najevo v průběhu roku 2017:
- problémy se zabezpečením WordPress vzrostly ze 74% v 2016 Q3 na 83% v 2017.
- bezpečnostní problémy Joomla klesly ze 17% v 2016 Q3 na 13.1% v 2017.
- bezpečnostní problémy Magento vzrostly nepatrně z 6% ve 3. čtvrtletí 2016 na 6,5% v roce 2017.
- bezpečnostní problémy Drupalu mírně poklesly z 2% v Q3 2016 na 1.6% v 2017.
současná situace není dost dobrá, ale díky přispěvatelům s otevřeným zdrojovým kódem, kteří se snaží problémy překonat a v PHP jsme v poslední době viděli některé drastické změny. PHP 7.x byl spuštěn v loňském roce s různými aktualizacemi a opravami. Nejlepší věc na PHP 7.x se týká upgradů zabezpečení, které skutečně vylepšily bezpečnostní protokol jazyka.
Co Tento tutoriál zabezpečení PHP obsahuje?
pracoval jsem na problémech s bezpečností a výkonem PHP po velmi dlouhou dobu, protože jsem vysoce aktivní v komunitě PHP a ptal se špičkových vývojářů na tipy a triky, které používají ve svých živých projektech. Hlavním cílem tohoto tutoriálu o zabezpečení PHP je proto informovat vás o osvědčených postupech pro zabezpečení ve webových aplikacích PHP. Budu definovat následující problémy a zmínit možná řešení pro ně.
- Aktualizujte PHP pravidelně
- Cross Site scripting (XSS)
- SQL Injection Attacks
- Cross site request forgery XSRF/CSRF
- session Hijacking
- skrýt soubory z prohlížeče
- bezpečně nahrát soubory
- použijte SSL certifikáty pro HTTPs
- nasadit PHP aplikace na Clouds
Poznámka: Prosím, nepovažujte to za kompletní tahák. Musí existovat lepší způsoby a více jedinečných řešení, které by vývojáři aplikovali na své aplikace, aby byly dokonale zabezpečené.
PHP Security Best Practice
při vytváření webové aplikace PHP by se webový inženýr měl zabývat osvědčenými bezpečnostními postupy. Nezabezpečená webová aplikace dává hackerům šanci získat cenná data, jako jsou informace o klientech nebo údaje o kreditní kartě. Porušení dat může mít navíc extrémní dopad na platnost a budoucí operace vaší organizace.
aktualizovat PHP pravidelně
právě teď, nejstabilnější a nejnovější verze PHP k dispozici je PHP 8. Doporučuji, abyste svou PHP aplikaci aktualizovali na tuto novou. Pokud stále používáte PHP 5.6 nebo 7, budete mít při upgradu aplikací PHP spoustu deprecations. Budete také muset aktualizovat svůj kód a změnit některé funkční logiky, jako je hashování hesel atd. K dispozici jsou také některé nástroje pro kontrolu zastaralosti kódu a pomoc při migraci těchto. Níže uvádím některé nástroje:
- Kontrola kompatibility PHP
- PHP MAR
- Phan
pokud používáte PHPStorm, můžete použít kontrolu kompatibility PHP 7, která vám ukáže, který kód vám způsobí problémy.
Více: PHP Hosting na Cloudways
Cross-site scripting (XSS)
Cross site scripting je typ škodlivého webového útoku, při kterém je do kódu nebo výstupu webu vložen externí skript. Útočník může poslat infikovaný kód koncovému uživateli, zatímco prohlížeč jej nemůže identifikovat jako důvěryhodný skript. K tomuto útoku dochází většinou na místech, kde má uživatel možnost zadávat a odesílat data. Útok má přístup k souborům cookie, relacím a dalším citlivým informacím o prohlížeči. Podívejme se na příklad požadavku GET, který odesílá některá data přes URL:
URL: http://example.com/search.php?search=<script>alert('test')</script>$search = $_GET ?? null;echo 'Search results for '.$search;
tento útok můžete zjistit pomocí htmlspecialchars. Také pomocí ENT_QUOTES, můžete uniknout jednoduché a dvojité uvozovky.
$search = htmlspecialchars($search, ENT_QUOTES, 'UTF-8');echo 'Search results for '.$search;
mezitím mohou útoky XSS provádět také pomocí atributů, kódovaných schémat URI a kódování kódu.
Přečtěte si více: zabránit XSS v Laravel
SQL Injection útoky
SQL injection je nejčastější útok v PHP skriptování. Jediný dotaz může ohrozit celou aplikaci. V SQL injection attack se útočník pokusí změnit data, která předáváte prostřednictvím dotazů. Předpokládejme, že přímo zpracováváte uživatelská data v dotazech SQL a najednou anonymní útočník tajně používá různé znaky, aby je obešel. Podívejte se na níže uvedený dotaz SQL:
$sql = "SELECT * FROM users WHERE username = '" . $username . "';
$username může obsahovat změněná data, která mohou poškodit databázi, včetně odstranění celé databáze v mrknutí oka. Takže, jaké je řešení? CHOP. Doporučuji vždy používat připravené prohlášení. Chop vám pomůže při zabezpečení SQL dotazů.
$id = $_GET ?? null;
spojení mezi databází a aplikací se provádí pomocí níže uvedeného prohlášení:
$dbh = new PDO('mysql:dbname=testdb;host=127.0.0.1', 'dbusername', 'dbpassword');
můžete si vybrat uživatelské jméno na základě výše uvedeného ID, ale počkejte! Zde SQL kód „získat data“ dostane injekčně do dotazu. Dávejte pozor, abyste se tomuto kódování vyhnuli a místo toho použijte připravené příkazy:
$sql = "SELECT username, email FROM users WHERE id = ".$id." ;foreach ($dbh->query($sql) as $row) { printf ("%s (%s)\n", $row, $row);}
nyní se můžete vyhnout výše uvedené možnosti vstřikování SQL pomocí
$sql = "SELECT username, email FROM users WHERE id = :id";$sth = $dbh->prepare($sql, );$sth->execute();$users = $sth->fetchAll();
dobrým postupem je také použití ORM jako doktríny nebo výmluvné, protože v nich existuje nejmenší možnost vstřikování dotazů SQL.
Více: Chraňte webové stránky PHP před SQL Injection
Cross site request forgery XSRF / CSRF
útok CSRF je zcela odlišný od útoků XSS. V CSRF útoku může koncový uživatel provádět nežádoucí akce na ověřených webových stránkách a může přenášet škodlivé příkazy na web, aby provedl jakoukoli nežádoucí akci. CSRF neumí číst data požadavku a většinou se zaměřuje na požadavek na změnu stavu zasláním jakéhokoli odkazu nebo změněných dat ve značkách HTML. To může přinutit uživatele k provádění požadavků na změnu stavu, jako je převod finančních prostředků, změna jejich e-mailových adres atd. Podívejme se na tuto adresu URL, ve které GET requests posílá peníze na jiný účet:
GET http://bank.com/transfer.do?acct=TIM&amount=100 HTTP/1.1
Nyní, pokud někdo chce využít webové aplikace on / ona změní adresu URL s názvem a částku, jako je tento
http://bank.com/transfer.do?acct=Sandy&amount=100000
nyní tato adresa URL může být zaslána e-mailem v libovolném souboru, obrázek atd a útočník vás může požádat o stažení souboru
nebo klikněte na obrázek. A jakmile to uděláte, okamžitě skončíte zasláním obrovského množství peněz, o kterých nikdy nevíte.
únos relace
únos relace je zvláštní typ škodlivého webového útoku, při kterém útočník tajně ukradne ID relace uživatele. Toto ID relace je odesláno na server, kde přidružené pole $_SESSION ověřuje své úložiště v zásobníku a uděluje přístup k aplikaci. Únos relace je možný prostřednictvím útoku XSS nebo když někdo získá přístup ke složce na serveru, kde jsou uložena data relace.
Chcete-li zabránit únosu relace, vždy svažte relace na vaši IP adresu:
$IP = getenv ( "REMOTE_ADDR" );
Sledujte to při práci na localhost, protože vám neposkytuje přesnou IP adresu, ale :::1 nebo::: 127 typové hodnoty. Měli byste zneplatnit relaci (unset cookie, unset session storage, remove traces) rychle, kdykoli dojde k porušení, a měli byste se vždy snažit nevystavovat ID za žádných okolností.
u souborů cookie je nejlepším postupem nikdy nepoužívat serializaci dat uložených v souboru cookie. Hackeři mohou snadno manipulovat se soubory cookie, což má za následek přidání proměnných do vašeho rozsahu. Takto bezpečně odstraňte soubory cookie:
setcookie ($name, "", 1);setcookie ($name, false);unset($_COOKIE);
první řádek kódu zajišťuje, že cookie vyprší v prohlížeči, druhý řádek zobrazuje standardní způsob odstranění cookie (takže nemůžete uložit false v cookie). Třetí řádek odstraní soubor cookie ze skriptu.
Přečtěte si více: Redis Server jako obslužný program relace PHP
skrýt soubory z prohlížeče
pokud jste použili mikro-rámce PHP, musíte vidět konkrétní adresářovou strukturu, která zajišťuje správné umístění souborů. Frameworky umožňují mít různé soubory, jako jsou řadiče, modely, konfigurační soubor(.yaml) atd. v tomto adresáři, ale většinou prohlížeč nezpracovává všechny soubory, přesto jsou k dispozici v prohlížeči. Chcete-li tento problém vyřešit, nesmíte umístit soubory do kořenového adresáře, ale do veřejné složky, aby nebyly přístupné po celou dobu v prohlížeči. Podívejte se na adresářovou strukturu Slim frameworku níže:
bezpečně nahrát soubory
nahrávání souborů je nezbytnou součástí každé aplikace pro zpracování uživatelských dat. Nezapomeňte však, že v některých bodech se soubory používají také pro útoky XSS, jak jsem již vysvětlil výše v článku. Vrátíme-li se k základům, vždy použijte požadavek POST ve formuláři a deklarujte vlastnost enctype= „multipart/form-data“ ve značce <form>. Poté ověřte typ souboru pomocí třídy finfo, jako je tato:
$finfo = new finfo(FILEINFO_MIME_TYPE);$fileContents = file_get_contents($_FILES);$mimeType = $finfo->buffer($fileContents);
vývojáři mohou vytvářet vlastní a ultra-bezpečná pravidla pro validaci souborů, ale některé rámce jako Laravel, Symfony a codeigniter již mají předdefinované metody pro ověření typů souborů.
podívejme se na další příklad. HTML formuláře by mělo být takto:
<form method="post" enctype="multipart/form-data" action="upload.php"> File: <input type="file" name="pictures" multiple="true"> <input type="submit"></form>
a nahrát.php obsahuje následující kód:
foreach ($_FILES as $key => $error) { if ($error == UPLOAD_ERR_OK) { $tmpName = $_FILES; $name = basename($_FILES); move_uploaded_file($tmpName, "/var/www/project/uploads/$name"); }}
správné vyhlášení UPLOAD_ERR a basename() může zabránit útokům na procházení adresářů, ale několik dalších ověření – jako je velikost souboru, přejmenování souboru a ukládání nahraných souborů v soukromém umístění – je také nutné k posílení bezpečnosti aplikací.
více: Nahrávání obrázků a souborů v PHP
použijte certifikáty SSL pro HTTPS
všechny moderní prohlížeče, jako je Google Chrome, Opera, Firefox a další, doporučují používat protokol HTTPS pro webové aplikace. HTTPs poskytuje zabezpečený a šifrovaný přístupový kanál pro nedůvěryhodné weby. HTTPS musíte zahrnout instalací certifikátu SSL na svůj web. Posiluje také vaše webové aplikace proti útokům XSS a zabraňuje hackerům číst přenášená data pomocí kódů. Cloudways poskytuje bezplatné SSL certifikáty na jedno kliknutí, které jsou platné po dobu 90 dnů a můžete je snadno zrušit nebo obnovit kliknutím. Pokyny pro nastavení certifikátů SSL můžete sledovat v aplikacích PHP, WordPress, Magento a Drupal.
nasazení PHP aplikací v oblacích
Hosting je posledním a nejdůležitějším krokem pro jakoukoli webovou aplikaci, protože vždy vytváříte Projekt na lokálních serverech PHP a nasazujete je na živých serverech, které nabízejí sdílený, cloudový nebo dedikovaný hosting. Vždy doporučuji používat cloud hosting jako DigitalOcean, Linode, AWS. Jsou rychlé, bezpečné a bezpečné pro jakýkoli druh webových stránek a aplikací. Vždy poskytují zabezpečenou vrstvu, která zabraňuje DDOS, hrubou silou a phishingovým útokům, které jsou vysoce škodlivé pro webové aplikace.
mohlo by se vám také líbit: úskalí sdíleného hostingu Laravel pro vaše projekty
Chcete-li nasadit PHP aplikace na cloudových serverech, musíte mít dobré Linuxové dovednosti, abyste mohli vytvářet výkonné webové stohy jako LAMP nebo LEMP, což vás často stojí čas a rozpočet pro profesionály v Linuxu. Místo toho vám Cloudways managed PHP a MySQL hosting platform poskytuje snadný způsob nasazení serverů s Thunderstack během několika kliknutí na výše uvedené poskytovatele cloudu. Thunderstack pomáhá vaší PHP aplikaci zcela zabezpečit před různými škodlivými útoky a zaručuje optimalizovaný výkon.
Přečtěte si více: vylepšené prostředí Cloudways Staging je nyní k dispozici pro všechny uživatele
nastavení kořenového adresáře dokumentu
kořen dokumentu pro aplikace PHP na libovolném serveru musí být nastaven na var / www / html, aby uživatelé měli přístup na vaše webové stránky prostřednictvím prohlížeče. Ale v některých případech, když vyvíjíte API s frameworky jako Laravel, Symfony a Slim, musíte aktualizovat webroot na ‚ / public folder.
/ public slouží výstupu aplikace Podobně jako jednoduchý PHP web s indexem.php soubor. Účelem nastavení webrootu na var / www/html / public je skrýt citlivé soubory jako .htaccess a .env, které obsahují proměnné prostředí a pověření API databáze, pošty, plateb.
také frameworky jako Laravel, Symfony doporučují nepřesunout všechny soubory do kořenové složky, místo toho vytvořit pěknou adresářovou strukturu pro uložení souvisejících souborů, jako je zobrazení, modely a řadiče, je rozumnější přístup.
Zaznamenejte všechny chyby a skryjte se ve výrobě
, jakmile vyvinete web a nasadíte na živý server. První věc, kterou musíte udělat, je zakázat zobrazení chyb, protože hackeři mohou z chyb získat stejné cenné informace. Nastavte tento parametr v php.ini soubor:
display_errors=Off
nyní, po vypnutí zobrazení, Zaznamenejte chyby PHP do konkrétního souboru pro budoucí potřeby:
log_errors=Onerror_log=/var/log/httpd/php_scripts_error.log
je zřejmé, že můžete změnit název souboru, jak chcete.
mohlo by se vám také líbit: Zjednodušte protokolování chyb Laravel s integrací PHP Rollbar
Whitelist Public IP pro Mysql
při práci s aplikacemi PHP často potřebujete nastavit databázi mysql v interních skriptech i v klientech mysql. Většina klientů se používá k nastavení vzdáleného připojení MySQL, které k vytvoření připojení potřebuje IP adresu nebo jiné jméno hostitele poskytnuté hostingovým serverem.
veřejná IP adresa pro vzdálené připojení Mysql musí být na vašem hostingovém serveru na seznamu povolených, aby anonymní uživatel nemohl získat přístup k databázi. Například na Cloudways můžete whitelist IP jako:
nyní můžete připojit SQLyog nebo Mysql workbench pracovat na dálku s databází.
otázka: Jak otestovat zabezpečení PHP?
A: na trhu je k dispozici několik nástrojů pro skenování kódů, které vám pomohou analyzovat kvalitu kódu a bezpečnost vašich PHP aplikací. PHP Malware Finder (PMF) je jedním z nejlepších nástrojů pro testování zabezpečení, který pomáhá najít škodlivé kódy v souborech. Můžete také použít ripy, což je populární nástroj pro analýzu kódu, který pomáhá najít chyby zabezpečení kódu v reálném čase.
otázka: jak zajistit bezpečnost databáze PHP?
A: pro zajištění bezpečnosti databáze byste měli vždy používat postupy, jako je ochrana SQL injection, brány firewall databáze, pravidelné šifrování dat a podobné další.
otázka: Jaká je bezpečná metoda šifrování hesla v PHP?
A: Md5 je zkratka pro Message Process 5 a sha1 je zkratka pro Secure Hash Algorithm 1. Oba se používají k šifrování řetězců. Jakmile je řetězec zašifrován, opakuje se pro jeho dekódování. Md5 a sha1 jsou mimořádně užitečné při ukládání hesel v databázi.
otázka: Co je chyba zabezpečení PHP?
A: PHP Object Injection je zranitelnost na úrovni aplikace, která podle všeho umožňuje útočníkovi provádět různé druhy škodlivých útoků, jako je vstřikování kódu, SQL Injection, Traversal Path a Denial of Service.
DDoS útok ohrožuje více počítačových systémů útoky. Obvyklými cíli jsou servery, Webové stránky nebo jiné síťové zdroje.
k tomu dochází, když není spravován vstup dodaný uživatelem před předáním do funkce UNSERIALIZE () PHP. Protože PHP umožňuje serializaci objektů, mohou agresoři předat ad-hoc serializované řetězce bezbrannému volání unserialize ().
Balím To!
osvědčené postupy zabezpečení PHP jsou velmi rozsáhlé téma. Vývojáři z celého světa mají tendenci vyvíjet různé případy použití k zabezpečení webových aplikací. Zatímco mnoho společností provozuje různé programy odměn, aby zjistilo bezpečnostní mezery a zranitelnosti ve svých aplikacích, a tak odměnilo ty bezpečnostní odborníky, kteří poukazují na kritické mezery v aplikacích. Tento článek se zabývá základními bezpečnostními problémy PHP, které vám pomohou pochopit, jak zabezpečit vaše projekty PHP před různými škodlivými útoky. V budoucnu budu také psát o několika dalších bezpečnostních tipech a tricích PHP. Do té doby můžete přispět svými myšlenkami a bezpečnostními postupy v sekci komentáře níže.
Sdílet tento článek
hodnocení zákazníků na
„Cloudways hosting má jeden z nejlepších služeb zákazníkům a rychlost hostingu“
Sanjit C
shahroze Nawaz
Shahroze je komunitní manažer PHP v Cloudways – spravované PHP hostingové platformě. Kromě pracovního života miluje filmy a cestování. Můžete mu poslat e-mail na