====== PHP ====== ===== Soubory spuštěné jako PHP ===== Ve výchozím nastavení jsou jako PHP zpracovány soubory s příponou ''.php .phtml .inc .php3''. \\ Soubory ''phps'' jsou zobrazeny jako zvýrazněný zdrojový kód PHP. \\ Toto nastavení lze změnit přes ''.htaccess'' [[http://httpd.apache.org/docs/2.2/mod/mod_mime.html#addtype|AddType]]. ===== PHPerror2mail ===== PHPerror2mail nemění [[http://cz.php.net/manual/en/errorfunc.configuration.php#ini.error-reporting|error_reporting]], pokud má APP nastaven např ''E_ALL'', budou v logu i notice apod. Je na APP nastavit si odpovídající [[http://cz.php.net/manual/en/errorfunc.configuration.php#ini.error-reporting|error_reporting]] a non-fatal řešit přes [[http://cz.php.net/manual/en/function.set-error-handler.php|error handler]]. Primární účel PHPerror2mail je reportovat fatal errors, které nedojdou k error handler. ===== Proces odeslání mailu z www a omezení ===== - Lze použít - PHP funkci [[http://cz.php.net/manual/en/function.mail.php|mail()]] - SMTP připojení na localhost - autentizované připojení na smtpc.unihost.cz - ''mail()'' předá zprávu odpovídajícímu mail serveru pro www. - Mail server nepřijme zprávu pokud odesílatel ''From'' není platná mail adresa nebo skutečný odesílatel ''Return-Path'' není v doméně registrované pro odesílající www server. - Mail server nepřijme zprávu pro více než 30 příjemců. - Limit poslaných zpráv je 1msg/1sec, tento limit se při velkém množství zpráv zvyšuje. - Mail server může mít základní spam filtr, který má zabránit odesílání spamu z www serveru. Spam filtr by neměl propustit zprávy, které by jiné mail servery označily za jednoznačný spam. - Spam filtr (pokud je zapojen) notifikuje odesílatele zprávy která je špatně formátovaná (obvykle ''BAD_HEADER''). ===== Log odeslaných emailů z webu ===== Logy najdete v adresari ''log'' (jedna uroven nad wwwroot) a jsou dva * ''mail.log'' = emaily prijate do fronty * ''smtp.log'' = predani na cilovy SMTP server Obsahuji log pro emaily za dnesek. \\ Frekvence generovani je kazdych 30 min. \\ Za predchozi dny budou dostupne (rotovany) s ciselnym sufixem. \\ Technicky, jake emaily budou v tomto logu * poslano pres PHP funkci mail() nebo SMTP localhost * message-id je ...@[www.]domena.tld \\ napriklad ...@unihost.cz nebo ...@www.unihost.cz * zatim nemusi zahrnovat 3d (napriklad faq.unihost.cz), pokud message-id nevyhovuje predchozimu. doresime nekdy pozdeji. ===== Chci najednou poslat x tisíc mailů ===== To je možné, ale existuje několik limitů, které jsou nastaveny kvůli ochraně před rozesíláním spamů ze zneužitelných formulářů apod. \\ Viz [[php#chci-najednou-poslat-x-tisic-mailu|Proces odeslání mailu z www a omezení]]. \\ Dále limit přijatých zpráv cílových mail serverů od našeho serveru. Tento limit je závislý na třetí straně a obvykle není zveřejněn (například seznam.cz). \\ Tzn zprávy budou vloženy do fronty a pokud neexpirují, budou v čase odeslány-doručeny. K expiraci zprávy ve frontě - prohlášení za nedoručitelnou, dojde po 48 hod, v případě odmítání cílovým mail serverem po 24 hod. \\ Některé mail servery, například seznam.cz, mohou pro větší mailingy vyžadovat DKIM nebo SPF, viz [[http://seznam.seznamblog.cz/post/108069343301/seznamcz-email-zp%C5%99%C3%ADs%C5%88uje-svoji-antispamovou|Seznam.cz Email zpřísňuje svoji antispamovou politiku]]. \\ [[http://napoveda.centrum.cz/index.php?/Knowledgebase/Article/View/151/0/|Centrum.cz - Pravidla pro rozesílání většího objemu zpráv]] \\ [[https://fbl.seznam.cz|Seznam.cz - Posílání hromadných zpráv]] \\ ===== Rozesílání mailingů ===== V souladu s [[http://uoou.cz/uoou.aspx?menu=23&submenu=25|§ 7 zákona č. 480/2004 Sb.]], o některých službách informační společnosti a o změně některých zákonů ve znění pozdějších předpisů (dále jen ZIS) \\ a praxí [[http://uoou.cz/uoou.aspx?menu=23|Úřadu pro ochranu osobních údajů]], který při šetření stížností požaduje * prokázání zdroje elektronické adresy - emailu * prokázání souhlasu se zasíláním obchodních sdělení (dále jen souhlas), datum a způsob získání, IP adresa z které byl udělen souhlas * plnění požadavků ustanovení Požadujeme aby každá zpráva = obchodní sdělení, měla tyto náležitosti v textové i HTML podobě (pokud je dotyčná podoba použita. Obecně v každé podobě zprávy.) \\ * jednoduchý způsob odhlášení (= odvolání souhlasu) ze zasílání obchodních sdělení, § 7 bod 3. Například \\ //Pokud si již nepřejete dostávat obchodních sdělení od naší firmy, klikněte zde pro odhlášení.// * označení jako obchodní sdělení, § 7 bod 4. Do patičky uveďte všechny níže uvedené náležitosti * totožnost odesílatele obchodního sdělení identifikovaný obchodním jménem a adresou www stránek * IP adresa z které byl vysloven souhlas * datum a čas kdy byl vysloven souhlas v libovolné formulaci vyhovující právním předpisům \\ //Tato zpráva je obchodním sdělením společnosti Moje Firma s.r.o., \\ které Vám bylo zasláno na základě vysloveného souhlasu na www.mojestranky.dom \\ z IP: 1.2.3.4 \\ datum: 1.1.2000 11:39// * reply-to je platná emailová adresa § 7 bod 4 c V případě nesplnění těchto smluvních podmínek podložených právními předpisy, si vyhrazujeme právo - s ohledem na náročnost řešení stížností a možného negativního dopadu na naše další zákazníky - okamžitého smazání emailů vykazujících znaky obchodního sdělení. Doporučujeme také do odkazů apod umístit jednoznačný identifikátor příjemce, například hash emailu nebo ID, který umožní vyřadit email příjemce z databáze v případě stížností na spam. Ve většině stížností je totiž email příjemce a Message-ID odstraněno. \\ Reference: * [[http://uoou.cz/uoou.aspx?menu=23&submenu=25|§ 7 zákona č. 480/2004 Sb.]] - o některých službách informační společnosti a o změně některých zákonů (zákon o některých službách informační společnosti) * [[http://www.root.cz/clanky/obchodni-sdeleni-bez-predchoziho-souhlasu-to-nejde/|článek Obchodní sdělení: bez předchozího souhlasu to nejde]] ===== Maily jsou označovány jako SPAM pokud jako From uvedu email uživatele ===== Pokud emaily odesílané z našich www serverů jsou označovány jako SPAM a ve ''From'' použijete email uživatele/zákazníka např ''ja@gmail.com'', je to v pořádku - součást globální SPAM ochrany (nikoliv pravidlo pouze na UniHost, ale na mnoha dalších serverech v Internetu). Některé domény mají bezpečnostní politiku, že jejich emaily nemůžou odcházet z libovolného serveru, pouze z jejich serverů, jako ochrana před rozesíláním SPAMu z cizích serverů s uvedením emailu ''From'' v jejich doméně. \\ Pravděpodobně [[email#jak-zobrazit-hlavicky-zpravy|v hlavičce emailu]] ''X-Spam'' najdete score \\ ''2.8 NOTVALID_GMAIL Claims to be from gmail.com but is not'' \\ Řešením je uvádět ve ''From'' adresu domény aplikace a do ''Reply to'' uvést požadovaný email. \\ Při uvádění emailu uživatele/zákazníka do ''From'' nemusí být také zpráva doručena kvůli [[http://en.wikipedia.org/wiki/DKIM|DKIM]] nebo [[http://en.wikipedia.org/wiki/Sender_Policy_Framework|SPF]]. Proto je vhodné se tomuto v současné době vyhnout. \\ ===== html2ps a memory limit ===== Rád bych použil [[http://sourceforge.net/projects/html2ps/|html2ps]], ale spadne mi na PHP [[http://cz.php.net/manual/en/ini.core.php#ini.memory-limit|memory limit]]: ''Fatal error: Allowed memory size of X bytes exhausted (tried to allocate Y bytes).'' \\ Dle testování (PHP 5.2.12, html2ps 2.0.43, 2010-02-02) pro 22K stránku + 220K media potřebuje 85M RAM. Navýšení RAM pro www je možné, kontaktujte Vašeho obchodníka nebo podporu. \\ ===== PDFlib ===== Licence [[http://www.pdflib.com/|PDFlib]] Lite neumožňuje použití na webhosting serveru, viz [[http://www.pdflib.com/fileadmin/pdflib/pdf/support/PDFlib-in-PHP-HowTo.pdf|kapitola 4 PDFlib in Hosting Environments]]. Lze použít demo licenci (make demo stamp across all generated pages). Je na zákazníkovi aby si zaplatil běžnou licenci (795€ 2010-07-12). ===== Generování PDF v PHP ===== Lze použít knihovny (class) například: [[http://www.fpdf.org/|FPDF]], [[https://github.com/rospdf/pdf-php|R&OS pdf]] ... \\ Pokud víte o jiné která u nás funguje, dejte nám vědět. \\ ===== Moje aplikace vyžaduje safe mode Off ===== Obvykle ale aplikace neuvádí důvod a žádný důvod k tomu obvykle není, vyjma lenosti vývojářů. Majorita webhostingu, z důvodů zajištění bezpečnosti, běží v ''safe-mode''. Berou toto vývojář(i) dané aplikace na zřetel, nebo o tyto uživatele nemají zájem? \\ [[http://cz.php.net/manual/en/features.safe-mode.php|Safe-mode]] nijak neomezuje běžnou webovou aplikaci. V případě nasazení ''SElinux'' může být web aplikace/uživatel mnohem více omezována. \\ Na našich serverech je ''safe-mode'' jedním z bezpečnostních prvků, tak aby celek zajistil maximální možnou bezpečnost, kterou všichni uživatelé sdíleného webhosting serveru vyžadují. Na našich serverech nevidí uživatel na systém - aby se nemohl snažit o průnik, získání plných práv - ani na ostatní uživatele - aby nemohl číst jejich data, to je naše priorita. \\ Směrem k PHP6 je ''safe-mode'' zapovězen a protože udržujeme na serverech aktuální verzi PHP, budeme to akceptovat. Ale v současné době je pro PHP lepší-bezpečnější provoz se ''safe-mode''. \\ Aplikace které opravdu potřebují ''safe-mode'' můžeme provozovat jako VPS. Budeme rádi pokud nás budete kontaktovat. Nebo v případě většího zájmu můžeme zřídit PHP server se ''safe-mode off'', ale ohledně bezpečnosti jste byli varováni. \\ ===== Pomalý přístup do adresáře ===== Čtení anebo zápis do adresáře je hodně pomalý, mám v něm více souborů. \\ Pokud adresář obsahuje více než 50.000 souborů (údaj se může v různých zdrojích lišit, dle použitých disků, filesystému, testované operace, apod), je ''stat'' na adresář náročný, přitom je nutné ho provést při každém přístupu pokud není synchronizovaný v cache. Obvyklým řešením je rozdělit soubory v tomto adresáři do více pod-adresářů dle zvoleného klíče, např dle přiděleného id [0-9] nebo názvu [a-z]. Tento přístup používá například PHP pro ukládání session na filesystém viz dokumentace [[http://cz.php.net/manual/en/session.configuration.php#ini.session.save-path|session.save_path]] (//There is an optional N argument to this directive that determines the number of directory levels your session files will be spread around in.//). \\ Pro představu, načtení obsahu na server class disk poli * ke strukturovaným datům 80.000 souborů = 0.049s * jeden nafouklý adresář 500.000 souborů = 11.687s ===== Připojení z PHP na Mysql 4.0 ===== Connect na Mysql 4.0 (mysql40.unihost.cz) databáze z * PHP 5.3 (ww2.unihost.cz) není možný přes extensions [[http://cz.php.net/manual/en/book.mysql.php|mysql]] ani [[http://cz.php.net/mysqli|mysqli]]: ''Connecting to 3.22, 3.23 & 4.0 is not supported. Server is 4.0.27-log'' * PHP 5.2 bez problémů * PHP 4 (ww1.unihost.cz) bez problémů Connect na Mysql 5.[1-5] z PHP 4 i 5 je bez problémů. ===== PHP 4 a náhodný problém session ===== V rámci [[http://cz.php.net/manual/en/book.session.php|session]] nejsou při některém requestu přístupná _SESSION data - vrací prázdné Array. Později zase ano - bez ztráty dat. [[http://cz.php.net/session_id|Session_id]] se nezmění. Problém bude na straně PHP 4 (Apache modul) - po přesunu web aplikace na PHP 5 server problém vždy přestane. Session handler je standardní file, file existuje, obsahuje data a má správná práva. Je tedy divné, že PHP jej občas nepřečte (testováno i s [[http://cz.php.net/session_write_close|session_write_close]]). Error reporting nic nehlásí. ===== Změna wwwroot ===== možností je mnoho, dvě nejpoužívanější - seřazeno od nej ==== Výchozí adresář web jako wwwroot ==== wwwroot umístit do výchozího adresáře ''domena.tld/www/web/'' \\ a knihovny (například framework) do adresáře o úroveň výš - například ''domena.tld/www/inc/'' \\ Pak je inc adresář nezobrazitelný z webu přímo. ==== wwwroot změněný přes rewrite ==== Pokud je celý web (veřejné www i privátní knihovny) nahrán do výchozího adresáře ''domena.tld/www/web/'' pak přes [[http://httpd.apache.org/docs/trunk/rewrite/|rewrite]] a ''[[http://httpd.apache.org/docs/trunk/howto/htaccess.html|.htaccess]]'' nastavit například RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ www/index.php/$1 [L] V tomto případě je potřeba ještě zohlednit umístění statického obsahu css, img, js, ... \\ A do privátních adresářů nahrát ''[[http://httpd.apache.org/docs/trunk/howto/htaccess.html|.htaccess]]'' \\ Order Allow,Deny Deny from all ===== Zakázání spuštění PHP per adresář ===== Pro adresáře kam uživatelé mohou nahrávat soubory (např avatars) je vhodné zakázat spuštění PHP. Pak nespustí škodlivé skripty například pro rozesílání spamu. Do adresáře nahrajte ''.htaccess'' s obsahem: # zde nemaji php scripty co delat, jde nejspis o podvrzene viry, zakazat Order Deny,Allow Deny from All ===== Připojení na IMAP.unihost.cz z PHP ===== // přes SSL var_dump(imap_open("{imap.unihost.cz:995/pop3/ssl}", $user, $heslo)); var_dump(imap_open("{imap.unihost.cz:993/imap/ssl}", $user, $heslo)); // resource(4) of type (imap) // přes TLS var_dump(imap_open("{imap.unihost.cz:110/pop3/tls}", $user, $heslo)); var_dump(imap_open("{imap.unihost.cz:143/imap/tls}", $user, $heslo)); // resource(4) of type (imap) # 25.2.2014 testováno a již není nutné # novalidate-cert je nutný přestože certifikáty jsou validní a podepsané cert autoritou, kvůli akceptování kořenového certifikátu CA. # unable to get local issuer certificate: /C=US/O=GeoTrust, Inc./CN=RapidSSL CA (errflg=2) Testováno na PHP 5.3.9, 5.3.10, 5.3.28. Dokumentace [[http://cz.php.net/imap_open|imap_open]]. ===== PHP FPM a REDIRECT_URL ===== v [[http://cz1.php.net/manual/en/install.fpm.php|FPM]] verzi neexistuje ''$_SERVER['REDIRECT_URL']'' narozdíl od Apache PHP module. \\ Naivní způsob nahrazení $REDIRECT_URL = (strpos($_SERVER['REQUEST_URI'], '?') ? substr($_SERVER['REQUEST_URI'], 0, strpos($_SERVER['REQUEST_URI'], '?')) // obsahuje QUERY_STRING : $_SERVER['REQUEST_URI']); ===== PHP FPM a REMOTE_USER ===== Pro [[http://httpd.apache.org/docs/current/mod/mod_auth_basic.html|Apache HTTP Basic Authentication]] v [[http://cz1.php.net/manual/en/install.fpm.php|FPM]] verzi neexistuje ''$_SERVER['REMOTE_USER']'' narozdíl od Apache PHP module. Ale je zde ''$_SERVER['REDIRECT_REMOTE_USER']'' a také ''$_SERVER['Authorization']''. Testováno na 5.5.21 a 5.3.21. ===== Změna PHP conf ===== PHP běžící jako [[http://cz.php.net/manual/en/install.fpm.php|FPM]] nečte upravené PHP conf z ''.htaccess'' (například //php_flag short_open_tag on//), ale z [[http://cz.php.net/manual/en/configuration.file.per-user.php|.user.ini]]. \\ Naopak uvedení ''php_flag'' v ''.htaccess'' vede k ''HTTP/1.1 500 Internal Server Error'', \\ v HTTP error logu (ISPA = HTTP debug log) pak chyba: \\ ''[alert] ... .htaccess: Invalid command 'php_flag', perhaps misspelled or defined by a module not included in the server configuration'' \\ Hodnoty jsou cached by PHP: //user_ini.cache_ttl controls how often user INI files are re-read. The default is 300 seconds (5 minutes).// \\ Správné použití je tedy # .user.ini short_open_tag=on max_input_vars=2000 ===== WordPress zabezpečení ===== * [[https://codex.wordpress.org/Hardening_WordPress|Hardening WordPress]] * [[https://www.owasp.org/index.php/OWASP_Wordpress_Security_Implementation_Guideline|OWASP Wordpress Security Implementation Guideline]]