Změny po vydání článků

7.5.2018 Bezpečné přihlašování uživatelů
Jistou nevýhodou je, že poslání hmac_md5(password, old_challenge) a md5(hmac_md5(password, new_challenge)) dovolí útočníkovi se znalostí hesla toto heslo změnit, aniž bychom to mohli detekovat a uživatele třeba upozornit.
11.3.2018 Jednorázové heslo
Pokud informaci o tajemství nechcete předávat třetí straně, můžete QR kód vygenerovat lokálně, např. pomocí knihovny QR Code.
16.1.2018 Kniha 1001 tipů a triků pro PHP
Zakoupit si ji můžete pomocí této stránky. Při osobním převzetí stojí 397 Kč, doporučená zásilka je o 70 Kč dražší, zaslání do zahraničí stojí 275 Kč. Zásilku neposílám na dobírku, ale je potřeba ji předem uhradit bankovním převodem – instrukce se zobrazí po vyplnění objednávkového formuláře. Knihu už neprodávám, kupte si ji přímo u nakladatele
24.4.2017 Hra pro děti: Monopoly
Ještě se chystám udělat Dostihy a sázky, které se hrají velmi podobně, což by mohlo pomoci s oddělením herního enginu od herních dat. Dodělal jsem také Dostihy a sázky.
20.4.2017 Hry pro děti

Monopoly

Viz samostatný článek.

29.6.2016 Ukládání dat do cookie
Do cookie lze typicky uložit jen 4 KB dat, takže pro větší objemy dat se toto řešení bohužel nehodí.
17.6.2016 Římské číslice
Viz také novější článek na stejné téma.
23.2.2016 Protobuf a NaN
Na serveru se protocol buffery přenáší v binárním formátu, na klienta se posílá řetězec obsahující JavaScriptový literál pro pole.
Při mnoha prázdných polích se pak použije formát {"1":1,"2000":"Jakub"}.
3.9.2015 Chyby v knize
263 Za count($array) má být - 1
21.8.2015 DEF CON 23

Let's Encrypt - Minting Free Certificates to Encrypt the Entire Web

★★★★★, Abstract, no slides yet

A great talk about Let's Encrypt. They demoed the command line tool to verify the domain, issue and install the certificate and modify the config files, all in about twenty seconds. They also mentioned DVSNI – a method for validating a domain through TLS.

24.11.2014 Co se mi nelíbí na JavaScriptu

Proměnná arguments

Proměnná arguments, která automaticky vzniká při volání funkce, sice vypadá jako pole, ale ve skutečnosti to pole není, takže na ni nejdou přímo používat metody pole. Je to vynuceno nejspíš tím, že obsah proměnné je svázán s parametry funkce – pokud uvnitř funkce do parametru přiřadíme nějakou hodnotu, projeví se to i v arguments a naopak. To ostatně považuji také za dost pochybnou vlastnost, která může kód spíš znepřehlednit, než že by mu nějak pomohla.

Osobně bych se klonil k tomu, aby funkce s nepojmenovanými parametry vůbec nemohla pracovat a aby volání funkce s více parametry, než kolik jich má, skončilo chybou. Vytvořit pole je v JavaScriptu velmi snadné, takže předat pole hodnot je téměř stejně snadné jako předat hodnoty v parametrech. Naopak to vede k přehlednějšímu API a někdy i přehlednějšímu kódu (protože není třeba používat Function.apply, ale stačí funkci rovnou zavolat).

ECMAScript 6 situaci trochu vylepšuje operátorem spread.

24.10.2014 Chyby v knize
662 Před elseif ($hours >= 2) má být ještě elseif ($days == 1) { return "včera"; }
4.7.2014 Storing multilingual records in the MySQL database
phpMinAdmin Adminer
23.6.2014 Kniha 1001 tipů a triků pro PHP
nebo elektronicky
19.4.2014 Adminer 4.1.0
Přemýšlel jsem i o přidání CAPTCHA, což by zamezilo riziku DoS. reCAPTCHA ale používá privátní klíč, který by musel být součástí Admineru, a ostatní řešení jsou obvykle celkem snadno prolomitelná.
11.1.2014 Adminer – jak šel čas
Odstranění AJAXu
Změna struktury tabulky v SQLite
Nahrávání další stránky
Import více souborů najednou
NoSQL databáze, zvýrazňování syntaxe při psaní
27.12.2013 Effective Java
I didn't finish reading the book so I might add other interesting quotes later.
26.12.2013 Effective Java

It will dictate the serialized form forever. This is not just a theoretical problem. It happened to several classes in the Java platform libraries, including BigInteger.

Note also that defensive copying is not possible for final fields. To use the readObject method, we must make the start and end fields nonfinal.

Do not use the writeUnshared and readUnshared methods. They are typically faster than defensive copying, but they don’t provide the necessary safety guarantee.

19.12.2013 Ukládání hesel
Používání rychlých hashovacích funkcí pro ukládání hesel již není bezpečné, přečtěte si proto také novější článek Ukládání hesel bezpečně.
18.12.2013 Effective Java

Relying on the default deserialization mechanism can easily leave objects open to invariant corruption and illegal access.

17.12.2013 Effective Java

Prior to release 1.5, the double-check idiom did not work reliably because the semantics of the volatile modifier were not strong enough to support it.

In an ironic twist, the ThreadGroup API is weak from a thread safety standpoint. To get a list of the active threads in a thread group, you must invoke the enumerate method, which takes as a parameter an array large enough to hold all the active threads. The activeCount method returns the number of active threads in a thread group, but there is no guarantee that this count will still be accurate once an array has been allocated and passed to the enumerate method. If the thread count has increased and the array is too small, the enumerate method silently ignores any threads for which there is no room in the array.

11.12.2013 Effective Java

Let the client synchronize externally where it is appropriate. In the early days of the Java platform, many classes violated these guidelines. For example, StringBuffer instances are almost always used by a single thread, yet they perform internal synchronization.

9.12.2013 Effective Java

The libraries provide the Thread.stop method, but this method was deprecated long ago because it is inherently unsafe – its use can result in data corruption.

9.12.2013 Effective Java

One example of an exception that fails this test is CloneNotSupportedException. It is thrown by Object.clone, which should be invoked only on objects that implement Cloneable. In practice, the catch block almost always has the character of an assertion failure. The checked nature of the exception provides no benefit to the programmer, but it requires effort and complicates programs.

For example, instead of a String constructor, IndexOutOfBoundsException could have had a constructor that looks like this… Unfortunately, the Java platform libraries do not make heavy use of this idiom, but it is highly recommended.

6.12.2013 Effective Java

Consider the getSize method in the java.awt.Component class. The decision that this performance-critical method was to return a Dimension instance, coupled with the decision that Dimension instances are mutable, forces any implementation of this method to allocate a new Dimension instance on every invocation.

The “semantic gap” between what the programmer writes and what the CPU executes is far greater than in traditional statically compiled languages, which makes it very difficult to reliably predict the performance consequences of any optimization.

5.12.2013 Effective Java

More generally, if a concrete class has no associated interface, then you have no choice but to refer to it by its class whether or not it represents a value. The Random class falls into this category.

3.12.2013 Effective Java

Because of the unfortunate decision to retrofit Arrays.asList as a varargs method in release 1.5, this program now compiles without error or warning. Running the program, however, produces output that is both unintended and useless.

Every invocation of a varargs method causes an array allocation and initialization.

2.12.2013 Effective Java

When in doubt, look to the Java library APIs for guidance. While there are plenty of inconsistencies – inevitable, given the size and scope of these libraries – there is also a fair amount of consensus.

The behavior of this program is counterintuitive because selection among overloaded methods is static, while selection among overridden methods is dynamic.

The confusing behavior demonstrated by the previous example came about because the List<E> interface has two overloadings of the remove method: remove(E) and remove(int).

The rules that determine which overloading is selected are extremely complex. They take up thirty-three pages in the language specification, and few programmers understand all of their subtleties.

For example, the String class exports two overloaded static factory methods, valueOf(char[]) and valueOf(Object), that do completely different things when passed the same object reference. There is no real justification for this, and it should be regarded as an anomaly with the potential for real confusion.

27.11.2013 Effective Java

Inexplicably, the authors of the ObjectOutputStream API did not take advantage of the Serializable interface in declaring the write method. The method’s argument type should have been Serializable rather than Object. As it stands, an attempt to call ObjectOutputStream.write on an object that doesn’t implement Serializable will fail only at runtime, but it didn’t have to be that way.

22.11.2013 Effective Java

Enum constructors aren’t permitted to access the enum’s static fields, except for compile-time constant fields. This restriction is necessary because these static fields have not yet been initialized when the constructors run.

22.11.2013 Výčtový typ
Aby se nemusely vytvářet nové a nové objekty při každém přístupu ke konstantě a taky aby platilo PageSpecial::home() === PageSpecial::home(), tak se vytvořené objekty ukládají do keše. Alternativou by bylo statické metody zrušit, konstruktor zveřejnit a v případě předání neplatné hodnoty vyvolat výjimku.
21.11.2013 Effective Java

For example, it is illegal to create an array of a generic type, a parameterized type, or a type parameter.

It also means that you can get confusing warnings when using varargs methods in combination with generic types. This is because every time you invoke a varargs method, an array is created to hold the varargs parameters. If the element type of this array is not reifiable, you get a warning. There is little you can do about these warnings other than to suppress them, and to avoid mixing generics and varargs in your APIs.

It would be nice if the language did the same kind of type inference when invoking constructors on generic types as it does when invoking generic methods.

It doesn’t seem right that we can’t put an element back into the list that we just took it out of.

The next thing to notice is that the value type of the favorites Map is simply Object. In other words, the Map does not guarantee the type relationship between keys and values, which is that every value is of the type represented by its key. In fact, Java’s type system is not powerful enough to express this.

17.11.2013 Proč mám rád PHP

Když chci v PHP zjistit, jestli řetězec obsahuje regulární výraz, použiji funkci preg_match($re, $string). Když chci zjistit, jestli celý řetězec odpovídá regulárnímu výrazu, přidám stříšku a dolar. V Javě ke stejnému účelu slouží obrat Pattern.compile($re).matcher($string).find() resp. Pattern.compile($re).matcher($string).matches(). Java nabízí i zkratku Pattern.matches($re, $string), pro metodu find ale žádná zkratka neexistuje. Navíc tato zkratka je nevhodná, protože při opakovaném použití se regulární výraz znovu a znovu kompiluje. PHP si naproti tomu zkompilovanou verzi ukládá do keše. Regulárních výrazů je obvykle jen omezený počet a jsou poměrně krátké, takže to ničemu nevadí. V Javě se zkompilovaný regulární výraz obvykle ukládá do konstanty, ale to znemožňuje použití zkratky. Stejně tak metoda String.replaceAll – když pominu nešťastnou existenci metod replace a replaceAll, kde každá dělá něco jiného, tak jde opět o zkratku nevhodnou k používání. To by sakra nemohla metoda replaceAll přijímat i Pattern?

Další ukázkou nepohodlného API v Javě je práce s XML dokumenty. Načtení XML dokumentu z řetězce (tedy obdobu DOMDocument::loadXML) zajišťuje obrat (new DocumentBuilderFactoryImpl()).newDocumentBuilder().parse(new InputSource(new StringReader(html))). Jak se dokument do XML řetězce zase uloží (tedy obdobu DOMDocument::saveXML), snad ani nechcete vědět.

