Category Archives

36 Articles

Zabezpečení přístupu do adresáře (.htaccess a .htpasswd)

by Zdeněk Večeřa 0 Comments

Pokud chcete do vybrané složky umožnit přístup jen uživatelům, mající login a heslo, můžete tak učinit následovně. Veškeré přístupy budou podléhat http ověření (HTTP autentizace).

Postačí vám webový server Apache, .htaccess a .htpasswd

  1. Vygenerujte hesla pro uživatele (vygenerování .htpasswd); můžete tak učinit například na této adrese: http://projekty.remontsw.eu/htaccess_generator/
  2. Vygenerovaná hesla uložte do  souboru .htpasswd, který umístěte „někam“ na server. Obsah souboru .htpasswd může vypadat například takto:
    liga:MQasRkO.UOKzY
    admin:MQpwCAGbdsh7w
  3. Vytvořte v dané složce, kterou chcete zabezpečit, soubor .htaccess s následujícím obsahem:
    AuthUserFile /ABSOLUTNÍ_CESTA/.htpasswd
    AuthName "Zadej tajné heslo"
    AuthType Basic
    require valid-user

    Včásti AuthUserFile je nutné uvést absolutní (úplnou) cestu k souboru .htpasswd (cesta v rámci disku serveru, ne URL!). Jak cesta vypadá může prozradit proměnná $_SERVER[‚DOCUMENT_ROOT‘], kterou lze vypsat pomocí PHP. Případně pomocí funkce phpinfo();

Postřehy: snažím se přejít z Eclipse PDT na NetBeans (PHP), jsou ale problémy

by Zdeněk Večeřa 5 Comments

Přibližně rok a půl pro vývoj PHP aplikací používám IDE prostředí Eclipse PDT. Výhody IDE nástrojů oproti aplikacím PSPad nebo Intype nebudu zmiňovat (možná příště).

V Eclipse PDT si založíte nový projekt, do kterého přiřadíte soubory. Práce s většími PHP soubory, řekněme okolo 100 kB (cca 3 300 řádků) je ale (aspoň v mém případě) problematická. Eclipse PDT nestíhá. Úpravy textu (zdrojového kódu) jsou pomalé, Eclipse PDT reaguje se zpožděním.

Větší soubory v Eclipse dělají IntelliSense nepoužitelné

IntelliSense (našeptávač – doplňování kódu) taktéž reaguje se zpožděním. Zobrazení IntelliSense v takovém souboru netrvá pár milisekund, ale 2-3 vteřiny, což je pro práci zcela nepoužitelné.

Záchranou je NetBeans?

NetBeans je v tomto naštěstí jiný – „takový lepší“. Hlavně tedy rychlejší. IntelliSense je svižné, stejně tak práce se soubory, úpravy, ukládání aj.

Rok a půl používání Eclipse PDT ve mně ale zanechalo i návyky, kvůli kterým je přechod ke konkurenci složitější. Upravil jsem si barevné zobrazení syntaxe (dle Eclipse PDT), prošel klávesové zkratky, stále mi ale u NetBeans několik vlastností vadí.

V čem je lepší Eclipse oproti NetBeans?