16.11.2013 Effective Java
For example, java.net.URL’s equals method relies on comparison of the IP addresses of the hosts associated with the URLs. Translating a host name to an IP address can require network access, and it isn’t guaranteed to yield the same results over time. This can cause the URL equals method to violate the equals contract and has caused problems in practice.
Note: The defined behavior for equals is known to be inconsistent with virtual hosting in HTTP.
15.11.2013 Effective Java
There are several constant interfaces in the Java platform libraries, such as java.io.ObjectStreamConstants. These interfaces should be regarded as anomalies and should not be emulated.
11.11.2013 Tajemství
Trochu kontroverzní je myšlenka pomalost hašovací funkce (parametr cost) přizpůsobit délce a složitosti hesla. Sice tím útočníkovi prozradíme sílu hesla jednotlivých uživatelů, ale zároveň tím uživatelům dovolíme používat krátká (třeba šestiznaká) hesla a přitom si nezpůsobíme DoS u uživatelů používajících hesla dlouhá. Podle mého názoru je takováto transparentnost v pořádku.
16.10.2013 Řešení alert(1) to win
16
4.10.2013 Perfect forward secrecy
držiteli soukromého klíče v
10.9.2013 Google Chrome
Řeší např. Last Tab Keepalive.
Hesla na
Řeší např. RSS Subscription Extension.
13.7.2013 Unikátní klíč nad dlouhým řetězcem
třídění řazení
30.6.2013 Navštívení všech odkazů na webu
Na několika místech se používá jednoduchá funkce idx, která měla být zahrnuta do PHP v momentě, kdy přístup k neinicializovaným prvkům pole začal vyhazovat E_NOTICE.
30.6.2013 Chyby v knize
515 Proměnná $structure nemá být předaná
27.11.2012 Hromadná aktualizace záznamů
Pokud máme jistotu, že záznamy existují, můžeme použít příkaz INSERT s klauzulí ON DUPLICATE KEY UPDATE a využitím funkce VALUES():
20.10.2012 Statické proměnné v metodách
Myslíte si, že víte? A co když by se definice změnila takhle?
4.10.2012 Funkce window.setTimeout v PHP
Alternativou je nastavit $timeouts = &self::$timeouts a poslat to callbacku přes use (&$timeouts).
29.8.2012 Prostor pro pracovní nabídky
Při dlouhodobější spolupráci nabízím cenu 3000 Kč za měsíc bez DPH.
24.8.2012 Zabití pomalých dotazů
Od MySQL 5.0 lze použít příkaz KILL QUERY.
8.8.2012 Tipy pro Adminer
druhé kliknutí kliknutí na šipku
30.6.2012 Tipy pro Adminer
Shift+click na zaškrtávací políčko označí jejich rozsah.
20.2.2012 Automatické zabezpečení
Přesně tohle dovoluje udělat implementace v HipHop for PHP.
3.10.2011 Školení: Programování v PHP 5
foto Michal Špaček se PHP profesionálně věnuje od roku 2000, v současnosti působí v pražské vývojové kanceláři Skype jako vedoucí vývojář webových aplikací. Má zkušenosti s platebními systémy i aplikacemi s vysokou návštěvností. Michala jste mohli několikrát vidět přednášet na WebExpu, případně se s ním setkat jako s pořadatelem IPO48 v Praze.
Jakub Vrána, , IČ: 69777624
3.10.2011 Školení: Úvod do PHP
foto Michal Špaček se PHP profesionálně věnuje od roku 2000, v současnosti působí v pražské vývojové kanceláři Skype jako vedoucí vývojář webových aplikací. Má zkušenosti s platebními systémy i aplikacemi s vysokou návštěvností. Michala jste mohli několikrát vidět přednášet na WebExpu, případně se s ním setkat jako s pořadatelem IPO48 v Praze.
Jakub Vrána, , IČ: 69777624
3.10.2011 Školení: Konfigurace a výkonnost MySQL
foto Antonín Faltýnek se již řadu let pohybuje v prostředí aplikací pro bankovní domy, kde je kladen velký důraz na vysokou dostupnost a výkon. Profesionálně se věnuje databázím Oracle, PostgreSQL a MySQL a vyvíjí serverové aplikace v Javě.
Jakub Vrána, , IČ: 69777624
3.10.2011 Školení: Výkonnost webových aplikací
foto Michal Špaček se PHP profesionálně věnuje od roku 2000, v současnosti působí v pražské vývojové kanceláři Skype jako vedoucí vývojář webových aplikací. Má zkušenosti s platebními systémy i aplikacemi s vysokou návštěvností. Michala jste mohli několikrát vidět přednášet na WebExpu, případně se s ním setkat jako s pořadatelem IPO48 v Praze.
Jakub Vrána, , IČ: 69777624
3.10.2011 Školení: JavaScript a AJAX
foto Kristýna Knapová absolvovala MFF UK a pracuje jako analytička a programátorka webových informačních systémů (např. GOSys). Kromě toho také působí jako lektorka kurzů a autorka vzdělávacích materiálů.
Jakub Vrána, , IČ: 69777624
3.10.2011 Školení: Návrh a používání MySQL databáze
foto Antonín Faltýnek se již řadu let pohybuje v prostředí aplikací pro bankovní domy, kde je kladen velký důraz na vysokou dostupnost a výkon. Profesionálně se věnuje databázím Oracle, PostgreSQL a MySQL a vyvíjí serverové aplikace v Javě.
Jakub Vrána, , IČ: 69777624
3.10.2011 Školení: Bezpečnost PHP aplikací
foto Michal Špaček
Jakub Vrána, , IČ: 69777624
18.9.2011 Školení: Programování v PHP 5
dědičnost, statické metody, abstraktní třídy, rozhraní, magické metody, klonování
budoucnost PHP PHP 6
17.9.2011 Ohlasy na školení JavaScript a AJAX

Děkuji Vám za materiály a školení, od kterého jsem očekávala tři věci. V první řadě, že si poslechnu základ od odborníka a udělám si pořádek v dříve získaných znalostech tak, abych na nich mohla dále stavět. Dále že se konečně dozvím, jak JS pořádně ladit, neboť do této doby jsem to dělala dosti pokoutně. A na závěr, že se zbavím pocitu, že JS je nutné zlo, které na mě odevšud vyskakuje. Školení bylo velmi srozumitelné a odcházela jsem s pocitem, že se nakonec s tímto skriptovacím jazykem přece jen asi skamarádím :-). Shrnutí: Školení splnilo všechna moje očekávání, nemám, co bych vytkla.

16.9.2011 Ohlasy na knihu
Mastodont, 16.9.2011 – recenze na blogu
10.9.2011 Ohlasy na školení Úvod do PHP

Školení nadmíru splnilo mé očekávání začátečníka v PHP. Velice se mi líbilo rozdělení kurzu na dopolední teoretickou část, kdy jsme si mohli vyzkoušet přednášenou teorii na drobných příkladech a odpolední část, kdy jsme pod vedením lektora naprogramovali malou aplikaci. Musím říct, že to chvílemi připomínalo kurz rychlopsaní, protože narozdíl od lektora jsme neznali zkratky v programu a hodně funkcí jsme museli vypisovat ručeně, což nám trochu zdržovalo. Závěrem školení jsme si mohli nabyté zkušenosti otestovat v závěrečném testu. Při kontrole nás lektor upozornil na chyby nebo ukázal jiné, elegantnější řešení.

10.9.2011 Ohlasy na školení PHP 5

Já bych chtěl poděkovat za školení, bylo přesně podle mých představ a bylo pro mne velmi přínosné. Účastnil jsem se především kvůli objektovému programování v PHP, což byla hlavní část školení, ostatní části jsem víceméně již znal, ale i tam bylo několik postřehů pro mne podnětných. Velmi oceňuji názorné ukázky na příkladech, na kterých jsem danou problematiku snadněji pochopil. Tempo školení bylo svižnější, což mi plně vyhovovalo, díky němu se toho stihlo probrat hodně. Uvažuji ještě také o účasti na školení o bezpečnosti PHP aplikací v příštím týdnu.

1.9.2011 Kniha 1001 tipů a triků pro PHP
Anděl, nad eskalátory z metra
9.8.2011 Kdy použít isset() a kdy NULL?
nebo funkcí is_null
3.8.2011 Rozšíření pro NotORM
(zatím pouze ve vývojové verzi)
2.8.2011 OpenID na tomto blogu
a $_GET["id"] a
a původní obsah pole $_POST si při komunikaci se serverem ukládá do session proměnné
29.7.2011 Kdy použít isset() a kdy NULL?
Totéž se týká i metody offsetExists.
28.7.2011 Inicializace proměnných
Viz také Hledání neinicializovaných proměnných.
21.7.2011 Adminer 3.3.0
litevský a
18.7.2011 Brainfuck
že pro přímý přístup k jednotlivým znakům řetězce se používají složené závorky a
7.7.2011 Dobře testovatelný špatný kód
Co na to říká spoluautor dokumentu? E-mailem jsem poslal dotaz Miškovi s popisem mých výhrad. Odpověděl, že v popsaném případě by změnil metodu na computeSalesTax(Address $address, $amount, $tax) a volající kód upravil tak, aby nevolal computeSalesTax($address, $invoice->getSubTotal()), ale místo toho prošel všechny položky na faktuře a celkovou daň si sám nasčítal. Podle mě to dobře ilustruje hlavní nevýhody „dobře testovatelného kódu“: interní změna, která by měla být ve výhradní zodpovědnosti třídy SalesTaxCalculator, se projeví změnou API a část logiky (sečtení jednotlivých daní) musíme přesunout do volajícího kódu (což může vést k nekonzistenci a chybám).
22.6.2011 Náhodná čísla
Při zapnuté extenzi OpenSSL se dá od PHP 5.3.0 použít také funkce openssl_random_pseudo_bytes.
21.6.2011 Kniha 1001 tipů a triků pro PHP
Knihu mám skladem okamžitě k odběru.
6.6.2011 Může mít třída Image metodu resize?
, Jan Tichý
Jan Tichý, např.
30.5.2011 Srovnání rychlosti Admineru a phpMyAdminu
o
27.5.2011 Zpracování ikon
Na adrese http://www.google.com/s2/favicons?domain= běží webová služba pro získávání ikon ve formátu PNG.
20.5.2011 Cena změn
stejně obdobně
19.5.2011 Chyby v knize
302 Nemá být $this->link =
5.5.2011 Ohlasy na knihu
Petr Chlebek, 24.4.2011 – recenze na Chytrák Tim
2.5.2011 Chyby v knize
676 Místo kontanty/ má být kontakty/
682 Místo eregI("") má být preg_match("()i")
939 Za „Pokud je kešování povolené, je možné“ chybí „ho“
990 Za „Pro každou verzi je“ chybí „k“
1.5.2011 Kniha PHP a MySQL bez předchozích znalostí
Nakonec jsem si ji musel napsat sám: 1001 tipů a triků pro PHP.
5.4.2011 Ohlasy na knihu
Michal Maňák, 4.4.2011 – recenze na blogu
21.3.2011 Ohlasy na knihu
Jaroslav Šindler, 21.3.2011
19.3.2011 Tipy pro Adminer
V PostgreSQL slouží sloupec Auto Increment ve změně tabulky k vytvoření typu serial, případně bigserial.
17.3.2011 Ohlasy na knihu
Martin Malý, 17.3.2011 – Stručné misantropické informace
17.3.2011 Ohlasy na knihu
Radek Hulán, 17.3.2011 – názor na Zdroják.cz
17.3.2011 Kniha 1001 tipů a triků pro PHP
Nejste si jisti, jestli se vám bude kniha hodit? Přečtěte si reakce začínajících i velmi zkušených programátorů.
14.3.2011 Kniha 1001 tipů a triků pro PHP
Viz také přehled známých chyb. Můžete si také stáhnout příklady z knihy.
8.3.2011 Rozšíření pro NotORM
skoro
31.1.2011 NotORM v Nette
through via
28.1.2011 Tipy pro Adminer
Nestandardní číslo portu se zadává za dvojtečku, např. localhost:3456.
19.1.2011 Paralelní zpracování
O něco pohodlnější způsob nabízí třída HttpRequestPool.
19.1.2011 Tipy pro Adminer
Vyhledávání <= s prázdnou hodnotou způsobí u NULL sloupců vytvoření podmínky IS NULL, operátor >= zase IS NOT NULL.
Vyhledávání v neřetězcových sloupcích dovoluje uvést více hodnot oddělených čárkami (od verze 3.2.0).
6.1.2011 Unikátní vlastnosti Nette
Šikovné jsou i odkazy na spuštění editoru na řádku s chybou (také mým přičiněním).
Vynikající jsou i n: atributy, které zjednodušují práci a zpřehledňují kód.
Také jde s dobou a naplno využívá možností HTML 5.
Přiznám se, že AJAX v Nette jsem ještě nezkoušel, ale už se na nějaké rozumné využití těším.
Práce s databází je odvozena z mé knihovny NotORM, takže mi nezbývá nic jiného, než ji také vychválit.
3.1.2011 10000 diskusních příspěvků na tomto blogu
10000. příspěvek napsal a vítězem se stal Roman Jakubec.
31.12.2010 Kniha na Slovensko
si můžete nechat zaslat i na Slovensko. běžně nezasílám na Slovensko, protože poštovné činí kolem 200 Kč, což považuji vzhledem k ceně knihy za nepřiměřené. A i když věřím, že by ho byl někdo ochotný zaplatit, tak tuhle službu prostě nehodlám podporovat.
27.12.2010 Kniha na Slovensko
Můj kamarád Juraj Krivda ale na Slovensko před Vánoci z Prahy pojede a uvolil se, že knihu rozešle lokálně. Pokud tedy máte o zaslání knihy na Slovensko zájem, máte jedinečnou příležitost. Možný je i osobní odběr v Košicích a Bardejově. Cena je stejná jako při odběru z ČR, tedy 397 Kč (16 €) při osobním převzetí nebo 467 Kč při odeslání poštou. Zaplatit lze buď převodem na můj český účet nebo PayPalem. Pokud máte o knihu na Slovensku zájem, tak mi prosím do středy 22.12.2010 12:00 pošlete e-mailem svou adresu a já vám pošlu další instrukce. Jde o jednorázovou akci, která se nebude opakovat. Po Novém roce pravděpodobně ani nepojedu do Bratislavy, o čemž jsem dříve uvažoval.
27.12.2010 Kniha 1001 tipů a triků pro PHP
Pokud bude platba na můj účet připsána do pondělí 20.12.2010, tak by zásilka doufám měla dorazit ještě před Vánoci. Pokud jste v minulosti vyplnili předběžnou objednávku, tak tento formulář prosím také vyplňte, čímž svůj zájem o knihu definitivně stvrdíte. Pokud přijdete na křest, tak formulář prosím nevyplňujte.
8.11.2010 Spojování tabulek v NotORM
Položené dotazy (se zapnutou cache):
Pokud by nám nevadilo, že se jméno autora bude přenášet opakovaně (to v tomto případě asi skutečně nevadí), tak můžeme jeden dotaz ušetřit:
4.11.2010 Načtení neexistujícího souboru
Obvykle je ale mnohem lepší tyto chyby při čtení neřešit a ošetřit je až při zápisu.
2.11.2010 Vkládání souborů se syntaktickou chybou
Kromě toho by šla na vstup zavolat funkce eval, to by ale zbytečně zdržovalo.
21.10.2010 Bezpečnostní opatření Admineru
Vývojová verze Admineru také posílá hlavičku X-XSS-Protection: 0 jako obranu před modifikací stránky v IE8 a bezpečnostními problémy ve starších vydáních tohoto prohlížeče.
21.10.2010 Dopsal jsem knihu
Bohužel ještě přesně nevím, kdy kniha vyjde, kolik bude mít stran a za jakou bude cenu (odhaduji kolem 400 Kč). Kniha vyšla začátkem prosince 2010, má 456 stran a přiložené CD a stojí 397 Kč.
21.10.2010 Bezpečnostní opatření Admineru
s extenzí NoScript >= 3.6.9
Nemít v souborovém systému přístupné databáze SQLite s citlivými údaji a nemít právo zápisu do nežádoucích adresářů, nebo si vytvořit přizpůsobení s vlastní metodou login (platí i v případě nastavených výchozích přihlašovacích údajů pro MySQL), nebo používat verzi pouze pro MySQL.
5.10.2010 Total Commander
Opakované mačkání F5 nebo F6 vybírá postupně celou cestu, samotný název a název s koncovkou
27.9.2010 WebExpo 2010 – sobota z mého pohledu
snad s výjimkou chybějící tištěné verze programu
25.9.2010 WebExpo 2010 – sobota z mého pohledu
Článek průběžně doplňuji.
25.9.2010 WebExpo 2010 – pátek z mého pohledu
Článek průběžně doplňuji. Konference pokračovala v sobotu.
5.8.2010 Srovnání funkcí MySQL a PostgreSQL
Pokud dojde v některém příkazu v rámci transakce k chybě, tak se další příkazy neprovedou. To může být někdy na překážku, většinou to je ale žádoucí chování.
2.8.2010 Závorky u jazykových konstrukcí
Závorky se nemusí psát ani při vytváření nového objektu bez předání parametrů konstruktoru (např. new stdClass).
22.7.2010 Ošetřování chyb
může to ale mít velmi nepříjemné následky
15.6.2010 Dopsal jsem knihu
Rejstřík (0)
10.6.2010 Dopsal jsem knihu
V knize lze hledat pomocí vyhledávání na tomto blogu.
10.6.2010 Dopsal jsem knihu
n
2.6.2010 Konfigurace PHP
Práce se vzdálenými soubory pomocí běžných funkcí je velmi pohodlná.
28.5.2010 Vypnutí magic_quotes_gpc
Všimněte si, že se ošetřuje i pole $_FILES, na to se v podobných kódech často zapomíná.
7.5.2010 Google Chrome
Nedokážu zobrazit odeslané a přijaté hlavičky.
6.5.2010 Měsíc bezpečnosti PHP 2010
Uvidíme, jestli budou přijaty. Články byly přijaty.
6.5.2010 NotORM
Omezení výsledku hodnotami v jiné tabulce
19.4.2010 Zkrácení textu s XHTML značkami
V HTML5 lze navíc použít text-overflow: ellipsis.
2.4.2010 Fulltextové vyhledávání Sphinx
která od verze 0.9.9 podporuje kromě angličtiny a ruštiny také češtinu ale opět pouze pro angličtinu a ruštinu. Jako vystudovaný lingvista jsem si pohrával s myšlenkou doplnit i podporu pro češtinu, bohužel to ale je mimo mé časové možnosti
12.16.2009 Co nefunguje v MySQL a jak to obejít
Toto omezení lze obejít pomocí druhého poddotazu.
17.12.2009 Co nefunguje v MySQL a jak to obejít
Využití indexů v poddotazu
16.12.2009 Co nefunguje v MySQL a jak to obejít
dosud
5.11.2009 Kompaktní skeleton Nette
Presentery jsou přímo v základním adresáři.
23.10.2009 Upozornění na narozeniny v SQL
nula 365
Pro vyhodnocení dotazu se bohužel nepoužijí indexy. Pokud by se použít měly, bylo by nutné den, měsíc a rok ukládat zvlášť a podmínku celou přepsat.
20.10.2009 Ohlasy na školení výkonnosti
Jiří Kroupa, Famico
8.10.2009 ClickJacking
přiměje uživatele, aby prováděl útočníkem požadované operace
5.10.2009 Detekce sítě Tor
Mnohem elegantnější a efektivnější možností (i když těžko dohledatelnou) je použít hromadný seznam Tor adres.
5.10.2009 Získání počtu řádek
neefektivní pro dotazy se složitými podmínkami (např. vyhledávání podle masky) nebo pracný pro dotazy
Pokud ale aplikace nemusí pracovat nad více databázemi zároveň, není důvod se mu bránit. Toto řešení bohužel zpracovává všechny výsledky dotazu, takže není příliš výkonné.
11.9.2009 Fulltextové vyhledávání v MySQL
a FULLTEXT (nadpis, clanek). Dotaz by fungoval i s podmínkou MATCH(nadpis, clanek) AGAINST ('$search' IN BOOLEAN MODE), v tom případě by se ale index vůbec nepoužil a dotaz by tak byl výrazně pomalejší.
28.8.2009 Profiler
Dobrou alternativou je Xdebug spolu s WinCacheGrind nebo KCachegrind.
22.8.2009 Adminer – rozšiřitelnost
Nepoužil jsem phpDocumentor, ale vlastní jednoduchý skript:
20.8.2009 phpMinAdmin 1.10.0
Zvýraznění řádků tabulky
24.7.2009 Ošetření chyb InnoDB
V MySQL 5.0.32 byla zavedena proměnná innodb_rollback_on_timeout, která dovolí zapnout původní chování. Skript jsem upravil tak, aby s touto proměnnou počítal.
3.7.2009 Adminer 1.11.0
Vydal jsem verzi 1.11.1, která opravuje chybu při zapnuté extenzi Filter. Alespoň můžeme vyzkoušet, jestli funguje upozorňování na nové verze.
2.7.2009 Zjištění pozice v textu JavaScriptem
Problém s tímto kódem je v tom, že metoda moveStart nás přesune na začátek celého dokumentu, nejen vstupního políčka, takže kód funguje jen pokud je vstupní políčko na začátku dokumentu.
2.7.2009 Odstranění PHP typu resource
Je to asi nejodpornější metoda, jakou jsem kdy napsal, ale opravdu jsem nepřišel na způsob, jak ji napsat obecně. Dlouhý seznam by se dal nahradit funkcí eval, to by ale bylo vytloukání klínu klínem. Metoda využívá toho, že funkce call_user_func_array s parametry předávanými referencí pracovat umí.
24.6.2009 Srovnání funkcí MySQL a PostgreSQL
Modifikátor SQL_CALC_FOUND_ROWS dovoluje zjistit počet všech řádek nezávisle na omezení klauzulí LIMIT.
18.6.2009 Srovnání funkcí MySQL a PostgreSQL
Podpora pravidel, pomocí kterých lze vytvářet virtuální tabulky.
17.6.2009 Srovnání funkcí MySQL a PostgreSQL
PostgreSQL podporuje enum od verze 8.3.
Umělé primární klíče se snadno vytváří příznakem AUTO_INCREMENT. V PostgreSQL je nutné používat sekvence, případně zkratku serial.
V uložených procedurách se dají bez hacků používat různé programovací jazyky. V MySQL jen s hacky.
Někdo může ocenit, že tabulky v rámci jedné databáze lze sdružit do schémat. Osobně mi vyhovuje spíš plochá struktura, takže sám vytvářím spíš více menších databází.
17.6.2009 Ohlasy na školení JavaScript a AJAX

JavaScript a AJAX, to byl perfektně vysvětlený vstup do Ajaxu na pořádným příkladu, kde opět upozorňujete na bezpečnostní rizika. Nemůžu říct, že to umím, ale že to chápu a to mě absolutně stačí na to, abych se to dál učil a rozvíjel, to byl taky účel, proč jsem na školení šel, stejně jako na minulá školení.

17.6.2009 Ohlasy na školení bezpečnosti

Co se týká školení, já prostě nemám, co bych mohl záporně zkritizovat. Na bezpečnosti mě ale překvapilo, že jsem se nesetkal s lidmi ze školení z Úvodu do PHP. Já se učím pomalu, ale když už se něco učím, tak mám rád, když vím, že to je správný a to pro mě znamená i bezpečný. Nevím, jak ostatní, ale mě dá největší práci zbavit se špatných návyků. I když je pravda, že na Úvodu se základy bezpečnosti taky probíraly. Myslím si, že to je velice důležitý pro profesionály, protože si moc dobře pamatuji, kolik rukou se zvedlo, když jste se zeptal, jestli to někdo používá. Ne vždy se zvedly všechny ruce.