Následující chování NetBeans mi docela vadí:

  1. Vlevo se nachází strom se soubory a projekty. Pokud v Eclipse vyberu soubor „index.php“ a udělám ctrl+c a ctrl+v, nakopíruje se jako kopie s názvem „Copy of index.php“. V NetBeans to bohužel nefunguje. Kopírování funguje, akorát je třeba při vkládání klepnout na složku, do které chci provést vložení (u Eclipse stačí mít označený libovolný soubor z dané složky).
  2. K levému stromu souboru ještě jednou. Eclipse jsem si nastavil tak, že stačí jednou klepnout na soubor a hned se vpravo zobrazí jeho obsah. Divné, ale u NetBeans tato možnost asi není (nenašel jsem).
  3. V Eclipse označím text a klávesovou zkratkou ctrl+k ihned dojde k nalezení dalšího výskytu řetězce v souboru. Nemusím tedy otevírat vyhledávací dialog. NetBeans to neumí.
  4. Pokud mám v Eclipse otevřený odkaz, span, div: <div>text, tak mi za slovem „text“ IntelliSense nabídne uzavření tagu. NetBeans bohužel hloupě nenabídne nic.
  5. Další věc se týká nahrazování. Chci provést nahrazení textu v souborech, vyhledávám pomocí regulárních výrazů. Uvedu tedy regulární výraz a text, kterým se má nahradit. Potud v pohodě. Jenže, před provedením se chci ujistit, jestli bude výsledek OK. Eclipse mi nabídne náhled, jak budou úpravy vypadat. NetBeans nikoli.
  6. Když v komentáři zdrojového kódu uvedu „TODO:“, oba nástroje jej pochopí jako úkol ke splnění. Eclipse ale navíc u čísla řádku zobrazí malou ikonku; na první pohled je vidět, že se musí něco dodělat. NetBeans nezobrazí nic.
  7. Mám proměnnou $test = 5;. Když na ni v Eclipse klepnu kurzorem následovaným klávesovou zkratkou ctrl+shift+j, vytvoří se nad ní komentář, kde k ní uvedu, co potřebuji. NetBeans to asi neumí (jen ve třídě po zahájení psaní komentáře /** a enteru).
  8. V NetBeans mi nefunguje posun horizontálního posuvníku při naklonění kolečka myši doleva/doprava.
  9. Když v Eclipse PDT napíši: <?, tak automaticky dopní php ?>. NetBeans bohužel nedoplní nic.

Napadá váš řešení? Pokud NetBeans výše uvedené chování zvládá, dejte, prosím, vědět do komentářů pod článkem.

PHP: Porovnání rychlosti str_replace() a preg_replace()

by Zdeněk Večeřa 1 Comment

Podívejme se na porovnání rychlosti funkcí str_replace() a preg_replace(), které lze použít pro nahrazení řetězce řetězcem.

$url = 'http://google.com/1/../2/././';

for ($i = 0; $i < 1000000 ; $i++){
str_replace('/./', '/', $url);
}
// Doba běhu: 1.6402 s

for ($i = 0; $i < 1000000 ; $i++){
preg_replace('/(\/\.\/)/', '/', $url);
}
// Doba běhu: 5.0405 s

Pokud chcete jen nahradit řetězec a nepotřebujete využít síly regulárních výrazů, využijte funkci str_replace(). Dle měření zpracování bude až 3× rychlejší než v případě preg_replace().

UTF-8, MySQL, kódování a PHP funkce pro práci s řetězci: strlen, substr aj.

Možná jste při práci s PHP narazili na problém s UTF-8 kódováním. Doposud jste využívali kódování cp1250 nebo iso-8859-2 a nebyl problém. Okolnosti vás přinutily požívat UTF-8 a najednou bum. Na stránkách se vám chybně vypisují znaky s českou diakritikou a nevíte co s tím.

Jak správně použít UTF-8 a MySQL?

Je třeba dodržet následující pravidla:

  1. Po připojení nastavit kódování, ve kterém bude probíhat komunikace s databázovým serverem:
    mysql_query("SET NAMES 'utf8'");
    nebo 
    mysql_query('SET CHARACTER SET utf8');
    
    Od PHP 5.2.3 a MySQL 5.0.7 raději použijte:
    mysql_set_charset('utf8');
    
    Je to správná a bezpečná varianta
    pro použití mysql_real_escape_string(). Více: 1, 2, 3.
  2. Kódování PHP souborů nastavit na UTF-8 (pozor na počáteční UTF-8 boom znak)
  3. Odesílat hlavičky s UTF-8 kódováním:
    header('Content-Type: text/html; charset=utf-8');
  4. Nastavit UTF-8 kódování v HTML (meta tagy, xml hlavička aj.)
  5. Používat PHP řetězcové funkce, které zvládají UTF-8 (viz dále)

PHPMailer: Snadné posílání (HTML) e-mailů z PHP

by Zdeněk Večeřa 2 Comments

E-mail, obálka, dopis

Pokud potřebujete z webu, kde běží PHP, posílat e-maily, můžete sáhnout po funkci PHP mail(). Jsou s ní trochu starosti, protože musíte myslet na kódování a nesmíte zapomenout na správné uvedení hlaviček (headers).

PHPMailer: Pomocná ruka při posílání e-mailů

Na pomoc přichází PHP knihovna PHPMailer, která zastřešuje vše okolo posílání e-mailů. Můžete ji využít pro posílání nejen přes funkci mail(), ale můžete e-maily zasílat i skrz existující SMTP server (tedy reálnou e-mailovou adresu).

Kódování a HTML e-maily bez problému

S knihovnou PHPMailer jednoduše vytvoříte HTML e-maily s obrázky a přílohou. Nemusíte se ani obávat, že bude problém s kódováním, jako se stává, když bez znalostí pracujete přímo s funkcí mail(). PHPMailer se o vše postará za vás.

Vydán CKEditor 3.0: Nová generace wysiwyg editoru FCKeditor je tu

CKEditor, FCKEditor

Oblíbil jsem si kvalitní FCKeditor, se kterým je psaní a úprava textů v administraci hračka. Přestože bych mu několik drobností vytknul, tak největší problém vidím v jeho rychlosti. Ano, je rychlý, ale jeho načtení a zobrazení by mohlo být rychlejší.

FCKeditor a jeho 6 let úspěchu

Ani se to nezdá, ale FCKeditor je vyvíjen už šest let a za tu dobu si získal velkou oblibu nejen mezi uživateli, ale i vývojáři. Troufám si tvrdit, že spolu s TinyMCE patří mezi nejoblíbenější a nejznámější open-source editory.

CKEditor 3.0: Nová generace přichází

Šest let stáří FCKeditoru je mírně znát, proto vývojáři poslední téměř dva roky pilně pracovali na další verzi, která získala nové jméno: CKeditor.

Prakticky vzato, CKeditor je pokračování FCKeditoru, takže se nenechte zmást, že by zde byl další produkt.

Proč došlo k přejmenování?

Vývojáři se pro změnu názvu rozhodli kvůli jeho problémové výslovnosti v anglicky mluvících zemích.

MySQL: Rychlost UPDATE sloupce v závislosti na přítomnosti indexů

Nedávno jsme s Lukášem Churým a Ondrou Vašíčkem řešili rychlost operace UPDATE v závislosti na tom, jestli upravovaný sloupec má či nemá nastavený index.

Představte si, že máme v MySQL 5.0 tabulku o několika sloupcích, dva z nich jsou „id“ a „xy“. Nad sloupcem „id“ je přidělený index. Sloupec „xy“ index nemá. Rychlost UPDATE sloupce „xy“ trvá nějaký čas.

Otázka zní, jestli UPDATE zabere stejný čas i v případě, kdyby sloupec „xy“ měl přidělený index.

Udělal jsem jednoduchý test, který přináší odpověď.

Jak na to: SQL injection, magic_quotes_gpc, addslashes() a stripslashes()

V názvu článku jsem vyjmenoval slova, která jsou strašákem nejednoho PHP programátora. Strašák to je ale pouze uměle vytvořený, vycházející z neznalosti problematiky.

Dost často se ve spojení s SQL injection (typ útoku hackera) zmiňuje PHP konstanta magic_quotes_gpc. Prý, že pokud je zapnutá, tak se dá SQL injection předejít. A víte, že od PHP 5.3 bude standardně magic_quotes_gpc vypnutá?

Znamená to, že poté budou SQL dotazy napadnutelné pomocí SQL injection? Ale vůbec ne.

Konstanta magic_quotes_gpc totiž s ochranou SQL injection nemá v podstatě nic společného. Pouze zde existuje průsečík v možnosti jejího využití. Proto ji neznalí programátoři začali přisuzovat větší váhu, než má. Váha magic_quotes_gpc je samozřejmě nulová, zvláštně, když od PHP 5.3 bude vypnutá a v PHP 6 zanikne úplně.

Vysvětleme si tedy, oč jde. SQL injection je vážný problém.

mPDF: Snadný export HTML stránek do PDF

by Zdeněk Večeřa 7 Comments

FDFDoposud jsem neznal nějaký snadný a efektivní způsob exportu HTML stránek do PDF formátu, za pomocí PHP. Ano, existuje PHP třída FPDF, ale něco v ní vytvořit mi zrovna jako efektivní nepřijde. Viz kus kódu. Pokud byste FPDF přece jen použili, mrkněte k Zaachimu na blog. Radí tam, jak na české znaky.

Nad touto třídou existuje nástavba, troufám si říct „naštěstí“. Jmenuje se mPDF a nabízí přímý export z HTML stránek do PDF za podpory UTF-8 kódování, tedy s bezproblémovou interpretací českých znaků.

FCKeditor: získání obsahu a vložení textu

by Zdeněk Večeřa 0 Comments

Vytvoření formuláře FCKeditoru pomocí PHP

<?php
$oFCKeditor = new FCKeditor('body') ;
$oFCKeditor->Value = $form['body'];
$oFCKeditor->Create();
?>

Získání obsahu formuláře FCKeditoru:

<input type="button" onclick="alert(FCKeditorAPI.GetInstance('body').GetData());" value="Submit" />

Vložení textu do formuláře FCKeditoru:

<input type="button" onclick="FCKeditorAPI.GetInstance('body').InsertHtml('<strong>ahoj</strong>');" value="Submit" />