9.6.2009 Konfigurace PHP
On Off
magic_quotes_sybase=Off
5.6.2009 Architecture of Adminer
It is possible to log in without filling the form by passing the ?username= parameter. A user can use this feature in a secure environment where he authenticates by some other mean (e.g. on localhost without a remote access or with HTTP authentication). However, it is not possible to pass the password in a GET parameter which would be very insecure. Adminer uses the value of mysql.default_password configuration directive in this case. The demo application uses this approach to automatically log in the users.
22.5.2009 Google Chrome
Vyhledávání nehledá v <textarea>.
Ne vždy funkční příkaz Zkontrolovat prvek.
Stránku se mi nepodařilo obnovit bez využití cache, obvyklé Ctrl+F5 způsobí pouze běžný refresh.
JUSH nezobrazuje odkazy, to ale budu muset asi vyřešit spíš já.
11.5.2009 Zjištění kódování webové stránky
Pro načtení meta značky by se dala použít funkce get_meta_tags.
7.5.2009 Vkládání souborů se syntaktickou chybou
Nakonec jsem přece jen jedno řešení našel.
1.5.2009 Zkrácení názvu vestavěných funkcí
V běžných PHP skriptech zkracování vestavěných funkcí nedoporučuji používat, protože to kromě snížení výkonnosti také zhoršuje čitelnost kódu.
16.4.2009 Vkládání souborů se syntaktickou chybou
Funkce token_get_all rozebere i soubory se syntaktickou chybou
16.4.2009 Operátor IN s prázdnou množinou
dibi patch pending.
14.4.2009 Školení: Výkonnost webových aplikací
certifikát
14.4.2009 Školení: JavaScript a AJAX
certifikát
14.4.2009 Školení: Návrh a používání MySQL databáze
certifikát
14.4.2009 Školení: Bezpečnost PHP aplikací
certifikát
6.4.2009 Traverzování kolem stromu prakticky
Viz také přesuny uzlů.
27.3.2009 Odkaz na předchozí a další záznam
Pokud už máme zjištěné pořadí záznamu, dá se použít také "SELECT * FROM clanky ORDER BY nadpis, id LIMIT 1 OFFSET " . ($poradi - 2).
24.3.2009 Výhody aktivních šablon
Aktivní šablony navíc nemusí držet všechna načtená data v paměti, takže jsou šetrnější.
18.3.2009 Převod kódování MySQL
Jak uvádí MySQL Performance Blog, tak binární sloupce nemohou být součástí fulltextových indexů. Skript by tedy bylo potřeba upravit tak, aby indexy nejdřív odstranil a po konverzi zase vytvořil.
18.3.2009 Školení: Bezpečnost PHP aplikací
Clickjacking
17.3.2009 Nastavování konfiguračních direktiv PHP
(slouží pro nastavování pravdivostních hodnot)
(slouží pro nastavování libovolných hodnot)
u pravdivostních hodnot
pravdivostních
17.3.2009 Ohlasy na školení bezpečnosti

Školení bylo nad mé očekávání! Bylo okořeněno spoustou příkladů, které mě u jiných školení chybělo. Výklad byl podán velice srozumitelně. Individuální přístup ke každému. Závěrečný testík byl velice přínosný pro pochopení probírané problematiky z celého dne..

Děkuji za materiály a vlastní školení, ze kterého jsem byl nadšený. Hltal jsem každé slovo, dokonce i po obědě, kdy si většinou musím dávat sirky do očí, abych vydržel. Na internetu je sice spousta informací o této problematice, ale nikde jsem je neviděl takto komplexně pohromadě a hlavně s reálnými příklady, které dají mnohem více než sáhodlouhý popis. Určitě jsme se neviděli naposled, můžete se mnou počítat na školení Výkonnost webových aplikací.

9.3.2009 Cross Site Scripting pořádně
(%+-)
6.3.2009 Cross Site Scripting pořádně
v XHTML má speciální význam sekvence ]]>
5.3.2009 Srovnání dotazů do závislých tabulek
(MySQL 5.0.32)
(MySQL 5.1.26)
Lokální server, bez SQL keše, jen vybrané sloupce
3.3.2009 Školení: Návrh a používání MySQL databáze
práce se stromovými strukturami

Použití MySQL v PHP:

  • Persistentní připojení
  • Bufferování přenášených dat
  • Nedostupnost připojení k databázi
  • Knihovny MySQLi a PDO
  • Pokročilé funkce phpMyAdmin
3.3.2009 Školení: JavaScript a AJAX
a základní zkušenost s libovolným programovacím jazykem
27.2.2009 Vázání proměnných v MySQLi
(alternativně lze před fetch zavolat $stmt->store_result)
5.2.2009 Ohlasy na školení Úvod do PHP

Školení splnilo mé očekávání. Myslím, že tento kurz v jednodenním bloku ani nelze jinak postavit. Z větší části se jedná o zpočátku trochu hodně sušší teorie, kdy je skutečně nezbytné nejdříve probrat řídící konstrukce jazyka. Bez toho by to ani nešlo. Objektivně, pro člověka, který již v nečem programoval to není problém a jde spíše o naučení správné syntaxe. Pro úplného začátečníka to ale může být poměrně náročné na strávení. Nicméně v rámci jednodenního školení to opravdu jinak nejde. Také předpokládám, že na takovéto školení se nepřihlásí nikdo programátorsky úplně nedotčený ;-) Naštěstí i v této části lektor doplňuje velice důležité informace a připomínky vycházející z hluboké znalosti problematiky, které jednak výklad oživují a jednak jsou to velmi cenné praktické poznatky zejména s ohledem na korektnost, efektivnost, přehlednost a čistotu vytvářeného programového kódu. V druhé části školení jsou probírány už zajímavější pasáže s praktickými ukázkami a cvičeními zejména na propojení s databázemi s využitím nabytých znalostí z předchozí části. Pochopení celé problematiky si každý samostatně otestuje na samostatném jednoduchém úkolu. Po konzultaci vypracovaného řešení lektor naznačí další postup na vylepšení, ošetření dalších důležitých aspektů a směr dalšího studia dané problematiky.

Na školení Úvod do PHP jsem se přihlásil s velkým očekáváním a popravdě jsem byl zvědav, jak se do jednoho dne vejde tak široká problematika. A opravdu, informace tekly ve velkém tempu od začátku až do konce. Rozhodně nemá smysl, aby na tento kurz šel člověk, který nemá s programováním rozsáhlejší zkušenosti a domnívá se, že se to zde naučí. Také díky tomu, že jsem se před kurzem samostudiem seznámil se základními pojmy a syntaxí, neměl jsem s pochopením obsahu kurzu žádný zásadní problém a dal mi přesně to, co jsem dle mého názoru potřeboval. Proložení výkladu názornými příklady vedlo velmi efektivně k rychlému pochopení. Prostě perfektní. Jsem opravdu spokojen a čas, který jsem školením strávil určitě stálo za to vynaložit. Po celou dobu školení jste se držel připravené osnovy a přitom reagoval na individuální schopnosti studentů. Určitě Vás jako školitele a Vaše kurzy doporučím ve svém okolí.

5.2.2009 Ohlasy na školení PHP 5

Následný kurz Programování v PHP 5 jsem absolvoval proto, abych nahlédl do současných objektově orientovaných programátorských technik a nástrojů v PHP 5. Jsem rád, že jsem neváhal a absolvoval oba kurzy za sebou. Bylo zřejmé, že ihned po skončení nebudu schopen celou problematiku vstřebat tak, abych mohl hned začít v PHP 5 objektově programovat, ale to jsem ani neočekával. Doporučuji všem, kdo se chtějí v hutné formě v dobrém slova smyslu dozvědět o nejnovějších nástrojích, postupech a novinkách v posledních verzích PHP, aby neváhali a školení absolvovali.

28.1.2009 Automatická obrana proti CSRF
(token se nedoplňuje u formulářů směřujících na cizí server)
27.1.2009 Přidání hodnoty do unikátního číselníku
Jediná nevýhoda tohoto přístupu je v tom, že u tabulek typu InnoDB se zvedne tabulkový čítač auto_increment (aniž by se někde použil).
27.1.2009 Nákupní košík v cookie
Součástí formuláře a skriptu by měla být obrana proti CSRF.
21.1.2009 Editor SciTE
Moje nastavení a instalátor je k dispozici na mých osobních stránkách.
10.1.2009 Total Commander
V konfiguračním souboru mám v sekci [Packer] ručně nastavenou volbu ExpertMode=1, která umožňuje bez potvrzení spouštět a editovat soubory v archivu.
6.1.2009 ORM z druhé strany
Jistě by šel alespoň do některých IDE dopsat plugin, který by třeba při anotaci @table dokázal seznam vlastností načíst ze struktury tabulky.
5.1.2009 Kouzlo funkcionálního programování
před verzí 5.3.0
29.11.2008 Odeslání formuláře přes AJAX
Pokud by formulář obsahoval více odesílacích tlačítek a my bychom chtěli ve skriptu rozlišit, které chceme použít pro odeslání, bylo by možné funkci předávat místo formuláře objekt tohoto tlačítka.
29.11.2008 Vkládání souborů se syntaktickou chybou
Funkce runkit_lint_file funguje spolehlivě, ale k jejímu použití je nejprve potřeba zapnout extenzi Runkit, která je dle vlastního sloganu „na všechny ty věci, které byste stejně neměli dělat“
26.11.2008 Od ledna 2009 zvyšuji ceny školení
Spolu se zvýšením cen zvednu i slevu pro studenty na 30 %, aby pro ně školení zůstalo dostupné.
24.11.2008 Ohlasy na školení bezpečnosti

Školení bylo dobře připravené a profesionálně vedené. Velmi oceňuji, že jste byl ochoten domluvit se s námi mimo standardní vypisované termíny, přijet na naše pracoviště v důležitý státní svátek a zůstat o hodinu déle oproti původnímu plánu. Ačkoliv už jsem o tématu (bezpečnost PHP skriptů) něco málo předtím věděl, zklamán jsem rozhodně nebyl, protože jsem si plno věcí ujasnil a mnohé další se dověděl. Kromě toho bylo moc fajn tu a tam (třeba o přestávkách) zabrousit i do jiných oblastí. Myslím, že se nám to všem dost hodilo. Moc se mi líbilo, že jste na konec zařadil test a podrobně jej s námi prošel. Dokonale to korespondovalo s praktickým pojetím celého školení.

Školení bylo pro mne hodně inspirativní. O většině druhů bezpečnostních rizik jsem sice v „teoretické rovině“ věděl, třeba proto, že se snažím příležitostně číst populárnější články zabývající se touto tématikou na českém webu (Lupa.cz, Zdroják), nicméně některé způsoby, jak je zneužít – a samozřejmě jak se bránit – by mne skutečně nenapadly. Školení má velmi uspořádanou, přehlednou a promyšlenou strukturu a témata, kterých se dotýká, ilustruje na příkladech včetně řešení problémů, což je velice užitečné. Osobně jsem si odnesl ze školení i spoustu nápadů typu „jak něco udělat“ či „jak navrhovat koncepci webu“. Bylo velmi příjemné, že školitel se orientuje v problematice doširoka a ne jen u bezpečnosti a umí (a nebrání se) odpovědět na většinu dotazů, které jdou nad rámec školení.

14.11.2008 Školení: Návrh a používání MySQL databáze
– poddotazy, triggery, pohledy, uložené procedury
27.10.2008 Ohlasy na školení výkonnosti

Školení dokonce veškerá očekávání předčilo, opravdu velmi dobrá úroveň. Odnesl jsem si spoustu nových poznatků a oprášil staré věcí, které v praxi občas „zapadnou“. (Velmi také děkuji za přínosnou úvodní kapitolu o HTTP protokolu a jeho hlavičkách.)

V konečném výsledku za to poměrně únavná cesta „na otočku“ z Ostravy opravdu stála.

Školení mne zprvu překvapilo prvním tématem „HTTP protokol“. Ve školení výkonnosti PHP aplikací mne to poměrně zarazilo, čekal jsem spíše popis samotného PHP a optimalizaci kódu. Byl jsem ale mile překvapen širokým záběrem výkladu v souvislostech (klientská cache prohlížeče, specifické vlastnosti některých browserů, něco ke konfiguraci webserveru, atd.), které by měl vývojář při návrhu aplikace uvažovat. Přednášející je přístupný diskusi i otázkám (i na obědě :-)). Program je rozdělen do dvou částí, dopolední a odpolední, přičemž i ty jsou dále děleny do bloků oddělených přestávkami. Velmi bych vyzdvihl názorné demonstrování na přípravených příkladech, naopak za mě osobně se musím přiznat, že poslední téma jsem už příliš nevnímal.

27.10.2008 Ohlasy na školení JavaScript a AJAX

Školení bylo výborné, o JavaScriptu jsem se dozvěděl pár věci o kterých jsem předtím jen tušil. A to jsem na školení nešel kvůli JavaScriptu, ale AJAXu. Odpolední část týkající se AJAXu byl pro mne zlatý hřeb celého školení. Co bych ale doporučil pro příště, je udělat školení dvoudenní a věnovat trochu více času příkladům, které by si účastníci dělali sami. Celkově školení hodnotím jako velmi dobré.

Se školením jsem byl velice spokojen. Splnilo přesně to, co jsem od něj čekal. Líbil se mi nejen obsah školení, ale i jeho podání. Nejvíce oceňuji praktický příklad.

27.10.2008 Ohlasy na školení bezpečnosti

Školení Bezpečnost PHP aplikací bylo bezvadně připravené. Model vysvětlení problematiky, způsob obrany a praktický příklad je přesně to, jak by podobná školení měla vypadat. Výklad by podán profesionální formou a přesto pro všechny srozumitelně. Mnohokrát děkuji za množství nápadů, tipů a triků, jak udělat PHP aplikace bezpečnější.

27.10.2008 Ohlasy na školení JavaScript a AJAX

Se školením jsem byl maximálně spokojen, bylo to pěkně seřazené a vykládané srozumitelně. Přestože jsem neměl s JavaScriptem žádné zkušenosti, tak byl výklad srozumitelný.

17.9.2008 Školení: Výkonnost webových aplikací
Viz také Ohlasy na školení.
17.9.2008 Školení: JavaScript a AJAX
Viz také Ohlasy na školení.
17.9.2008 Školení: Návrh a používání MySQL databáze
Viz také Ohlasy na školení.
3.9.2008 Schování části stránky
Elegantnější řešení navrhl Elixon: Na začátek <body> stačí umístit document.body.className += ' javascript'; a styl definovat jako .javascript .hidden-js spolu s ostatními styly.
3.9.2008 Já a PHP
Výkonnost
20.8.2008 Google Code Jam 2008 – kvalifikace
inicializovaný na prázdné pole (což je možné od PHP 5), kterému bohužel v PHP nejde určit výchozí hodnota, takže je před zavoláním fukce potřeba tuto proměnnou nainicializovat na prázdné pole (mohla by to dělat obálková funkce)
25.7.2008 Školení: Výkonnost webových aplikací
Všechna školení se uskuteční na konci června v Brně.
2.7.2008 Požadavek nečekající na odpověď
podporuje při současném přesměrování výstupu např. do /dev/null ale nepodporuje
30.6.2008 Traverzování kolem stromu prakticky
Výpis stromu do seznamu s odrážkami
Při výpisu do seznamu s odrážkami musíme detekovat, jaký je vztah aktuálního a předchozího uzlu. Kód počítá s tím, že hloubka prvků nejvyšší úrovně je 0. Pokud by to byla 1, bylo by potřeba proměnnou $hloubka inicializovat na 0 a na závěr k ní nepřičítat jedinčku.
30.6.2008 Školení: JavaScript a AJAX
nebo se zúčastnit náhradního termínu
30.6.2008 Školení: Návrh a používání MySQL databáze
nebo se zúčastnit náhradního termínu
21.6.2008 Tři videa
uovi
uovi
uovi
10.6.2008 Vytvoření přátelského URL
Viz také Transliterace azbuky.
28.5.2008 phpMinAdmin
španělská a německá
28.5.2008 Vytvoření administračního rozhraní v PHP
Použitý nástroj se jmenuje Adminer Pro.
27.5.2008 Rychlost vkládání do InnoDB tabulek
Příčinou je nastavení direktivy innodb_flush_log_at_trx_commit na výchozí hodnotu 1, které způsobí synchronizaci dat na disku po každé transakci, což je v autocommit režimu po každém příkazu.
14.5.2008 The PHP WTF
Článek byl psán jako Aprílové povyražení a není tedy myšlen vážně.
25.4.2008 Školení: Bezpečnost PHP aplikací
nebo se zúčastnit náhradního termínu
17.4.2008 Potřebujeme další standard pro výměnu dokumentů?
jako spoluautor knihovny PHPExcel
15.4.2008 Kvalifikovaný certifikát PostSignum
Celý proces odpovídá instituci z minulého století. Úřednice ručně opisuje dlouhá čísla do papírové knihy, přeťukává papírové formuláře zpátky do počítače (a to na několik různých míst, naštěstí alespoň dokázala používat schránku), data vyplněná na webu se použijí jen jednou.
21.3.2008 Verze PHP v ČR – únor 2008
stránek
13.3.2008 Velikost nahrávaných souborů
Druhou možností je konktrolovat proměnnou $_SERVER["REQUEST_METHOD"] – pokud má hodnotu POST a přesto je pole $_FILES prázdné, tak nutně došlo k překročení velikosti odesílaných dat.
10.3.2008 Já a PHP
Vedení odborných školení PHP, PHP 5, Bezpečnost, MySQL, JavaScript
7.3.2008 Ohlasy na školení JavaScript a AJAX

Vzhľadom na to, že som už mal s Javascriptom predtým isté krátke skúsenosti, časť informácií, hlavne tých v prvej polovici školenia mi už bola známa. Ale na druhej strane tam bolo vysvetlených veľa princípov, ktoré mi chýbali k pochopeniu niektorých javascriptových konštrukcií (vytváranie tried, rozdiely medzi poľom a objektom). Druhá polovica zameraná na AJAX bola veľmi náučná. V podstate som pochopil princípy spracovávania AJAXových dotazov a už som toho aj plne využil. Celkovo som so školením spokojný a teším sa na školenie o frameworkoch Javascriptu.

7.3.2008 Ohlasy na školení bezpečnosti

Školení bylo koncipováno přesně, jak jsem si představoval, že by mělo vypadat. Výklad byl podaný velice profesionálně, přesto naprosto srozumitelně. Rozdělení jednotlivých částí výkladu na „první teorie a v zápětí příklad“ bylo velice příjemné. Člověk nemusel pátrat v paměti, o čem jsme se to vlastně bavili před třemi hodinami. Počet účastníků (9) je akorát. Spousta času na dotazy a „rodinná atmosféra“. Celkový dojem je tedy více než kladný. Navíc se mi podařilo to, s čím jsem tam šel. Ucelení a prohloubení znalostí o bezpečnostních rizikách a k tomu postupy, jak jim předejít a jak je potlačit. Mohu tedy každému jedině doporučit.

7.3.2008 Ohlasy na školení bezpečnosti

Školení „Bezpečnost PHP aplikací“ v podání Jakuba Vrány je výborným shrnutím dané problematiky. Pojetí výkladu podléhá striktnímu rozvrhu – vysvětlení problému, vysvětlení ochrany, příklad. Jakubova jistota pramení z perfektních znalostí oboru, kvalita lektorské části je pak dána jeho zkušenostmi s pořádáním těchto školení i z akademické půdy. Ve spojení s diskusí na každé téma, s vyměňováním zkušeností jednotlivých přítomných vývojářů, se jedná o neocenitelně strávený den.

4.3.2008 Školení: JavaScript a AJAX
, {$cena_dph} Kč s DPH
a příklady
4.3.2008 Školení: Návrh a používání MySQL databáze
, {$cena_dph} Kč s DPH
a příklady
4.3.2008 Školení: Bezpečnost PHP aplikací
, {$cena_dph} Kč s DPH
a příklady
9.2.2008 Školení: Návrh a používání MySQL databáze

V první řadě je to školení Bezpečnost PHP aplikací, které už jednou proběhlo. Další termín je čtvrtek 22. 6. 2006, volných už je jen několik posledních míst.

Ve spolupráci se serverem Root.cz v pondělí 12. 6. 2006 školím Programování v PHP 5.

A do třetice se jedná o Návrh a používání MySQL databáze, které proběhne ve středu 21. 6. 2006.

1.2.2008 Zabraná paměť
a pod Linuxem s jádrem 2.6.20.4-grsec v PHP 5.2.0-8+etch7
podle Linuxu
3.1.2008 Neinicializované proměnné
Existence proměnné se dá zjistit kódem array_key_exists("a", get_defined_vars()).
2.1.2008 Nové operátory
Článek byl psán jako Silvestrovské povyražení a není tedy myšlen vážně.
20.12.2007 Ohlasy na školení MySQL

I když se programováním databází neživým a je to jen můj koníček, bylo pro mě vaše školení velkým přínosem, ujasnil jsem si spoustu věcí, které jsem buď nepoužíval, protože jsem jim moc nerozuměl, a nebo jsem je používal špatně. Vše bylo srozumitelným způspobem vysvětleno.

6.12.2007 Vytvoření přátelského URL
Pro spolehlivou funkčnost je potřeba nastavit proměnnou LC_CTYPE funkcí setlocale na kódování UTF-8, např. tedy cs_CZ.utf-8.
3.12.2007 Ohlasy na školení bezpečnosti
(V roce 2007 byla učebna vybavena novými monitory a klimatizací.)
(Řešení příkladů je součástí materiálů odesílaných účastníkům.)
(V roce 2007 byla učebna vybavena novými myšmi.)
(V roce 2007 byla učebna vybavena novými myšmi.)
20.11.2007 Ohlasy na školení bezpečnosti

Školení bylo perfektně připraveno. Ukázky jednotlivých možností útoku byly velmi dobře popsány a na jednoduchých a přehledných příkladech demonstrovány, samozřejmě včetně popsání možností, jak se těmto útokům bránit. Školení mohu určitě doporučit.

Jsem velmi rád, že jsem se nakonec rozhodl navštívit právě vaše školení. Přesvědčil jste mne nejen že jste v oboru opravdový odborník, ale především své znalosti dokážete velmi poutavou a srozumitelnou formou prodat. Není k ničemu přednáška od odborníka, na jejímž konci zjistíte, že jste vlastně vůbec ničemu nerozuměl. U vás tomu bylo přesně naopak, výklad jste měl odborný, přesto jste mu dokázal dát lidštější formu a to mi přesně sedělo. Za výbornou přednášku a nové znalosti mnohokrát děkuji. Jednu výtku bych tu přeci jen měl. Máte vůbec představu, jaké to je přijíždět k vám na kurz v blažené nevědomosti a odjíždět s pocitem hrůzy, kolik chyb po sobě budu muset opravit?

Problematika „Bezpečnost PHP aplikací“ je velmi aktuální a tvoří nezbytnou součást firemní IT strategie. Váš výklad byl založen především na praktických ukázkách chování systému při napadení útočníkem, což je u daného tématu nezbytné ke správnému pochopení postupů a snadnějšímu zapracování ochranných opatření při zabránění neoprávněným přístupům k citlivým informacím. Absolvoval jsem nespočetně kurzů, seminářů a školení, ale Váš přístup byl opravdu příkladný. Je zřejmé, že výuka je Vaší „profesí“, protože umíte informace podat. Seznámil jsem se i s Vaším blogem, který je velmi inspirativní a reaguje pružně na aktuální problémy LAMP. Budu i nadále sledovat nabídky Vašich kurzů a dožadovat se účasti, když už ne pro sebe, tak pro své kolegy.

16.11.2007 Ohlasy na školení MySQL

Velmi Vám děkuji za zaslané materiály i školení. Jako drobnému uživateli mi to uštetřilo mnoho času, který bych jinak strávil metodou pokus omyl a možná by mi některé zajímavé postřehy z Vašeho školení i tak zůstaly skryty.

16.11.2007 Ohlasy na školení JavaScript a AJAX

Školení na Javascript a AJAX bylo velmi dobré pro toho, kdo Javascript neznal nebo měl o něm základní znalosti a chtěl si je rozšířit. Problematika JS a Ajaxu je natolik široká, že ji nelze uspokojivě dát do jednoho dne. Moje znalosti JS jsou celkem dobré, ale zápasím s jednotlivými rozdíly v prohlížečích, proto se mi líbila část o tom, jak JS debugovat, to rozšířilo moje znalosti. Na Ajax nezbylo podle mě dost času a také nebyl čas si problematiku trochu více na vlastní kůži na semináři ošahat.

16.11.2007 Ohlasy na školení bezpečnosti

I přesto, že se v oblasti už nějaký ten pátek pohybuji, bylo pro mě toto školení přínosem hlavně kvůli čas/informační hodnota. Výborné shrnutí potřebných informací a osvěžení dřívejších znalostí + mnoho informací nových. Za těch pár korun je den skutečně plný užitečných informací. Škoda jen těch příšerných myší ve školící místostí...

S Vaším školením jsem byl velice spokojen. O většině typů útoků jsem již něco věděl, nicméně Vámi připravený výklad mi pomohl utřídit si své dosavadní znalosti a rozšířit obzor zejména v optimálním způsobu řešení předváděných problémů. Příjemnou věcí byla také sleva, kterou poskytujete studentům. Pokud budu moci, určitě se rád zúčastním dalších školení.

16.11.2007 Ohlasy na školení MySQL

Za školení bych měl děkovat já. Děkuji za materiály. Školení bylo fajn a přínosné. Pokud mám napsat nějaké shrnutí, tak mohu určitě říct: Vaše školení o MySQL, které je prezentované člověkem z praxe, bylo hodně kvalitní. Nešlo ani tak o prezentaci jako o to, že jsem měl možnost poslechnout si člověka z praxe a tak jsem pochopil spoustu věcí mnohem lépe. Školení nebyl jen výklad z nastudované knížky a to bylo rozhodně to, co mě na školení hodně potěšilo. Pokud mám něco kritizovat, tak asi cestu autem do Prahy a zpět do Brna :). Možná je trošku škoda, že jste se hodně věnoval zálohování a provozování vlastního serveru, když většina lidí využívá webhosting, třeba na úkor skládání dotazů.

5.10.2007 Školení: JavaScript a AJAX
Nabízím i firemní a individuální školení a konzultace, pro cenovou nabídku mne prosím kontaktujte.
5.10.2007 Školení: Návrh a používání MySQL databáze
Nabízím i školení ve firmě a individuální školení a konzultace, pro cenovou nabídku mne prosím kontaktujte.
5.10.2007 Školení: Bezpečnost PHP aplikací
a konzultace, pro cenovou nabídku mne prosím kontaktujte
5.10.2007 PhD
Pokud chcete vidět výslednou vygenerovanou dokumentaci, můžete použít zrcadlo docs.php.net, ideálně byste neměli poznat žádný rozdíl.
3.10.2007 Pozvánka na říjnová školení
pondělí 29. 10. 2007
19.9.2007 Ukládání citlivých informací
i pomocí funkcí PHP funkcí openssl_pkey_new a openssl_pkey_get_public
18.9.2007 Školení: JavaScript a AJAX
, 30% sleva pro studenty
18.9.2007 Školení: Návrh a používání MySQL databáze
, 20% sleva pro studenty
18.9.2007 Školení: Bezpečnost PHP aplikací
, 42% sleva pro studenty
4.9.2007 phpMinAdmin
Přehled uživatelů a práv s možností jejich nastavení
slovenská, holandská,
14.8.2007 Zabezpečení session proměnných
a i na lépe zabezpečeném serveru mohou kvůli chybě ve funkci glob získat alespoň Session ID (tato chyba je opravena v PHP 5.2.4)
13.8.2007 Unikátnost návštěvníka
Anketa by měla být zabezpečena také proti CSRF.
8.8.2007 Školení: JavaScript a AJAX
Školení je akreditováno v systému DVPP na MŠMT
8.8.2007 Školení: Návrh a používání MySQL databáze
Školení je akreditováno v systému DVPP na MŠMT
8.8.2007 Školení: Bezpečnost PHP aplikací
Školení je akreditováno v systému DVPP na MŠMT
6.8.2007 phpMinAdmin
XSS,
6.8.2007 Ohlasy na školení MySQL

I přes to, že má člověk v oblasti mnoho znalostí a zkušeností, školení mi umožnilo ta nejdůležitější témata znovu otevřít a s odborníkem je rozvést do důsledků. S ohledem na naši současnou práci jsem si tak ujasnil, co děláme dobře a kde je prostor pro zlepšení. Z vydařených školení vždy odcházím plný inspirace a motivace do další práce. Obě školení Jakuba Vrány jednoznačně patřila mezi ně.

6.8.2007 Ohlasy na školení bezpečnosti

I přes to, že má člověk v oblasti mnoho znalostí a zkušeností, školení mi umožnilo ta nejdůležitější témata znovu otevřít a s odborníkem je rozvést do důsledků. S ohledem na naši současnou práci jsem si tak ujasnil, co děláme dobře a kde je prostor pro zlepšení. Z vydařených školení vždy odcházím plný inspirace a motivace do další práce. Obě školení Jakuba Vrány jednoznačně patřila mezi ně.

27.7.2007 phpMinAdmin
Vytvoření, změna, smazání a vyhledávání podle indexů včetně fulltextových
18.7.2007 Ohlasy na školení bezpečnosti

Školení bylo velmi dobře připravené. Každá „hackerská“ technika byla probírána samostatně, u každé byl vysvětlený princip fungování následovaný výkladem, jak aplikaci proti takovému útoku ochránit. Některé techniky jsou notoricky známé, ale dozvěděli jsme se i o takových, nad kterými mnozí kroutili hlavami, protože je vůbec neznali. Vše jsme si vyzkoušeli i na připravených příkladech. Školení předčilo mé očekávání a hodnotím ho pro svou další práci jako opravdu hodně přínosné.

Srozumitelný výklad s přestávkami „tak akorát“. Pěkné. Výborné bylo i to malé cvičení na závěr, člověk si to tak nějak urovná v hlavě. Dále bych velmi pochválil pořadí jednotlivých témat. Osobně dávám hodnocení asi 90%, byl jsem velmi spokojen.

29.6.2007 Ohlasy na školení MySQL

I já bych Vám chtěl poděkovat. Školení bylo opět velmi kvalitní. Zajímalo mě především používání a navrhování indexů a to bylo vysvětleno velmi hezky a pochopitelně. Další velmi dobře vysvětlené téma byly transakce. Co se týče dalších témat, hodně jsem se těšil na řešení jazykových mutací, i když zřejmě nebudu postupovat stejně jako vy, byl jsem rád, že jste mi schválil můj způsob. Obecně bylo školení velmi dobře pojato. Já osobně bych v něm nemusel mít probírání klasických věcí jako INSERT, UPDATE, myslím tím takové ty jednoduché dotazy, které asi většina lidí běžně používá. Ale to je čistě můj subjektivní pohled.

Každopádně moc děkuji, jsem velmi rád, že jsem se tohoto školení mohl zúčastnit.

Jako pedagog dokážu skutečně ocenit náročnost takového kurzu.

I vzhledem k nízké časové dotaci školení proběhlo v avizovaném rozsahu a pro mě bylo jistě přínosem. Také po stránce didaktické jsem byl velmi velmi spokojen a kurz naprosto splnil moje očekávání. Jenom si neodpustím drobnou připomínku, která již, mám dojem, byla v některé z diskuzí avizována. Spíše by mi vyhovovalo opustit základy návrhu databáze a základní SQL příkazy a soustředit se více na druhou část školení (replikace, knihovna MySQLi, PDO, atd.). Případně by mi přišlo vhodnější rozdělit školení na dvě samostatná.

Jinak ještě jednou děkuji a těším se na další Vaše školení.

Příště je školení naplánováno na 27. 6. 2007, tentokrát se uskuteční v Brně.
29.6.2007 Ohlasy na školení JavaScript a AJAX
Příště je školení naplánováno na 25. 6. 2007, tentokrát se uskuteční v Brně.
28.6.2007 Ošetření chyb InnoDB
V MySQL 5.0.13 došlo ke změně chování – při timeoutu se už nezruší celá transakce, ale jen poslední příkaz. Skript jsem upravil tak, aby s tím počítal.
6.6.2007 Lokální psaní kódu
Lokální psaní kódu se uplatňuje také při vazbě HTML/JS a HTML/CSS. Obsluhu událostí píšu téměř výhradně přímo do HTML kódu (byť často spočívá jen v zavolání jedné funkce) – nemusím totiž prvku dávat ID a složitě se na něj z JavaScriptu odkazovat a snadněji se pracuje s objektem event. Na druhou stranu veškeré styly obvykle uvádím do externího souboru a přiřazování ID mi nevadí – jsem rád, že mám všechny styly pohromadě a mohu je snadno změnit. Možná to je dáno také tím, že v CSS se na ID odkazuje pomocí # a v JavaScriptu přes 27× delší document.getElementById('').
1.6.2007 Symetrické vazby
při vytvoření pohledu to je ale zbytečná práce navíc díky čemuž se nemůže stát, že by v tabulce byla stejná vazba dvakrát. Pohled nám tyto řádky sice sjednotí do jednoho, ovšem pouze za předpokladu, že v tabulce není další sloupec s různou hodnotou v jednotlivých řádcích. Pro zajištění konzistence tedy můžeme použít trigger:
30.5.2007 Statické proměnné
V JavaScriptu statické proměnné nejsou, ale lze si pomoci touto kontrukcí:
28.5.2007 Maximální délka GROUP_CONCAT
Zdá se, že nastavení této proměnné na hodnotu -1 limit odstraní zcela, ale v dokumentaci jsem tuto informaci nenašel.
28.5.2007 Zpracování ikon
Obrázek vrácený funkcí imagecreatefromico můžeme třeba funkcí imagepng uložit do souboru nebo poslat prohlížeči.
22.5.2007 Spouštění programů v PHP 6
Direktiva v PHP 6 možná zůstane.
22.5.2007 Vývoj PHP 6
syntaxe <% naopak bude spolu s direktivou asp_tags odstraněna,
18.5.2007 Náhrada za funkci glob
Mimo Windows lze pro porovnání použít funkci fnmatch.
17.5.2007 SQL typ ENUM
Do každého sloupce typu ENUM lze uložit prázdný řetězec, kterému odpovídá číslo 0. Ten se použije také při pokusu o uložení neplatné hodnoty.
14.5.2007 Velikost nahrávaných souborů
Pokud se data chystáte ukládat do databáze, je nutné nastavit ještě proměnnou max_allowed_packet (výchozí hodnota je 1 MB).
14.5.2007 Ukládání datumů v databázi
datumu kalendářního data
9.5.2007 Konec v regulárním výrazu
nebo použitím \z místo $
7.5.2007 Vyjmutí parametru z URL
Pokud této funkci chceme předat všechny parametry kromě jednoho, můžeme použít array_diff_assoc($_GET, array("page" => $_GET["page"])).
4.5.2007 Chyba v procházení polí
sáhnout do vlastního kódu
3.5.2007 Ohlasy na školení bezpečnosti

Pokud jde o shrnutí dojmů ze školení, tak jsem spokojen. Dozvěděl jsem se řadu užitečných informací, o které jsem měl zájem. Jen mi přišlo, že probrat všechna zvolená témata v jednom dni vyvolalo zejména ke konci určitou časovou tíseň, kvůli které se posledním tématům nedostalo pozornosti, jakou by si možná zasloužila, a i prostor pro diskusi mohl být trochu větší.

16.3.2007 Šablony
Upravenou verzi lze stáhnout ze SourceForge.
13.3.2007 Školení: Návrh a používání MySQL databáze
Zadané údaje budou použity pro vystavení faktury.
13.3.2007 Školení: Bezpečnost PHP aplikací
Zadané údaje budou použity pro vystavení faktury.
8.3.2007 Školení: Návrh a používání MySQL databáze
oběd,
8.3.2007 Školení: Bezpečnost PHP aplikací
oběd,
15.2.2007 Replikace
Protože čekání na synchronizaci může trvat dlouho, dá se na základě příkazu SHOW SLAVE STATUS a jeho položek Master_Log_File a Exec_Master_Log_Pos rozhodnout o tom, zda se následující SELECT má provést na slave nebo na master serveru.
12.2.2007 Uložení jazykových verzí
30 64
30 64
7.2.2007 Speciální znaky v názvech externích proměnných
, neuzavřené [
2.2.2007 E-mailový formulář
Hlavičky e-mailů je nutné zakódovat zvlášť.
30.1.2007 Verze PHP v ČR
Stejný průzkum z ledna 2007
29.1.2007 Konfigurace PHP
7 6135
24.1.2007 Verze PHP v ČR – květen 2006
+18 %
18.12.2006 Bezpečné přihlašování uživatelů
Od PHP 5.1.2 lze použít také funkci hash_hmac.
12.12.2006 PDO a další novinky v PHP 5.1
Konstanta odkazuje na první znak za koncem příkazu, který obvykle ukončuje středník, takže by data musela začínat ještě na stejném řádku. Využít se dá toho, že příkaz lze ukončit i značkou ?> a volitelným koncem řádku.
5.12.2006 Persistentní připojení
V některých případech může být nebezpečné také to, že připojení zdědí i nastavení MySQL proměnných a vytvořené dočasné tabulky.
4.12.2006 Ukázka použití indexů
DESC
(sloupec id musí být setříděn ve stejném pořadí jako publikovano – pokud bychom použili publikovano DESC, id, tak se index (publikovano DESC, id) nepoužije, protože MySQL ho vytvoří jako (publikovano, id) a s rozdílem v řazení si neporadí)
1.12.2006 Opera mi nesedla
.com .cz
vyhledávače – pouze přes search.ini, neexistuje funkce K vyhledávání přiřadit klíčové slovo Řeší novější verze
zatuhne při registrování jako výchozí prohlížeč
po čase odebírá 80% CPU
28.11.2006 REPLACE
Pokud ke konfliktu unikátního klíče nedojde, vrátí mysql_affected_rows jedničku, jinak dvojku.
24.11.2006 Poddotaz při UPDATE na stejné tabulce
SEPARATOR '|'
id RLIKE CONCAT('^(', @a, ')$') FIND_IN_SET(id, @a)
Operátor RLIKE sice nebude nejrychlejší, ale pro jednorázové operace to nevadí.
SEPARATOR '|'
Při spojování více tabulek se dá použít také syntaxe DELETE tab FROM tab, tab2 WHERE tab.id = tab2.id.
21.11.2006 Ohlasy na školení bezpečnosti

Přestože jsem se již bezpečností PHP aplikací dříve zabýval, bylo pro mě toto školení rozhodně přínosné. Zkonzultoval jsem s lektorem i ostatními posluchači dosavadní zkušenosti a načerpal nové znalosti. Také kladně hodnotím, že se nejednalo pouze o výklad, ale rovnou jsme měli možnost zkusit si některé praktiky na příkladech. Byly připraveny virtuální servery pro jednotlivé posluchače, takže jsme si mohli všichni hackovat své vlastní výtvory. Samozřejmě si člověk nemůže všechno pamatovat a už vůbec si nemůže stihnout všechno poznamenat, takže bylo super, že jsme dostali veškeré materiály v elektronické podobě a v budoucnu se k nim můžeme vrátit.

Jediným nedostatkem bylo vybavení učebny. Staré „kuličkové“ myši bylo docela obtížné přemluvit ke spolupráci, ale lektor přislíbil, že se pokusí o nápravu. Softwarové vybavení (nenainstalován nějaký „normální“ browser a editor) se dalo naštěstí na místě napravit.

Na závěr školení po nás chtěl lektor vytvořit aplikaci pro registraci uživatelů do MySQL a odeslání upozornění emailem. Cílem samozřejmě bylo na vlastním kódu odhalit nedostatky. To je samo o sobě dobrý nápad, ale komu se s tím chce psát, když už to má několikrát hotové a vychytané, že? Kdybych to věděl předem, tak bych si s sebou na „flešce“ vzal všechny svoje skriptíky a bylo by to raz dva.

Školení rozhodně doporučuji jak začátečníkům tak zkušenějším kodérům. Určitě nebudete litovat.

20.11.2006 Vkládání souborů
(od PHP 5.2.0 allow_url_include)
13.11.2006 Ohlasy na školení bezpečnosti

Ráda bych Vám ještě jednou jménem svým i jménem mých kolegů poděkovala za Váš skvělý výklad, který nám přinesl nové poznatky a pohledy, které určitě využijeme ve své další práci.

7.11.2006 E-mailový formulář
(zprávy by však neměly mít na žádném řádku více než 1000 bajtů, takže se může hodit funkce wordwrap)
1.11.2006 Vyhledávání OpenSearch
integrace tak těsná není, uživatel o přítomnosti vyhledávání OpenSearch není nijak informován a musí ho se server ve vyhledávacím poli rovněž zobrazí, kromě toho lze server stejně jako v Internet Exploreru 7 také
11.10.2006 Bezpečnost webového serveru
omezit
20.9.2006 Ohlasy na školení bezpečnosti
, 2 M Studio
, HST Fidler
, JSC Travel
18.9.2006 Syndikace diskusí
Viz také Ochrana formulářů proti spamu.
14.8.2006 Cross-Site Request Forgery
Pokud navíc z administračního rozhraní vedou odkazy na neprověřené externí stránky, je potřeba z nich Referer odfiltrovat, protože pokud na externí stránce bude přesměrování hlavičkou Location, předá se původní Referer a kontrola tedy projde.
Tato direktiva ale kontroluje jakoukoliv část URL, takže ji může útočník snadno obalamutit.
23.6.2006 Ohlasy na školení MySQL

Chtěl bych Vám moc poděkovat za Vaše školení. Rozhodně nemůžu opomenout užitečnost školení MySQL, které mi trošku rozšířilo obzory v nových možnostech verze 5.0 a zároveň bylo i vhodným doplňkem bezpečnostního školení.

23.6.2006 Ohlasy na školení bezpečnosti

Chtěl bych Vám moc poděkovat za Vaše školení. Zejména pak školení Bezpečnost PHP aplikací pro mě bylo velmi přínosné a chvílemi mě jímala hrůza, co jsem kde zanedbal (Cross-site Request Forgery a Response Splitting), ale alespoň o těchto možných útocích vím a budu pracovat na řešení problému (a pro příště na ně budu myslet dopředu a nebudu pak muset pracně zpětně upravovat aplikace). Navíc jsem se dozvěděl i několik dalších zajímavých „drobností“, které jsem ještě nemusel řešit, ale na které je dobré pamatovat již při vytváření aplikací, čímž mi školení jistě do budoucna ušetřilo spoustu času.

6.6.2006 Volby 2006
Pětiprocentní hranice
26.5.2006 Verze PHP v ČR
Stejný průzkum z května 2006
23.5.2006 Zobrazení pošty na webu
Pokud se změní hodnota uidvalidity, tak došlo ke změně identifikátorů zprávy a bude nutné je zaindexovat znovu.
5.5.2006 Kontrola e-mailové adresy
(opraveno)
2.5.2006 Ohlasy na školení bezpečnosti

Vaše školení mělo velmi dobrou úroveň a doporučil bych ho všem, kteří nemají velké povědomí o možnostech útoků na PHP aplikace. Sám jsem o mnoha útocích již věděl (také hlavně díky Vašemu blogu), nicméně jsem se dozvěděl i nové informace z této oblasti. Velké plus školení jako takových je možnost rozboru konkrétních problémů/útoků. Zkrátka jsem rád, že jsem ho absolvoval.

28.4.2006 Bezpečné přihlašování uživatelů
Pro výpočet HMAC lze použít také balíček Crypt_HMAC.
28.4.2006 Vzájemné propojení souborů
Pokud má vložený soubor navíc za určitých okolností pouze provést přesměrování (např. při odeslání formuláře), je nutné to řešit buď pozdržením výstupu nebo odděleně už v hlavním souboru.
28.4.2006 Školení: Programování v PHP 5
Viz také Ohlasy na školení.
28.4.2006 Školení: Úvod do PHP
Viz také Ohlasy na školení.
28.4.2006 Školení: Bezpečnost PHP aplikací
Viz také Ohlasy na školení.
13.4.2006 Bezpečné přihlašování uživatelů
Posílání výzev ze souvislé řady má kromě již zmíněné možnosti zjištění počtu zobrazení přihlašovacího formuláře ještě jednu nevýhodu – skript se může stát obětí útoku DoS. Pokud tomu chceme zabránit a nechceme si navždy pamatovat všechny náhodně vygenerované výzvy, můžeme výzvu ukládat do session proměnné.
12.4.2006 Bezpečné přihlašování uživatelů

Doplnění

Jak správně poznamenali čtenáři v diskusi, je tato technika velice citlivá na bezpečnost dat uložených v databázi. Proto nabízím její vylepšení:

  1. U každého uživatele bude uložen login, challenge a md5(hmac_md5(password, challenge)).
  2. Při přihlašování se AJAXem zjistí, jaký challenge uživatel naposledy použil, a pošle se hmac_md5(password, old_challenge) a md5(hmac_md5(password, new_challenge)).
  3. Na serveru se navíc ověří, jestli md5(old_hmac) souhlasí s tím, co je uloženo v databázi, a pokud ano, přepíše se to novými hodnotami.

Autorem této myšlenky je Paul Jonhston. Přikládám Proof of Concept.

12.4.2006 Přihlašování uživatelů
Viz také: Bezpečné přihlašování uživatelů.
12.4.2006 Bezpečné přihlašování uživatelů
Místo pack("H*", md5($s)) lze v PHP 5 použít md5($s, true).
4.4.2006 IT Underground
Presentation is available also in PHP Presentation format.
3.4.2006 Formáty obrázků
Viz také: Zmenšování obrázků.
31.3.2006 Výpis dat ze závislých tabulek
vkládání HTML kódu do SQL příkazu ale příliš míchá aplikační a prezentační logiku, proto bych takovéto složitější formátování ve většině případů spíše nedoporučoval
13.3.2006 Ukládání souborů od uživatele
např. funkcí mime_content_type
nebo mime_content_type
22.2.2006 Hudzilla PHP Exam – řešení
nealfanumerického
22.2.2006 Oddělovač v regulárních výrazech
Od PHP 4.0.4 jdou používat i oddělovače v podobě závorek (), {}, [] nebo <>. Jejich výhoda spočívá v tom, že je uvnitř výrazu můžeme použít bez jakéhokoliv ošetřování, nevýhoda zase v tom, že jako oddělovač nejsou moc výrazné.
22.2.2006 Výpis ladících informací
Funkce debug_zval_dump navíc informuje o počtu referencí.
22.2.2006 Ukládání souborů od uživatele
Funkce move_uploaded_file je použita proto, že u prvního parametru na rozdíl od rename nekontroluje open_basedir. Na správně zabezpečeném serveru je ale stejně vhodné umístit upload_tmp_dir pro každého uživatele dovnitř jeho open_basedir.
16.2.2006 Ukládání hesel
Při změně hesla je vždy vhodné požadovat i heslo původní. Tím zabráníme tomu, že přihlášenému uživateli během jeho chvilkové nepřítomnosti u počítače někdo změní heslo a tím získá k aplikaci pohodlný přístup.
13.2.2006 HTTP metody GET a POST
Pokud používáte sessions spolu s jejich transparentním předáváním, je vhodné na konec URL přidat "?" . SID. V konstantě SID je uložen řetězec potřebný pro předání session identifikátoru, v případě existence session cookie je prázdný.
27.1.2006 Vypnutí magic_quotes_gpc
Ošetřené jsou i klíče polí, takže se nesmí zapomenout ani na ně.
27.1.2006 Sekvence v MySQL
a sloupec id musí mít příznak AUTO_INCREMENT
23.1.2006 Obrana proti SQL Injection
Chris Shiflett uvádí, jak se dá při použití některých vícebajtových znakových sad (např. UTF-8 se to netýká) ochrana slashováním obejít, Ilia Alshanetsky navíc dodává, že možnost stejného zneužití se týká i funkce mysql_real_escape_string. V našich zeměpisných šířkách se jedná spíše o teoretickou hrozbu, je to ale hezký příklad toho, že si člověk nemůže být nikdy ničím jistý.
23.1.2006 PDO a další novinky v PHP 5.1
Při exportu objektů je nyní volána magická metoda __set_state.
22.12.2005 Kontrola chyb
Pokud navíc ve funkci dojde k chybě, tak se dozvíme název souboru a číslo řádku s definicí funkce a ne místo, odkud byla volána. Toto místo můžeme zjistit např. funkcí debug_backtrace.
14.12.2005 Konfigurace PHP
Databázi Sybase nepoužívám, takže stojím i o escapování zpětného lomítka.
windows-1250 utf-8
12.12.2005 Výběr kódování znaků
Neaktuální verze MySQL je i důvod, proč je tento blog publikován ve Windows-1250 a ne v UTF-8.
16.11.2005 Runkit
nedá použít při zapnuté direktivě runkit.internal_override dá použít i
11.11.2005 MySQL 4.1 – kódování
Viz též: Převod kódování MySQL.
10.11.2005 Opera mi nesedla
Čtenáři mi v diskusi poradili, jak vyřešit problémy 10, 11 a 14.
2.11.2005 Vkládání souborů 2
Psal jsem i o životu nebezpečném vkládání neošetřených souborů. Kdekdo si myslí, že vypnutí direktivy allow_url_fopen (od PHP 5.2.0 allow_url_include)
2.11.2005 Editor SciTE
Při psaní textu jsou lidé často svázáni logickými bloky – když je v textu <a href="|"> kurzor na místě znaku | a má se doplnit atribut title="", většina lidí nejprve přejde o znak doprava a atribut doplní. Já místo toho přímo vložím " title=". Tento trik se dá použít i u běžných textů – začíná-li věta slovem Souhlas a má se nahradit za Samozřejmý souhlas, není nutné dopsat Samozřejmý a nahradit velké S za malé, stačí na správné místo dopsat amozřejmý s. Zdá se to jako hloupost, ale při rutinním používání to trochu vzácného času ušetří.
31.10.2005 Inicializace proměnných
Smutné je, že na nesprávně inicializované pole nás neupozorní ani E_NOTICE.
26.10.2005 Skrytí zdrojového kódu
Komerční nástroj firmy ionCube.
Nástroj vyvíjený jako optimalizátor umožňuje i zpracování zakódovaných souborů.
25.10.2005 REPLACE
Přípomínám, že opačný postup u tradičního řešení (INSERT až po vyzkoušení UPDATE) by mohl vést k neuložení záznamu a testování pomocí SELECT by vedlo k nutnosti zamknout tabulku.
V MySQL 4.1 byl představen modifikátor ON DUPLICATE KEY UPDATE příkazu INSERT, který je příkazu REPLACE podobný, ale nemá tak destruktivní účinky. Přesně tento příkaz se hodí pro aktualizaci čtenosti:
20.10.2005 Vkládání souborů
./ nebo
Doplnění
19.10.2005 Uložení jazykových verzí
Někdy se také může stát, že některá jazyková verze není k dispozici kompletní. Pokud chceme mít co nejjednodušší a nejrychlejší dotazy pro získání dat, je možné do nepřeložených sloupců ukládat verzi, která je k dispozici vždy (např. anglickou). Je ale potřeba dát pozor na aktualizace – při úpravě záchranné jazykové verze je potřeba změnit i verze na ní závislé. Druhá nevýhoda spočívá v tom, že není poznat, které texty už přeložené jsou a které ne – na základě shody to možné není, protože některé texty mohou mít stejný překlad do různých jazyků. Vyřešit to lze např. přidáním speciálního znaku na konec nepřeložených textů a jeho odstraňováním při výpisu, to ale není právě nejčistší způsob. Třetí nevýhoda spočívá ve větších diskových nárocích, ta je ale nahrazena rychlejším získáváním dat. V řadě případů proto asi bude lepší místo nepřeložených textů ukládat NULL a záchrannou verzi načítat až při získávání dat:
14.10.2005 Práce s čísly
(funkce is_numeric ale akceptuje i znaménko, desetinnou tečku, exponent a hexadecimální zápis)
7.10.2005 Verze HTML
Pozor ale např. na to, že Google Cache na začátek stránky přidá hlavičky, které kompatibilní režim vždy zapnou, a stránka se tak může zobrazit jinak.
7.10.2005 Brainfuck
\0 prázdným řetězcem
4.10.2005 Verze pro tisk
Pokud má být na stránce odkaz na tisk při použití tiskového stylu (realizovaný zmiňovanou metodou), je vhodné ho také vypsat JavaScriptem, protože jinak se sice zobrazí, ale nebude funkční.
30.9.2005 Inicializace proměnných
Stejně důležité je i správně inicializovat pole, jak názorně ukazuje colder.
30.9.2005 Optimalizace kódu
Stejný autor také doporučuje používat include "./file.php" místo include "file.php". Já bych to spíš doporučil kvůli zamezení kolizí se soubory v ostatních adresářích include_path.
20.9.2005 Získání počtu řádek
SQL server se připraví na to, že bude vracet všechna data z tabulky a připraví si na to potřebné struktury se všechna data přenesou z databázového serveru a PHP je uloží do paměti
Funkci mysql_num_rows je vhodné použít i v případě, kdy chceme zjistit, zda dotaz vůbec něco vrátil:
16.9.2005 Bezpečnost webového serveru
(a pokud mají na server přístup i běžní uživatelé, tak samozřejmě i pro ně)
7.9.2005 Kontrola XML podle DTD
lze ke stejnému účelu použít funkci domxml_open_file s parametrem DOMXML_LOAD_VALIDATING. by to tak jednoduché nebylo, ve starém rozšíření DOM XML obdobná metoda dostupná pokud vím není a bylo by potřeba hledat jinde.
31.8.2005 Escapování
Zkrácení řetězce může mít závažné důsledky, pokud k němu dojde uprostřed HTML entity – v extrémním případě to může vést až k nezobrazení celé stránky.
31.8.2005 Výběr kódování znaků
Pokud by se někdo pokusil např. do padesátibajtového sloupce vložit padesátiznakový UTF-8 řetězec s diakritikou (nebo i o něco kratší s hodně speciálními znaky), tak se tento řetězec pochopitelně ořízne. Pokud by se navíc ořízl uprostřed bajtů tvořících jeden znak, mohl by při výstupu dokonce způsobit nevaliditu dokumentu.
30.8.2005 Šablony
Další velkou výhodou šablonovacích systémů je to, že pokud neřeknete jinak, tak jsou všechna vypisovaná data automaticky escapovaná, takže nehrozí nebezpečí XSS.
HTMLTmpl jsem si předělal tak, že do cache ukládá přímo nativní PHP kód.
11.8.2005 Odkazy na adresáře
V PHP 5 je k dispozici také funkce get_headers.
8.7.2005 PHP-cli
- k tomu se dá použít přepínač -a, který spustí interaktivní režim
29.6.2005 Ošetření délky zadávaných řetězců
Pokud se text rozhodnete zkrátit např. funkcí substr, je nezbytné to provést na řetězci neošetřeném direktivou magic_quotes_gpc. Kód substr($_POST["jmeno"], 0, 10) totiž s touto direktivou např. pro řetězec František' vrátí František\ a bezpečnostní problém je na světě.
21.6.2005 Zkrácení textu s XHTML značkami
V případě zpracování textu v kódování UTF-8 je možné ve větvi default použít zakomentovaný kód, který přeskočí vícebajtové znaky.
17.6.2005 Kontrola pravopisu v HTML dokumentu
, funkce chr_utf8 potom vrací reprezentaci těchto znaků v kódování UTF-8
16.6.2005 PHP Internals
Cris přišel s řešením, jak funkci ifsetor implementovat v user-landu:
Tato funkce má dvě drobné nevýhody: pokud je druhý parametr volání funkce, zavolá se tato funkce, ať je proměnná nastavená nebo ne, a předávaný parametr (v ukázce $_GET["var"]), který nebyl v době volání nastaven, bude mít po zavolání funkce hodnotu null. Myslím, že když o těchto nedostatcích člověk ví, dá se s nimi žít.
15.6.2005 Obrana proti SQL Injection
(což je schopnost uživatele modifikovat SQL dotaz pomocí předaných dat)
8.6.2005 MySQL 4.1 – kódování
SET NAMES SET CHARACTER SET
8.6.2005 Vzájemné propojení souborů
Pokud je v Apache zapnutá direktiva AcceptPathInfo (defaultně je), může útočník požádat o kontakt.php/index.php a uvedenou kontrolu tím obalamutí.
1.5.2005 Uchování informace o jazykové verzi a přihlášenosti
Z toho důvodu je vhodné neměnit hodnotu konfigurační direktivy session.name (např. funkcí session_name) a nechat ji nastavenou na PHPSESSID, protože chytré vyhledávače (např. Google) hodnotu tohoto parametru ignorují. Většina vyhledávačů se naštěstí snad již naučila ignorovat Session ID používané PHP, takže máme o starost méně.
13.4.2005 Ukládání hesel
seal salt
15.3.2005 Persistentní připojení
pro každý proces
7.3.2005 Konfigurace PHP
Kód je přehlednější, je to také část obrany před problémy vzniklými neinicializací proměnných.
Jedna z možností obrany před SQL Injection.
Soubory načítané z disku nebo z jiných zdrojů se málokdy ukládají do databáze, proto je jejich automatické escapování na škodu.
Člověk bez povědomí o PHP ale se znalostí XML lépe pochopí, k čemu se kód vztahuje, za určitých okolností může být soubor s PHP kódem díky respektování této direktivy validním XML dokumentem.
Umožňuje snadno odhalovat chyby v SQL dotazech.
Klientům je více než vhodné posílat informaci o tom, v jakém kódování dokument je.
Je dobré být informován o všech chybách, ale nemám rád kontraproduktivní E_NOTICE.
Když už použiji proměnnou $_REQUEST, je dobré vědět, v jakém pořadí tam proměnné budou, tato direktiva také určuje, které superglobální proměnné budou k dispozici.
avatar © 2005-2018 Jakub Vrána. Publikované texty můžete přetiskovat pouze se svolením autora. Ukázky kódu smíte používat s uvedením autora a URL tohoto webu bez dalších omezení Creative Commons. Můžeme si tykat. Skripty předpokládají nastavení: magic_quotes_gpc=Off, magic_quotes_runtime=Off, error_reporting=E_ALL & ~E_NOTICE a očekávají předchozí zavolání mysql_set_charset. Skripty by měly být funkční v PHP >= 4.3 a PHP >= 5.0.